// Code generated by protoc-gen-go. DO NOT EDIT.
// source: lab/peripherals.proto

package lab

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// 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
)

var CameraType_name = map[int32]string{
	0: "CAMERA_INVALID",
	1: "CAMERA_HUDDLY",
	2: "CAMERA_PTZPRO2",
}

var CameraType_value = map[string]int32{
	"CAMERA_INVALID": 0,
	"CAMERA_HUDDLY":  1,
	"CAMERA_PTZPRO2": 2,
}

func (x CameraType) String() string {
	return proto.EnumName(CameraType_name, int32(x))
}

func (CameraType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_3da5da8c71ea9e2e, []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
)

var CableType_name = map[int32]string{
	0: "CABLE_INVALID",
	1: "CABLE_AUDIOJACK",
	2: "CABLE_USBAUDIO",
	3: "CABLE_USBPRINTING",
	4: "CABLE_HDMIAUDIO",
}

var CableType_value = map[string]int32{
	"CABLE_INVALID":     0,
	"CABLE_AUDIOJACK":   1,
	"CABLE_USBAUDIO":    2,
	"CABLE_USBPRINTING": 3,
	"CABLE_HDMIAUDIO":   4,
}

func (x CableType) String() string {
	return proto.EnumName(CableType_name, int32(x))
}

func (CableType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_3da5da8c71ea9e2e, []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
)

var Wifi_AntennaConnection_name = map[int32]string{
	0: "CONN_UNKNOWN",
	1: "CONN_CONDUCTIVE",
	2: "CONN_OTA",
}

var Wifi_AntennaConnection_value = map[string]int32{
	"CONN_UNKNOWN":    0,
	"CONN_CONDUCTIVE": 1,
	"CONN_OTA":        2,
}

func (x Wifi_AntennaConnection) String() string {
	return proto.EnumName(Wifi_AntennaConnection_name, int32(x))
}

func (Wifi_AntennaConnection) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_3da5da8c71ea9e2e, []int{5, 0}
}

type Wifi_Router int32

const (
	Wifi_ROUTER_UNSPECIFIED Wifi_Router = 0
	Wifi_ROUTER_802_11AX    Wifi_Router = 1
)

var Wifi_Router_name = map[int32]string{
	0: "ROUTER_UNSPECIFIED",
	1: "ROUTER_802_11AX",
}

var Wifi_Router_value = map[string]int32{
	"ROUTER_UNSPECIFIED": 0,
	"ROUTER_802_11AX":    1,
}

func (x Wifi_Router) String() string {
	return proto.EnumName(Wifi_Router_name, int32(x))
}

func (Wifi_Router) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_3da5da8c71ea9e2e, []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
)

var Camerabox_Facing_name = map[int32]string{
	0: "FACING_UNKNOWN",
	1: "FACING_BACK",
	2: "FACING_FRONT",
}

var Camerabox_Facing_value = map[string]int32{
	"FACING_UNKNOWN": 0,
	"FACING_BACK":    1,
	"FACING_FRONT":   2,
}

func (x Camerabox_Facing) String() string {
	return proto.EnumName(Camerabox_Facing_name, int32(x))
}

func (Camerabox_Facing) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_3da5da8c71ea9e2e, []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
)

var Camerabox_Light_name = map[int32]string{
	0: "LIGHT_UNKNOWN",
	1: "LIGHT_LED",
	2: "LIGHT_NOLED",
}

var Camerabox_Light_value = map[string]int32{
	"LIGHT_UNKNOWN": 0,
	"LIGHT_LED":     1,
	"LIGHT_NOLED":   2,
}

func (x Camerabox_Light) String() string {
	return proto.EnumName(Camerabox_Light_name, int32(x))
}

func (Camerabox_Light) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_3da5da8c71ea9e2e, []int{7, 1}
}

// Peripherals of device. Next Tag: 14
type Peripherals struct {
	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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Peripherals) Reset()         { *m = Peripherals{} }
func (m *Peripherals) String() string { return proto.CompactTextString(m) }
func (*Peripherals) ProtoMessage()    {}
func (*Peripherals) Descriptor() ([]byte, []int) {
	return fileDescriptor_3da5da8c71ea9e2e, []int{0}
}

func (m *Peripherals) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Peripherals.Unmarshal(m, b)
}
func (m *Peripherals) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Peripherals.Marshal(b, m, deterministic)
}
func (m *Peripherals) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Peripherals.Merge(m, src)
}
func (m *Peripherals) XXX_Size() int {
	return xxx_messageInfo_Peripherals.Size(m)
}
func (m *Peripherals) XXX_DiscardUnknown() {
	xxx_messageInfo_Peripherals.DiscardUnknown(m)
}

var xxx_messageInfo_Peripherals proto.InternalMessageInfo

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

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

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

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

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

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

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

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

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

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

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

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

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

// Remote power management info.
// Next Tag: 3
type RPM struct {
	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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *RPM) Reset()         { *m = RPM{} }
func (m *RPM) String() string { return proto.CompactTextString(m) }
func (*RPM) ProtoMessage()    {}
func (*RPM) Descriptor() ([]byte, []int) {
	return fileDescriptor_3da5da8c71ea9e2e, []int{1}
}

func (m *RPM) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_RPM.Unmarshal(m, b)
}
func (m *RPM) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_RPM.Marshal(b, m, deterministic)
}
func (m *RPM) XXX_Merge(src proto.Message) {
	xxx_messageInfo_RPM.Merge(m, src)
}
func (m *RPM) XXX_Size() int {
	return xxx_messageInfo_RPM.Size(m)
}
func (m *RPM) XXX_DiscardUnknown() {
	xxx_messageInfo_RPM.DiscardUnknown(m)
}

var xxx_messageInfo_RPM proto.InternalMessageInfo

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

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

// Next Tag: 2
type Camera struct {
	CameraType           CameraType `protobuf:"varint,1,opt,name=camera_type,json=cameraType,proto3,enum=lab.CameraType" json:"camera_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *Camera) Reset()         { *m = Camera{} }
func (m *Camera) String() string { return proto.CompactTextString(m) }
func (*Camera) ProtoMessage()    {}
func (*Camera) Descriptor() ([]byte, []int) {
	return fileDescriptor_3da5da8c71ea9e2e, []int{2}
}

func (m *Camera) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Camera.Unmarshal(m, b)
}
func (m *Camera) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Camera.Marshal(b, m, deterministic)
}
func (m *Camera) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Camera.Merge(m, src)
}
func (m *Camera) XXX_Size() int {
	return xxx_messageInfo_Camera.Size(m)
}
func (m *Camera) XXX_DiscardUnknown() {
	xxx_messageInfo_Camera.DiscardUnknown(m)
}

var xxx_messageInfo_Camera proto.InternalMessageInfo

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

type Cable struct {
	Type                 CableType `protobuf:"varint,1,opt,name=type,proto3,enum=lab.CableType" json:"type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *Cable) Reset()         { *m = Cable{} }
func (m *Cable) String() string { return proto.CompactTextString(m) }
func (*Cable) ProtoMessage()    {}
func (*Cable) Descriptor() ([]byte, []int) {
	return fileDescriptor_3da5da8c71ea9e2e, []int{3}
}

func (m *Cable) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Cable.Unmarshal(m, b)
}
func (m *Cable) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Cable.Marshal(b, m, deterministic)
}
func (m *Cable) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Cable.Merge(m, src)
}
func (m *Cable) XXX_Size() int {
	return xxx_messageInfo_Cable.Size(m)
}
func (m *Cable) XXX_DiscardUnknown() {
	xxx_messageInfo_Cable.DiscardUnknown(m)
}

var xxx_messageInfo_Cable proto.InternalMessageInfo

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

// Next Tag: 3
type Audio struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Audio) Reset()         { *m = Audio{} }
func (m *Audio) String() string { return proto.CompactTextString(m) }
func (*Audio) ProtoMessage()    {}
func (*Audio) Descriptor() ([]byte, []int) {
	return fileDescriptor_3da5da8c71ea9e2e, []int{4}
}

func (m *Audio) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Audio.Unmarshal(m, b)
}
func (m *Audio) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Audio.Marshal(b, m, deterministic)
}
func (m *Audio) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Audio.Merge(m, src)
}
func (m *Audio) XXX_Size() int {
	return xxx_messageInfo_Audio.Size(m)
}
func (m *Audio) XXX_DiscardUnknown() {
	xxx_messageInfo_Audio.DiscardUnknown(m)
}

var xxx_messageInfo_Audio proto.InternalMessageInfo

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

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

// Next Tag: 4
type Wifi struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *Wifi) Reset()         { *m = Wifi{} }
func (m *Wifi) String() string { return proto.CompactTextString(m) }
func (*Wifi) ProtoMessage()    {}
func (*Wifi) Descriptor() ([]byte, []int) {
	return fileDescriptor_3da5da8c71ea9e2e, []int{5}
}

func (m *Wifi) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Wifi.Unmarshal(m, b)
}
func (m *Wifi) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Wifi.Marshal(b, m, deterministic)
}
func (m *Wifi) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Wifi.Merge(m, src)
}
func (m *Wifi) XXX_Size() int {
	return xxx_messageInfo_Wifi.Size(m)
}
func (m *Wifi) XXX_DiscardUnknown() {
	xxx_messageInfo_Wifi.DiscardUnknown(m)
}

var xxx_messageInfo_Wifi proto.InternalMessageInfo

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

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

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

// Next Tag: 2
type Touch struct {
	// Has touch monitor mimo.
	Mimo                 bool     `protobuf:"varint,1,opt,name=mimo,proto3" json:"mimo,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Touch) Reset()         { *m = Touch{} }
func (m *Touch) String() string { return proto.CompactTextString(m) }
func (*Touch) ProtoMessage()    {}
func (*Touch) Descriptor() ([]byte, []int) {
	return fileDescriptor_3da5da8c71ea9e2e, []int{6}
}

func (m *Touch) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Touch.Unmarshal(m, b)
}
func (m *Touch) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Touch.Marshal(b, m, deterministic)
}
func (m *Touch) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Touch.Merge(m, src)
}
func (m *Touch) XXX_Size() int {
	return xxx_messageInfo_Touch.Size(m)
}
func (m *Touch) XXX_DiscardUnknown() {
	xxx_messageInfo_Touch.DiscardUnknown(m)
}

var xxx_messageInfo_Touch proto.InternalMessageInfo

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

// Next Tag: 3
type Camerabox struct {
	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"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *Camerabox) Reset()         { *m = Camerabox{} }
func (m *Camerabox) String() string { return proto.CompactTextString(m) }
func (*Camerabox) ProtoMessage()    {}
func (*Camerabox) Descriptor() ([]byte, []int) {
	return fileDescriptor_3da5da8c71ea9e2e, []int{7}
}

func (m *Camerabox) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Camerabox.Unmarshal(m, b)
}
func (m *Camerabox) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Camerabox.Marshal(b, m, deterministic)
}
func (m *Camerabox) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Camerabox.Merge(m, src)
}
func (m *Camerabox) XXX_Size() int {
	return xxx_messageInfo_Camerabox.Size(m)
}
func (m *Camerabox) XXX_DiscardUnknown() {
	xxx_messageInfo_Camerabox.DiscardUnknown(m)
}

var xxx_messageInfo_Camerabox proto.InternalMessageInfo

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

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

func init() {
	proto.RegisterEnum("lab.CameraType", CameraType_name, CameraType_value)
	proto.RegisterEnum("lab.CableType", CableType_name, CableType_value)
	proto.RegisterEnum("lab.Wifi_AntennaConnection", Wifi_AntennaConnection_name, Wifi_AntennaConnection_value)
	proto.RegisterEnum("lab.Wifi_Router", Wifi_Router_name, Wifi_Router_value)
	proto.RegisterEnum("lab.Camerabox_Facing", Camerabox_Facing_name, Camerabox_Facing_value)
	proto.RegisterEnum("lab.Camerabox_Light", Camerabox_Light_name, Camerabox_Light_value)
	proto.RegisterType((*Peripherals)(nil), "lab.Peripherals")
	proto.RegisterType((*RPM)(nil), "lab.RPM")
	proto.RegisterType((*Camera)(nil), "lab.Camera")
	proto.RegisterType((*Cable)(nil), "lab.Cable")
	proto.RegisterType((*Audio)(nil), "lab.Audio")
	proto.RegisterType((*Wifi)(nil), "lab.Wifi")
	proto.RegisterType((*Touch)(nil), "lab.Touch")
	proto.RegisterType((*Camerabox)(nil), "lab.Camerabox")
}

func init() { proto.RegisterFile("lab/peripherals.proto", fileDescriptor_3da5da8c71ea9e2e) }

var fileDescriptor_3da5da8c71ea9e2e = []byte{
	// 871 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x94, 0xdf, 0x8e, 0xdb, 0x44,
	0x14, 0xc6, 0x71, 0xfe, 0x35, 0x3e, 0xd9, 0x24, 0xde, 0x69, 0x8b, 0xac, 0x5d, 0x90, 0x16, 0x4b,
	0x48, 0x61, 0xa1, 0x49, 0x1b, 0x54, 0x84, 0x7a, 0x01, 0x72, 0xfe, 0xec, 0xae, 0x69, 0xd6, 0x8e,
	0x66, 0x93, 0x2e, 0xf4, 0xc6, 0x1a, 0xbb, 0x93, 0xc4, 0x92, 0xed, 0x89, 0x1c, 0x87, 0xd2, 0x87,
	0xe0, 0x15, 0xb9, 0xe1, 0x45, 0xd0, 0x9c, 0x71, 0x9c, 0x00, 0x77, 0x99, 0xdf, 0xf7, 0x9d, 0xcf,
	0x33, 0xe7, 0x1c, 0x05, 0x9e, 0xc7, 0x2c, 0x18, 0x6c, 0x79, 0x16, 0x6d, 0x37, 0x3c, 0x63, 0xf1,
	0xae, 0xbf, 0xcd, 0x44, 0x2e, 0x48, 0x35, 0x66, 0xc1, 0xc5, 0x53, 0xa9, 0x85, 0x1b, 0x96, 0xf0,
	0x98, 0x8b, 0x54, 0x29, 0x17, 0x5d, 0x09, 0x77, 0x3c, 0xfb, 0x5d, 0x28, 0x60, 0xfd, 0x55, 0x85,
	0xd6, 0xfc, 0x18, 0x40, 0xae, 0xa0, 0x8e, 0xb2, 0xa9, 0x5d, 0x69, 0xbd, 0xd6, 0x10, 0xfa, 0x31,
	0x0b, 0xfa, 0x0f, 0x92, 0x50, 0x25, 0x90, 0xef, 0x40, 0x2f, 0x53, 0xcd, 0x0a, 0xba, 0x3a, 0xe8,
	0x1a, 0x1f, 0x28, 0x3d, 0x1a, 0xc8, 0x05, 0x54, 0xb3, 0x6d, 0x62, 0x56, 0xd1, 0xd7, 0x44, 0x1f,
	0x9d, 0xdf, 0x53, 0x09, 0xc9, 0x0f, 0x60, 0x84, 0x22, 0x4d, 0x79, 0x98, 0xf3, 0x0f, 0x7e, 0xc8,
	0x12, 0x9e, 0x31, 0xb3, 0x76, 0x55, 0xed, 0xb5, 0x86, 0x2d, 0x15, 0x88, 0x88, 0x76, 0x4b, 0x93,
	0x02, 0xf2, 0x8e, 0x6c, 0xff, 0x21, 0x12, 0x66, 0xfd, 0xe4, 0x8e, 0xb6, 0x24, 0x54, 0x09, 0xe4,
	0x4b, 0xa8, 0x7d, 0x8c, 0x56, 0x91, 0xd9, 0x40, 0x83, 0x8e, 0x86, 0xc7, 0x68, 0x15, 0x51, 0xc4,
	0x32, 0x20, 0x17, 0xfb, 0x70, 0x63, 0x3e, 0x39, 0x09, 0x58, 0x48, 0x42, 0x95, 0x40, 0x4c, 0x78,
	0x12, 0xb2, 0x2c, 0x8b, 0x78, 0x66, 0x36, 0xaf, 0xb4, 0x9e, 0x4e, 0x0f, 0x47, 0xf2, 0x05, 0xe8,
	0xea, 0xaa, 0x81, 0xf8, 0xc3, 0xd4, 0xaf, 0xb4, 0x5e, 0x93, 0x1e, 0x01, 0x79, 0x06, 0xf5, 0x70,
	0xc3, 0xc4, 0xce, 0x04, 0x54, 0xd4, 0x41, 0x7e, 0x2f, 0x64, 0x41, 0xcc, 0xcd, 0x16, 0xbe, 0x0e,
	0x8a, 0xd7, 0x05, 0x31, 0xa7, 0x4a, 0x20, 0xaf, 0xa1, 0x53, 0x86, 0xf8, 0x51, 0xba, 0x12, 0xe6,
	0xd9, 0x69, 0x67, 0x0f, 0x12, 0x6d, 0x97, 0x2e, 0x27, 0x5d, 0x09, 0xf2, 0x15, 0x9c, 0xed, 0x12,
	0x96, 0xe5, 0xfe, 0x7e, 0x17, 0x6c, 0xf6, 0x81, 0xd9, 0xc6, 0xaf, 0xb6, 0x90, 0x2d, 0x11, 0x59,
	0x8f, 0x50, 0xa5, 0xf3, 0x7b, 0xf2, 0x35, 0x74, 0xb6, 0xe2, 0x23, 0xcf, 0xf6, 0x69, 0x94, 0xfb,
	0x29, 0x4b, 0x38, 0x0e, 0x58, 0xa7, 0xed, 0x92, 0xba, 0x2c, 0xe1, 0xe4, 0x1b, 0x30, 0x8e, 0x36,
	0xb1, 0xcf, 0x63, 0x9e, 0xe3, 0x8c, 0x75, 0xda, 0x2d, 0xb9, 0x87, 0xd8, 0x7a, 0x03, 0x8d, 0x62,
	0x1e, 0x2f, 0xa1, 0xa5, 0xae, 0xe5, 0xe7, 0x9f, 0xb6, 0x2a, 0xb8, 0x33, 0xec, 0x9e, 0xdc, 0x7c,
	0xf1, 0x69, 0xcb, 0x29, 0x84, 0xe5, 0x6f, 0xeb, 0x5b, 0xa8, 0xe3, 0xf3, 0x89, 0x05, 0xb5, 0x93,
	0x9a, 0xce, 0xb1, 0x31, 0x58, 0x82, 0x9a, 0xf5, 0x06, 0xea, 0x38, 0x5c, 0x72, 0x09, 0x3a, 0x8e,
	0xd7, 0x97, 0xad, 0xd7, 0xf0, 0xa9, 0x4d, 0x04, 0x23, 0xd5, 0x79, 0x96, 0x67, 0xfb, 0x1d, 0x5e,
	0xb7, 0x49, 0xd5, 0xc1, 0xfa, 0xb3, 0x02, 0x35, 0x39, 0x78, 0x72, 0x01, 0x4d, 0x39, 0xfa, 0x90,
	0xc7, 0xf1, 0xa1, 0xf4, 0x70, 0x26, 0x3f, 0xc1, 0x19, 0x4b, 0x73, 0x9e, 0xa6, 0xcc, 0x97, 0xab,
	0x86, 0x09, 0x9d, 0xe1, 0x65, 0xb9, 0x35, 0x7d, 0x5b, 0xa9, 0x63, 0xb5, 0x87, 0x91, 0x48, 0x69,
	0x8b, 0x1d, 0x11, 0xe9, 0x41, 0x23, 0x13, 0xfb, 0x9c, 0x67, 0xb8, 0xe6, 0x9d, 0xa1, 0x71, 0xac,
	0xa4, 0xc8, 0x69, 0xa1, 0x5b, 0x77, 0x70, 0xfe, 0xbf, 0x2c, 0x62, 0xc0, 0xd9, 0xd8, 0x73, 0x5d,
	0x7f, 0xe9, 0xbe, 0x75, 0xbd, 0x47, 0xd7, 0xf8, 0x8c, 0x3c, 0x85, 0x2e, 0x92, 0xb1, 0xe7, 0x4e,
	0x96, 0xe3, 0x85, 0xf3, 0x6e, 0x6a, 0x68, 0xe4, 0x0c, 0x9a, 0x08, 0xbd, 0x85, 0x6d, 0x54, 0xac,
	0xd7, 0xd0, 0x50, 0xd9, 0xe4, 0x73, 0x20, 0xd4, 0x5b, 0x2e, 0xa6, 0xd4, 0x5f, 0xba, 0x0f, 0xf3,
	0xe9, 0xd8, 0xb9, 0x71, 0xa6, 0x13, 0x15, 0x52, 0xf0, 0x1f, 0x5f, 0x0e, 0xfd, 0x57, 0xaf, 0xec,
	0x5f, 0x0d, 0xcd, 0xba, 0x84, 0x3a, 0xee, 0x39, 0x21, 0x50, 0x4b, 0xa2, 0x44, 0x14, 0xbd, 0xc0,
	0xdf, 0xd6, 0xdf, 0x1a, 0xe8, 0xe5, 0xaa, 0x91, 0x17, 0xd0, 0x58, 0xb1, 0x30, 0x4a, 0xd7, 0xc5,
	0x70, 0x9e, 0xff, 0x7b, 0x15, 0xfb, 0x37, 0x28, 0xd2, 0xc2, 0x44, 0xae, 0xa1, 0x1e, 0x47, 0xeb,
	0x4d, 0x5e, 0x74, 0xef, 0xd9, 0x7f, 0xdc, 0x33, 0xa9, 0x51, 0x65, 0xb1, 0x7e, 0x86, 0x86, 0xaa,
	0x26, 0x04, 0x3a, 0x37, 0xf6, 0xd8, 0x71, 0x6f, 0x4f, 0x5e, 0xdf, 0x85, 0x56, 0xc1, 0x46, 0xf6,
	0xf8, 0xad, 0xa1, 0xc9, 0x06, 0x15, 0xe0, 0x86, 0x7a, 0xee, 0xc2, 0xa8, 0xc8, 0x95, 0xc0, 0x40,
	0x72, 0x0e, 0xed, 0x99, 0x73, 0x7b, 0xb7, 0x38, 0x29, 0x6f, 0x83, 0xae, 0xd0, 0x6c, 0x3a, 0x31,
	0x34, 0x99, 0xa6, 0x8e, 0xae, 0x27, 0x41, 0xe5, 0xfa, 0x16, 0xe0, 0xb8, 0x95, 0xf2, 0x02, 0x63,
	0xfb, 0x7e, 0x4a, 0x6d, 0xdf, 0x71, 0xdf, 0xd9, 0x33, 0x47, 0x76, 0xee, 0x1c, 0xda, 0x05, 0xbb,
	0x5b, 0x4e, 0x26, 0xb3, 0xdf, 0x0c, 0xed, 0xc4, 0x36, 0x5f, 0xbc, 0x9f, 0x53, 0x6f, 0x68, 0x54,
	0xae, 0x77, 0xb2, 0x5b, 0xc5, 0xaa, 0xaa, 0x9a, 0xd1, 0x6c, 0x7a, 0x12, 0x23, 0xa7, 0x88, 0xc8,
	0x5e, 0x4e, 0x1c, 0xef, 0x17, 0xf5, 0x16, 0x0c, 0x92, 0x70, 0xf9, 0x30, 0x42, 0x6e, 0x54, 0xc8,
	0x73, 0x38, 0x2f, 0xd9, 0x9c, 0x3a, 0xee, 0xc2, 0x71, 0x6f, 0x8d, 0xea, 0xb1, 0xfe, 0x6e, 0x72,
	0xef, 0x28, 0x6f, 0x6d, 0x34, 0x78, 0xff, 0x62, 0x2d, 0xfa, 0xe1, 0x26, 0x13, 0x49, 0xb4, 0x4f,
	0xfa, 0x22, 0x5b, 0x0f, 0x0e, 0x07, 0xb1, 0x1b, 0x44, 0xe9, 0x2a, 0x63, 0x03, 0xfc, 0x67, 0x1f,
	0xac, 0xc5, 0x20, 0x66, 0x41, 0xd0, 0xc0, 0xd3, 0xf7, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x90,
	0x70, 0xe5, 0xd1, 0x2b, 0x06, 0x00, 0x00,
}
