// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: lab/peripherals.proto

package lab

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// Next Tag: 3
type CameraType int32

const (
	CameraType_CAMERA_INVALID CameraType = 0
	// camera Huddly GO
	CameraType_CAMERA_HUDDLY CameraType = 1
	// camera Logitech PTZ Pro 2
	CameraType_CAMERA_PTZPRO2 CameraType = 2
)

// Enum value maps for CameraType.
var (
	CameraType_name = map[int32]string{
		0: "CAMERA_INVALID",
		1: "CAMERA_HUDDLY",
		2: "CAMERA_PTZPRO2",
	}
	CameraType_value = map[string]int32{
		"CAMERA_INVALID": 0,
		"CAMERA_HUDDLY":  1,
		"CAMERA_PTZPRO2": 2,
	}
)

func (x CameraType) Enum() *CameraType {
	p := new(CameraType)
	*p = x
	return p
}

func (x CameraType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (CameraType) Descriptor() protoreflect.EnumDescriptor {
	return file_lab_peripherals_proto_enumTypes[0].Descriptor()
}

func (CameraType) Type() protoreflect.EnumType {
	return &file_lab_peripherals_proto_enumTypes[0]
}

func (x CameraType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use CameraType.Descriptor instead.
func (CameraType) EnumDescriptor() ([]byte, []int) {
	return file_lab_peripherals_proto_rawDescGZIP(), []int{0}
}

type CableType int32

const (
	CableType_CABLE_INVALID     CableType = 0
	CableType_CABLE_AUDIOJACK   CableType = 1
	CableType_CABLE_USBAUDIO    CableType = 2
	CableType_CABLE_USBPRINTING CableType = 3
	CableType_CABLE_HDMIAUDIO   CableType = 4
)

// Enum value maps for CableType.
var (
	CableType_name = map[int32]string{
		0: "CABLE_INVALID",
		1: "CABLE_AUDIOJACK",
		2: "CABLE_USBAUDIO",
		3: "CABLE_USBPRINTING",
		4: "CABLE_HDMIAUDIO",
	}
	CableType_value = map[string]int32{
		"CABLE_INVALID":     0,
		"CABLE_AUDIOJACK":   1,
		"CABLE_USBAUDIO":    2,
		"CABLE_USBPRINTING": 3,
		"CABLE_HDMIAUDIO":   4,
	}
)

func (x CableType) Enum() *CableType {
	p := new(CableType)
	*p = x
	return p
}

func (x CableType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (CableType) Descriptor() protoreflect.EnumDescriptor {
	return file_lab_peripherals_proto_enumTypes[1].Descriptor()
}

func (CableType) Type() protoreflect.EnumType {
	return &file_lab_peripherals_proto_enumTypes[1]
}

func (x CableType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use CableType.Descriptor instead.
func (CableType) EnumDescriptor() ([]byte, []int) {
	return file_lab_peripherals_proto_rawDescGZIP(), []int{1}
}

// DUT's WiFi antenna's connection.
// Next Tag: 3
type Wifi_AntennaConnection int32

const (
	Wifi_CONN_UNKNOWN Wifi_AntennaConnection = 0
	// WIFI antenna is connected conductively.
	Wifi_CONN_CONDUCTIVE Wifi_AntennaConnection = 1
	// WIFI antenna is connected over-the-air.
	Wifi_CONN_OTA Wifi_AntennaConnection = 2
)

// Enum value maps for Wifi_AntennaConnection.
var (
	Wifi_AntennaConnection_name = map[int32]string{
		0: "CONN_UNKNOWN",
		1: "CONN_CONDUCTIVE",
		2: "CONN_OTA",
	}
	Wifi_AntennaConnection_value = map[string]int32{
		"CONN_UNKNOWN":    0,
		"CONN_CONDUCTIVE": 1,
		"CONN_OTA":        2,
	}
)

func (x Wifi_AntennaConnection) Enum() *Wifi_AntennaConnection {
	p := new(Wifi_AntennaConnection)
	*p = x
	return p
}

func (x Wifi_AntennaConnection) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (Wifi_AntennaConnection) Descriptor() protoreflect.EnumDescriptor {
	return file_lab_peripherals_proto_enumTypes[2].Descriptor()
}

func (Wifi_AntennaConnection) Type() protoreflect.EnumType {
	return &file_lab_peripherals_proto_enumTypes[2]
}

func (x Wifi_AntennaConnection) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use Wifi_AntennaConnection.Descriptor instead.
func (Wifi_AntennaConnection) EnumDescriptor() ([]byte, []int) {
	return file_lab_peripherals_proto_rawDescGZIP(), []int{5, 0}
}

type Wifi_Router int32

const (
	Wifi_ROUTER_UNSPECIFIED Wifi_Router = 0
	Wifi_ROUTER_802_11AX    Wifi_Router = 1
)

// Enum value maps for Wifi_Router.
var (
	Wifi_Router_name = map[int32]string{
		0: "ROUTER_UNSPECIFIED",
		1: "ROUTER_802_11AX",
	}
	Wifi_Router_value = map[string]int32{
		"ROUTER_UNSPECIFIED": 0,
		"ROUTER_802_11AX":    1,
	}
)

func (x Wifi_Router) Enum() *Wifi_Router {
	p := new(Wifi_Router)
	*p = x
	return p
}

func (x Wifi_Router) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (Wifi_Router) Descriptor() protoreflect.EnumDescriptor {
	return file_lab_peripherals_proto_enumTypes[3].Descriptor()
}

func (Wifi_Router) Type() protoreflect.EnumType {
	return &file_lab_peripherals_proto_enumTypes[3]
}

func (x Wifi_Router) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use Wifi_Router.Descriptor instead.
func (Wifi_Router) EnumDescriptor() ([]byte, []int) {
	return file_lab_peripherals_proto_rawDescGZIP(), []int{5, 1}
}

// Facing of DUT's camera to be tested whose FOV should cover chart tablet's screen.
// Next Tag: 3
type Camerabox_Facing int32

const (
	Camerabox_FACING_UNKNOWN Camerabox_Facing = 0
	// DUT's back camera is facing to chart tablet.
	Camerabox_FACING_BACK Camerabox_Facing = 1
	// DUT's front camera is facing to chart tablet.
	Camerabox_FACING_FRONT Camerabox_Facing = 2
)

// Enum value maps for Camerabox_Facing.
var (
	Camerabox_Facing_name = map[int32]string{
		0: "FACING_UNKNOWN",
		1: "FACING_BACK",
		2: "FACING_FRONT",
	}
	Camerabox_Facing_value = map[string]int32{
		"FACING_UNKNOWN": 0,
		"FACING_BACK":    1,
		"FACING_FRONT":   2,
	}
)

func (x Camerabox_Facing) Enum() *Camerabox_Facing {
	p := new(Camerabox_Facing)
	*p = x
	return p
}

func (x Camerabox_Facing) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (Camerabox_Facing) Descriptor() protoreflect.EnumDescriptor {
	return file_lab_peripherals_proto_enumTypes[4].Descriptor()
}

func (Camerabox_Facing) Type() protoreflect.EnumType {
	return &file_lab_peripherals_proto_enumTypes[4]
}

func (x Camerabox_Facing) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use Camerabox_Facing.Descriptor instead.
func (Camerabox_Facing) EnumDescriptor() ([]byte, []int) {
	return file_lab_peripherals_proto_rawDescGZIP(), []int{7, 0}
}

// Light provision of camerabox, if LED is present or not.
// Next Tag: 3
type Camerabox_Light int32

const (
	Camerabox_LIGHT_UNKNOWN Camerabox_Light = 0
	// Camerabox has LED light provisioned.
	Camerabox_LIGHT_LED Camerabox_Light = 1
	// Camerabox do not have LED light provision.
	Camerabox_LIGHT_NOLED Camerabox_Light = 2
)

// Enum value maps for Camerabox_Light.
var (
	Camerabox_Light_name = map[int32]string{
		0: "LIGHT_UNKNOWN",
		1: "LIGHT_LED",
		2: "LIGHT_NOLED",
	}
	Camerabox_Light_value = map[string]int32{
		"LIGHT_UNKNOWN": 0,
		"LIGHT_LED":     1,
		"LIGHT_NOLED":   2,
	}
)

func (x Camerabox_Light) Enum() *Camerabox_Light {
	p := new(Camerabox_Light)
	*p = x
	return p
}

func (x Camerabox_Light) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (Camerabox_Light) Descriptor() protoreflect.EnumDescriptor {
	return file_lab_peripherals_proto_enumTypes[5].Descriptor()
}

func (Camerabox_Light) Type() protoreflect.EnumType {
	return &file_lab_peripherals_proto_enumTypes[5]
}

func (x Camerabox_Light) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use Camerabox_Light.Descriptor instead.
func (Camerabox_Light) EnumDescriptor() ([]byte, []int) {
	return file_lab_peripherals_proto_rawDescGZIP(), []int{7, 1}
}

// Peripherals of device. Next Tag: 14
type Peripherals struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Servo     *Servo     `protobuf:"bytes,1,opt,name=servo,proto3" json:"servo,omitempty"`
	Chameleon *Chameleon `protobuf:"bytes,2,opt,name=chameleon,proto3" json:"chameleon,omitempty"`
	Rpm       *RPM       `protobuf:"bytes,3,opt,name=rpm,proto3" json:"rpm,omitempty"`
	// refer to cameras that connected to the device.
	ConnectedCamera []*Camera `protobuf:"bytes,4,rep,name=connected_camera,json=connectedCamera,proto3" json:"connected_camera,omitempty"`
	Audio           *Audio    `protobuf:"bytes,5,opt,name=audio,proto3" json:"audio,omitempty"`
	Wifi            *Wifi     `protobuf:"bytes,6,opt,name=wifi,proto3" json:"wifi,omitempty"`
	Touch           *Touch    `protobuf:"bytes,7,opt,name=touch,proto3" json:"touch,omitempty"`
	// e.g: "att", "verizon",.. It's a manual label set by lab, varies dut by dut.
	Carrier string `protobuf:"bytes,8,opt,name=carrier,proto3" json:"carrier,omitempty"`
	// Indicate if the device is setup in a steady and controllable camera box environment for camera test automation.
	// http://go/cros-camera-box
	Camerabox bool `protobuf:"varint,9,opt,name=camerabox,proto3" json:"camerabox,omitempty"`
	// Indicate if the device is setup in a chaos environment. It's a special settings for running wifi interop tests.
	Chaos bool `protobuf:"varint,10,opt,name=chaos,proto3" json:"chaos,omitempty"`
	// Indicate the cables that connect audio, printer to the device in ACS lab.
	Cable []*Cable `protobuf:"bytes,11,rep,name=cable,proto3" json:"cable,omitempty"`
	// Incompatible upgraded type from bool camerabox=9.
	CameraboxInfo *Camerabox `protobuf:"bytes,12,opt,name=camerabox_info,json=cameraboxInfo,proto3" json:"camerabox_info,omitempty"`
	// Indicate if device is connected to a smart usb hub, detected in AdminRepair task.
	SmartUsbhub bool `protobuf:"varint,13,opt,name=smart_usbhub,json=smartUsbhub,proto3" json:"smart_usbhub,omitempty"`
}

func (x *Peripherals) Reset() {
	*x = Peripherals{}
	if protoimpl.UnsafeEnabled {
		mi := &file_lab_peripherals_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Peripherals) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Peripherals) ProtoMessage() {}

func (x *Peripherals) ProtoReflect() protoreflect.Message {
	mi := &file_lab_peripherals_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Peripherals.ProtoReflect.Descriptor instead.
func (*Peripherals) Descriptor() ([]byte, []int) {
	return file_lab_peripherals_proto_rawDescGZIP(), []int{0}
}

func (x *Peripherals) GetServo() *Servo {
	if x != nil {
		return x.Servo
	}
	return nil
}

func (x *Peripherals) GetChameleon() *Chameleon {
	if x != nil {
		return x.Chameleon
	}
	return nil
}

func (x *Peripherals) GetRpm() *RPM {
	if x != nil {
		return x.Rpm
	}
	return nil
}

func (x *Peripherals) GetConnectedCamera() []*Camera {
	if x != nil {
		return x.ConnectedCamera
	}
	return nil
}

func (x *Peripherals) GetAudio() *Audio {
	if x != nil {
		return x.Audio
	}
	return nil
}

func (x *Peripherals) GetWifi() *Wifi {
	if x != nil {
		return x.Wifi
	}
	return nil
}

func (x *Peripherals) GetTouch() *Touch {
	if x != nil {
		return x.Touch
	}
	return nil
}

func (x *Peripherals) GetCarrier() string {
	if x != nil {
		return x.Carrier
	}
	return ""
}

func (x *Peripherals) GetCamerabox() bool {
	if x != nil {
		return x.Camerabox
	}
	return false
}

func (x *Peripherals) GetChaos() bool {
	if x != nil {
		return x.Chaos
	}
	return false
}

func (x *Peripherals) GetCable() []*Cable {
	if x != nil {
		return x.Cable
	}
	return nil
}

func (x *Peripherals) GetCameraboxInfo() *Camerabox {
	if x != nil {
		return x.CameraboxInfo
	}
	return nil
}

func (x *Peripherals) GetSmartUsbhub() bool {
	if x != nil {
		return x.SmartUsbhub
	}
	return false
}

// Remote power management info.
// Next Tag: 3
type RPM struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	PowerunitName   string `protobuf:"bytes,1,opt,name=powerunit_name,json=powerunitName,proto3" json:"powerunit_name,omitempty"`
	PowerunitOutlet string `protobuf:"bytes,2,opt,name=powerunit_outlet,json=powerunitOutlet,proto3" json:"powerunit_outlet,omitempty"`
}

func (x *RPM) Reset() {
	*x = RPM{}
	if protoimpl.UnsafeEnabled {
		mi := &file_lab_peripherals_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *RPM) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*RPM) ProtoMessage() {}

func (x *RPM) ProtoReflect() protoreflect.Message {
	mi := &file_lab_peripherals_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use RPM.ProtoReflect.Descriptor instead.
func (*RPM) Descriptor() ([]byte, []int) {
	return file_lab_peripherals_proto_rawDescGZIP(), []int{1}
}

func (x *RPM) GetPowerunitName() string {
	if x != nil {
		return x.PowerunitName
	}
	return ""
}

func (x *RPM) GetPowerunitOutlet() string {
	if x != nil {
		return x.PowerunitOutlet
	}
	return ""
}

// Next Tag: 2
type Camera struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	CameraType CameraType `protobuf:"varint,1,opt,name=camera_type,json=cameraType,proto3,enum=lab.CameraType" json:"camera_type,omitempty"`
}

func (x *Camera) Reset() {
	*x = Camera{}
	if protoimpl.UnsafeEnabled {
		mi := &file_lab_peripherals_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Camera) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Camera) ProtoMessage() {}

func (x *Camera) ProtoReflect() protoreflect.Message {
	mi := &file_lab_peripherals_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Camera.ProtoReflect.Descriptor instead.
func (*Camera) Descriptor() ([]byte, []int) {
	return file_lab_peripherals_proto_rawDescGZIP(), []int{2}
}

func (x *Camera) GetCameraType() CameraType {
	if x != nil {
		return x.CameraType
	}
	return CameraType_CAMERA_INVALID
}

type Cable struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Type CableType `protobuf:"varint,1,opt,name=type,proto3,enum=lab.CableType" json:"type,omitempty"`
}

func (x *Cable) Reset() {
	*x = Cable{}
	if protoimpl.UnsafeEnabled {
		mi := &file_lab_peripherals_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Cable) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Cable) ProtoMessage() {}

func (x *Cable) ProtoReflect() protoreflect.Message {
	mi := &file_lab_peripherals_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Cable.ProtoReflect.Descriptor instead.
func (*Cable) Descriptor() ([]byte, []int) {
	return file_lab_peripherals_proto_rawDescGZIP(), []int{3}
}

func (x *Cable) GetType() CableType {
	if x != nil {
		return x.Type
	}
	return CableType_CABLE_INVALID
}

// Next Tag: 4
type Audio struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Indicate if the DUT is housed in an audio box to record / replay audio
	// for audio testing.
	AudioBox bool `protobuf:"varint,1,opt,name=audio_box,json=audioBox,proto3" json:"audio_box,omitempty"`
	// Indicate if the DUT is connected to Atrus speakermic
	Atrus bool `protobuf:"varint,2,opt,name=atrus,proto3" json:"atrus,omitempty"`
	// Indicate if the DUT is connected to chameleon through static audio cable
	AudioCable bool `protobuf:"varint,3,opt,name=audio_cable,json=audioCable,proto3" json:"audio_cable,omitempty"`
}

func (x *Audio) Reset() {
	*x = Audio{}
	if protoimpl.UnsafeEnabled {
		mi := &file_lab_peripherals_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Audio) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Audio) ProtoMessage() {}

func (x *Audio) ProtoReflect() protoreflect.Message {
	mi := &file_lab_peripherals_proto_msgTypes[4]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Audio.ProtoReflect.Descriptor instead.
func (*Audio) Descriptor() ([]byte, []int) {
	return file_lab_peripherals_proto_rawDescGZIP(), []int{4}
}

func (x *Audio) GetAudioBox() bool {
	if x != nil {
		return x.AudioBox
	}
	return false
}

func (x *Audio) GetAtrus() bool {
	if x != nil {
		return x.Atrus
	}
	return false
}

func (x *Audio) GetAudioCable() bool {
	if x != nil {
		return x.AudioCable
	}
	return false
}

// Next Tag: 4
type Wifi struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Indicate if the device is inside a hermetic wifi cell.
	Wificell    bool                   `protobuf:"varint,1,opt,name=wificell,proto3" json:"wificell,omitempty"`
	AntennaConn Wifi_AntennaConnection `protobuf:"varint,2,opt,name=antenna_conn,json=antennaConn,proto3,enum=lab.Wifi_AntennaConnection" json:"antenna_conn,omitempty"`
	// Indicate if the device is in a pre-setup environment with 802.11ax routers.
	// crbug.com/1044786
	Router Wifi_Router `protobuf:"varint,3,opt,name=router,proto3,enum=lab.Wifi_Router" json:"router,omitempty"`
}

func (x *Wifi) Reset() {
	*x = Wifi{}
	if protoimpl.UnsafeEnabled {
		mi := &file_lab_peripherals_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Wifi) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Wifi) ProtoMessage() {}

func (x *Wifi) ProtoReflect() protoreflect.Message {
	mi := &file_lab_peripherals_proto_msgTypes[5]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Wifi.ProtoReflect.Descriptor instead.
func (*Wifi) Descriptor() ([]byte, []int) {
	return file_lab_peripherals_proto_rawDescGZIP(), []int{5}
}

func (x *Wifi) GetWificell() bool {
	if x != nil {
		return x.Wificell
	}
	return false
}

func (x *Wifi) GetAntennaConn() Wifi_AntennaConnection {
	if x != nil {
		return x.AntennaConn
	}
	return Wifi_CONN_UNKNOWN
}

func (x *Wifi) GetRouter() Wifi_Router {
	if x != nil {
		return x.Router
	}
	return Wifi_ROUTER_UNSPECIFIED
}

// Next Tag: 2
type Touch struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Has touch monitor mimo.
	Mimo bool `protobuf:"varint,1,opt,name=mimo,proto3" json:"mimo,omitempty"`
}

func (x *Touch) Reset() {
	*x = Touch{}
	if protoimpl.UnsafeEnabled {
		mi := &file_lab_peripherals_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Touch) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Touch) ProtoMessage() {}

func (x *Touch) ProtoReflect() protoreflect.Message {
	mi := &file_lab_peripherals_proto_msgTypes[6]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Touch.ProtoReflect.Descriptor instead.
func (*Touch) Descriptor() ([]byte, []int) {
	return file_lab_peripherals_proto_rawDescGZIP(), []int{6}
}

func (x *Touch) GetMimo() bool {
	if x != nil {
		return x.Mimo
	}
	return false
}

// Next Tag: 3
type Camerabox struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Facing Camerabox_Facing `protobuf:"varint,1,opt,name=facing,proto3,enum=lab.Camerabox_Facing" json:"facing,omitempty"`
	Light  Camerabox_Light  `protobuf:"varint,2,opt,name=light,proto3,enum=lab.Camerabox_Light" json:"light,omitempty"`
}

func (x *Camerabox) Reset() {
	*x = Camerabox{}
	if protoimpl.UnsafeEnabled {
		mi := &file_lab_peripherals_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Camerabox) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Camerabox) ProtoMessage() {}

func (x *Camerabox) ProtoReflect() protoreflect.Message {
	mi := &file_lab_peripherals_proto_msgTypes[7]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Camerabox.ProtoReflect.Descriptor instead.
func (*Camerabox) Descriptor() ([]byte, []int) {
	return file_lab_peripherals_proto_rawDescGZIP(), []int{7}
}

func (x *Camerabox) GetFacing() Camerabox_Facing {
	if x != nil {
		return x.Facing
	}
	return Camerabox_FACING_UNKNOWN
}

func (x *Camerabox) GetLight() Camerabox_Light {
	if x != nil {
		return x.Light
	}
	return Camerabox_LIGHT_UNKNOWN
}

var File_lab_peripherals_proto protoreflect.FileDescriptor

var file_lab_peripherals_proto_rawDesc = []byte{
	0x0a, 0x15, 0x6c, 0x61, 0x62, 0x2f, 0x70, 0x65, 0x72, 0x69, 0x70, 0x68, 0x65, 0x72, 0x61, 0x6c,
	0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x6c, 0x61, 0x62, 0x1a, 0x13, 0x6c, 0x61,
	0x62, 0x2f, 0x63, 0x68, 0x61, 0x6d, 0x65, 0x6c, 0x65, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x1a, 0x0f, 0x6c, 0x61, 0x62, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x6f, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x22, 0xde, 0x03, 0x0a, 0x0b, 0x50, 0x65, 0x72, 0x69, 0x70, 0x68, 0x65, 0x72, 0x61,
	0x6c, 0x73, 0x12, 0x20, 0x0a, 0x05, 0x73, 0x65, 0x72, 0x76, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x0a, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x6f, 0x52, 0x05, 0x73,
	0x65, 0x72, 0x76, 0x6f, 0x12, 0x2c, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x6d, 0x65, 0x6c, 0x65, 0x6f,
	0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x43, 0x68,
	0x61, 0x6d, 0x65, 0x6c, 0x65, 0x6f, 0x6e, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6d, 0x65, 0x6c, 0x65,
	0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x03, 0x72, 0x70, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x08, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x52, 0x50, 0x4d, 0x52, 0x03, 0x72, 0x70, 0x6d, 0x12, 0x36,
	0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x61, 0x6d, 0x65,
	0x72, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x43,
	0x61, 0x6d, 0x65, 0x72, 0x61, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64,
	0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x12, 0x20, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x18,
	0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x41, 0x75, 0x64, 0x69,
	0x6f, 0x52, 0x05, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x12, 0x1d, 0x0a, 0x04, 0x77, 0x69, 0x66, 0x69,
	0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x57, 0x69, 0x66,
	0x69, 0x52, 0x04, 0x77, 0x69, 0x66, 0x69, 0x12, 0x20, 0x0a, 0x05, 0x74, 0x6f, 0x75, 0x63, 0x68,
	0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x54, 0x6f, 0x75,
	0x63, 0x68, 0x52, 0x05, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x61, 0x72,
	0x72, 0x69, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x61, 0x72, 0x72,
	0x69, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6f, 0x78,
	0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6f,
	0x78, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x68, 0x61, 0x6f, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08,
	0x52, 0x05, 0x63, 0x68, 0x61, 0x6f, 0x73, 0x12, 0x20, 0x0a, 0x05, 0x63, 0x61, 0x62, 0x6c, 0x65,
	0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x43, 0x61, 0x62,
	0x6c, 0x65, 0x52, 0x05, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x35, 0x0a, 0x0e, 0x63, 0x61, 0x6d,
	0x65, 0x72, 0x61, 0x62, 0x6f, 0x78, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0c, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6f,
	0x78, 0x52, 0x0d, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6f, 0x78, 0x49, 0x6e, 0x66, 0x6f,
	0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6d, 0x61, 0x72, 0x74, 0x5f, 0x75, 0x73, 0x62, 0x68, 0x75, 0x62,
	0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x6d, 0x61, 0x72, 0x74, 0x55, 0x73, 0x62,
	0x68, 0x75, 0x62, 0x22, 0x57, 0x0a, 0x03, 0x52, 0x50, 0x4d, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x6f,
	0x77, 0x65, 0x72, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x0d, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x75, 0x6e, 0x69, 0x74, 0x4e, 0x61, 0x6d,
	0x65, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x6f,
	0x75, 0x74, 0x6c, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x6f, 0x77,
	0x65, 0x72, 0x75, 0x6e, 0x69, 0x74, 0x4f, 0x75, 0x74, 0x6c, 0x65, 0x74, 0x22, 0x3a, 0x0a, 0x06,
	0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x12, 0x30, 0x0a, 0x0b, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61,
	0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x6c, 0x61,
	0x62, 0x2e, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x63, 0x61,
	0x6d, 0x65, 0x72, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x2b, 0x0a, 0x05, 0x43, 0x61, 0x62, 0x6c,
	0x65, 0x12, 0x22, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32,
	0x0e, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x43, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52,
	0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x5b, 0x0a, 0x05, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x12, 0x1b,
	0x0a, 0x09, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x5f, 0x62, 0x6f, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x08, 0x52, 0x08, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x42, 0x6f, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x61,
	0x74, 0x72, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x74, 0x72, 0x75,
	0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x5f, 0x63, 0x61, 0x62, 0x6c, 0x65,
	0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x61, 0x62,
	0x6c, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x04, 0x57, 0x69, 0x66, 0x69, 0x12, 0x1a, 0x0a, 0x08, 0x77,
	0x69, 0x66, 0x69, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x77,
	0x69, 0x66, 0x69, 0x63, 0x65, 0x6c, 0x6c, 0x12, 0x3e, 0x0a, 0x0c, 0x61, 0x6e, 0x74, 0x65, 0x6e,
	0x6e, 0x61, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e,
	0x6c, 0x61, 0x62, 0x2e, 0x57, 0x69, 0x66, 0x69, 0x2e, 0x41, 0x6e, 0x74, 0x65, 0x6e, 0x6e, 0x61,
	0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x61, 0x6e, 0x74, 0x65,
	0x6e, 0x6e, 0x61, 0x43, 0x6f, 0x6e, 0x6e, 0x12, 0x28, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65,
	0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x57, 0x69,
	0x66, 0x69, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65,
	0x72, 0x22, 0x48, 0x0a, 0x11, 0x41, 0x6e, 0x74, 0x65, 0x6e, 0x6e, 0x61, 0x43, 0x6f, 0x6e, 0x6e,
	0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x4f, 0x4e, 0x4e, 0x5f, 0x55,
	0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x4f, 0x4e, 0x4e,
	0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x55, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x0c, 0x0a,
	0x08, 0x43, 0x4f, 0x4e, 0x4e, 0x5f, 0x4f, 0x54, 0x41, 0x10, 0x02, 0x22, 0x35, 0x0a, 0x06, 0x52,
	0x6f, 0x75, 0x74, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x4f, 0x55, 0x54, 0x45, 0x52, 0x5f,
	0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a,
	0x0f, 0x52, 0x4f, 0x55, 0x54, 0x45, 0x52, 0x5f, 0x38, 0x30, 0x32, 0x5f, 0x31, 0x31, 0x41, 0x58,
	0x10, 0x01, 0x22, 0x1b, 0x0a, 0x05, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6d,
	0x69, 0x6d, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6d, 0x69, 0x6d, 0x6f, 0x22,
	0xe3, 0x01, 0x0a, 0x09, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6f, 0x78, 0x12, 0x2d, 0x0a,
	0x06, 0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e,
	0x6c, 0x61, 0x62, 0x2e, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6f, 0x78, 0x2e, 0x46, 0x61,
	0x63, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x2a, 0x0a, 0x05,
	0x6c, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x6c, 0x61,
	0x62, 0x2e, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6f, 0x78, 0x2e, 0x4c, 0x69, 0x67, 0x68,
	0x74, 0x52, 0x05, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3f, 0x0a, 0x06, 0x46, 0x61, 0x63, 0x69,
	0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x46, 0x41, 0x43, 0x49, 0x4e, 0x47, 0x5f, 0x55, 0x4e, 0x4b,
	0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x41, 0x43, 0x49, 0x4e, 0x47,
	0x5f, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x41, 0x43, 0x49, 0x4e,
	0x47, 0x5f, 0x46, 0x52, 0x4f, 0x4e, 0x54, 0x10, 0x02, 0x22, 0x3a, 0x0a, 0x05, 0x4c, 0x69, 0x67,
	0x68, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4c, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e,
	0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4c, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x4c,
	0x45, 0x44, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x4e, 0x4f,
	0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x47, 0x0a, 0x0a, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x54,
	0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x41, 0x4d, 0x45, 0x52, 0x41, 0x5f, 0x49, 0x4e,
	0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x41, 0x4d, 0x45, 0x52,
	0x41, 0x5f, 0x48, 0x55, 0x44, 0x44, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x41,
	0x4d, 0x45, 0x52, 0x41, 0x5f, 0x50, 0x54, 0x5a, 0x50, 0x52, 0x4f, 0x32, 0x10, 0x02, 0x2a, 0x73,
	0x0a, 0x09, 0x43, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x43,
	0x41, 0x42, 0x4c, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x13,
	0x0a, 0x0f, 0x43, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x41, 0x55, 0x44, 0x49, 0x4f, 0x4a, 0x41, 0x43,
	0x4b, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x55, 0x53, 0x42,
	0x41, 0x55, 0x44, 0x49, 0x4f, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x41, 0x42, 0x4c, 0x45,
	0x5f, 0x55, 0x53, 0x42, 0x50, 0x52, 0x49, 0x4e, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x13,
	0x0a, 0x0f, 0x43, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x48, 0x44, 0x4d, 0x49, 0x41, 0x55, 0x44, 0x49,
	0x4f, 0x10, 0x04, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f,
	0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f,
	0x2f, 0x6c, 0x61, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_lab_peripherals_proto_rawDescOnce sync.Once
	file_lab_peripherals_proto_rawDescData = file_lab_peripherals_proto_rawDesc
)

func file_lab_peripherals_proto_rawDescGZIP() []byte {
	file_lab_peripherals_proto_rawDescOnce.Do(func() {
		file_lab_peripherals_proto_rawDescData = protoimpl.X.CompressGZIP(file_lab_peripherals_proto_rawDescData)
	})
	return file_lab_peripherals_proto_rawDescData
}

var file_lab_peripherals_proto_enumTypes = make([]protoimpl.EnumInfo, 6)
var file_lab_peripherals_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
var file_lab_peripherals_proto_goTypes = []interface{}{
	(CameraType)(0),             // 0: lab.CameraType
	(CableType)(0),              // 1: lab.CableType
	(Wifi_AntennaConnection)(0), // 2: lab.Wifi.AntennaConnection
	(Wifi_Router)(0),            // 3: lab.Wifi.Router
	(Camerabox_Facing)(0),       // 4: lab.Camerabox.Facing
	(Camerabox_Light)(0),        // 5: lab.Camerabox.Light
	(*Peripherals)(nil),         // 6: lab.Peripherals
	(*RPM)(nil),                 // 7: lab.RPM
	(*Camera)(nil),              // 8: lab.Camera
	(*Cable)(nil),               // 9: lab.Cable
	(*Audio)(nil),               // 10: lab.Audio
	(*Wifi)(nil),                // 11: lab.Wifi
	(*Touch)(nil),               // 12: lab.Touch
	(*Camerabox)(nil),           // 13: lab.Camerabox
	(*Servo)(nil),               // 14: lab.Servo
	(*Chameleon)(nil),           // 15: lab.Chameleon
}
var file_lab_peripherals_proto_depIdxs = []int32{
	14, // 0: lab.Peripherals.servo:type_name -> lab.Servo
	15, // 1: lab.Peripherals.chameleon:type_name -> lab.Chameleon
	7,  // 2: lab.Peripherals.rpm:type_name -> lab.RPM
	8,  // 3: lab.Peripherals.connected_camera:type_name -> lab.Camera
	10, // 4: lab.Peripherals.audio:type_name -> lab.Audio
	11, // 5: lab.Peripherals.wifi:type_name -> lab.Wifi
	12, // 6: lab.Peripherals.touch:type_name -> lab.Touch
	9,  // 7: lab.Peripherals.cable:type_name -> lab.Cable
	13, // 8: lab.Peripherals.camerabox_info:type_name -> lab.Camerabox
	0,  // 9: lab.Camera.camera_type:type_name -> lab.CameraType
	1,  // 10: lab.Cable.type:type_name -> lab.CableType
	2,  // 11: lab.Wifi.antenna_conn:type_name -> lab.Wifi.AntennaConnection
	3,  // 12: lab.Wifi.router:type_name -> lab.Wifi.Router
	4,  // 13: lab.Camerabox.facing:type_name -> lab.Camerabox.Facing
	5,  // 14: lab.Camerabox.light:type_name -> lab.Camerabox.Light
	15, // [15:15] is the sub-list for method output_type
	15, // [15:15] is the sub-list for method input_type
	15, // [15:15] is the sub-list for extension type_name
	15, // [15:15] is the sub-list for extension extendee
	0,  // [0:15] is the sub-list for field type_name
}

func init() { file_lab_peripherals_proto_init() }
func file_lab_peripherals_proto_init() {
	if File_lab_peripherals_proto != nil {
		return
	}
	file_lab_chameleon_proto_init()
	file_lab_servo_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_lab_peripherals_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Peripherals); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_lab_peripherals_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*RPM); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_lab_peripherals_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Camera); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_lab_peripherals_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Cable); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_lab_peripherals_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Audio); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_lab_peripherals_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Wifi); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_lab_peripherals_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Touch); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_lab_peripherals_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Camerabox); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_lab_peripherals_proto_rawDesc,
			NumEnums:      6,
			NumMessages:   8,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_lab_peripherals_proto_goTypes,
		DependencyIndexes: file_lab_peripherals_proto_depIdxs,
		EnumInfos:         file_lab_peripherals_proto_enumTypes,
		MessageInfos:      file_lab_peripherals_proto_msgTypes,
	}.Build()
	File_lab_peripherals_proto = out.File
	file_lab_peripherals_proto_rawDesc = nil
	file_lab_peripherals_proto_goTypes = nil
	file_lab_peripherals_proto_depIdxs = nil
}
