// Code generated by protoc-gen-go. DO NOT EDIT.
// source: lab/chameleon.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

type ChameleonType int32

const (
	ChameleonType_CHAMELEON_TYPE_INVALID      ChameleonType = 0
	ChameleonType_CHAMELEON_TYPE_BT_HID       ChameleonType = 1
	ChameleonType_CHAMELEON_TYPE_DP           ChameleonType = 2
	ChameleonType_CHAMELEON_TYPE_DP_HDMI      ChameleonType = 3
	ChameleonType_CHAMELEON_TYPE_VGA          ChameleonType = 4
	ChameleonType_CHAMELEON_TYPE_HDMI         ChameleonType = 5
	ChameleonType_CHAMELEON_TYPE_BT_BLE_HID   ChameleonType = 6
	ChameleonType_CHAMELEON_TYPE_BT_A2DP_SINK ChameleonType = 7
	ChameleonType_CHAMELEON_TYPE_BT_PEER      ChameleonType = 8
)

var ChameleonType_name = map[int32]string{
	0: "CHAMELEON_TYPE_INVALID",
	1: "CHAMELEON_TYPE_BT_HID",
	2: "CHAMELEON_TYPE_DP",
	3: "CHAMELEON_TYPE_DP_HDMI",
	4: "CHAMELEON_TYPE_VGA",
	5: "CHAMELEON_TYPE_HDMI",
	6: "CHAMELEON_TYPE_BT_BLE_HID",
	7: "CHAMELEON_TYPE_BT_A2DP_SINK",
	8: "CHAMELEON_TYPE_BT_PEER",
}

var ChameleonType_value = map[string]int32{
	"CHAMELEON_TYPE_INVALID":      0,
	"CHAMELEON_TYPE_BT_HID":       1,
	"CHAMELEON_TYPE_DP":           2,
	"CHAMELEON_TYPE_DP_HDMI":      3,
	"CHAMELEON_TYPE_VGA":          4,
	"CHAMELEON_TYPE_HDMI":         5,
	"CHAMELEON_TYPE_BT_BLE_HID":   6,
	"CHAMELEON_TYPE_BT_A2DP_SINK": 7,
	"CHAMELEON_TYPE_BT_PEER":      8,
}

func (x ChameleonType) String() string {
	return proto.EnumName(ChameleonType_name, int32(x))
}

func (ChameleonType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_10a686241ab9b60c, []int{0}
}

// NEXT TAG: 4
type Chameleon struct {
	ChameleonPeripherals []ChameleonType `protobuf:"varint,3,rep,packed,name=chameleon_peripherals,json=chameleonPeripherals,proto3,enum=lab.ChameleonType" json:"chameleon_peripherals,omitempty"`
	// Indicate if there's audio_board in the chameleon.
	AudioBoard           bool     `protobuf:"varint,2,opt,name=audio_board,json=audioBoard,proto3" json:"audio_board,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Chameleon proto.InternalMessageInfo

func (m *Chameleon) GetChameleonPeripherals() []ChameleonType {
	if m != nil {
		return m.ChameleonPeripherals
	}
	return nil
}

func (m *Chameleon) GetAudioBoard() bool {
	if m != nil {
		return m.AudioBoard
	}
	return false
}

func init() {
	proto.RegisterEnum("lab.ChameleonType", ChameleonType_name, ChameleonType_value)
	proto.RegisterType((*Chameleon)(nil), "lab.Chameleon")
}

func init() { proto.RegisterFile("lab/chameleon.proto", fileDescriptor_10a686241ab9b60c) }

var fileDescriptor_10a686241ab9b60c = []byte{
	// 303 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x91, 0x61, 0x4b, 0xc2, 0x40,
	0x18, 0xc7, 0x73, 0x33, 0xb3, 0x27, 0x8a, 0xeb, 0x31, 0x4d, 0x8b, 0x50, 0x7a, 0x25, 0x41, 0x3b,
	0xb0, 0x4f, 0xb0, 0xb9, 0xa1, 0x2b, 0xb5, 0x61, 0x43, 0xa8, 0x37, 0xc7, 0x9d, 0x2e, 0x1d, 0x9c,
	0xde, 0x38, 0xf3, 0x45, 0xf4, 0xbe, 0xcf, 0x1d, 0x0d, 0x5c, 0x34, 0x7d, 0xf9, 0xfc, 0x7e, 0xff,
	0xe7, 0xb9, 0x3f, 0x1c, 0x54, 0x24, 0x17, 0x74, 0xba, 0xe0, 0xcb, 0x48, 0x46, 0x6a, 0x65, 0x25,
	0x5a, 0x7d, 0x28, 0x34, 0x25, 0x17, 0xb7, 0x5f, 0x70, 0xdc, 0xdd, 0x72, 0xec, 0x41, 0x35, 0x0b,
	0xb1, 0x24, 0xd2, 0x71, 0xb2, 0x88, 0x34, 0x97, 0xeb, 0xba, 0xd9, 0x32, 0xdb, 0x67, 0x1d, 0xb4,
	0x24, 0x17, 0x56, 0x16, 0x0f, 0x3f, 0x93, 0x68, 0x7c, 0x91, 0x2d, 0x04, 0x7f, 0x79, 0x6c, 0xc2,
	0x09, 0xdf, 0xcc, 0x62, 0xc5, 0x84, 0xe2, 0x7a, 0x56, 0x37, 0x5a, 0x85, 0x76, 0x79, 0x0c, 0x29,
	0x72, 0x7e, 0xc9, 0x63, 0xb1, 0x5c, 0x20, 0xc6, 0xdd, 0xb7, 0x01, 0xa7, 0xff, 0xce, 0xe1, 0x15,
	0xd4, 0xba, 0x7d, 0x7b, 0xe8, 0x0d, 0xbc, 0xe7, 0x11, 0x0b, 0x5f, 0x03, 0x8f, 0xf9, 0xa3, 0x89,
	0x3d, 0xf0, 0x5d, 0x72, 0x80, 0x0d, 0xa8, 0xe6, 0x9c, 0x13, 0xb2, 0xbe, 0xef, 0x92, 0x02, 0x56,
	0xe1, 0x3c, 0xa7, 0xdc, 0x80, 0x18, 0x7b, 0xae, 0xb9, 0x01, 0xeb, 0xbb, 0x43, 0x9f, 0x98, 0x58,
	0x03, 0xcc, 0xb9, 0x49, 0xcf, 0x26, 0x45, 0xbc, 0x84, 0x4a, 0x8e, 0xa7, 0x0b, 0x87, 0x78, 0x03,
	0x8d, 0xdd, 0xe7, 0x9d, 0x81, 0x97, 0x56, 0x28, 0x61, 0x13, 0xae, 0x77, 0xb5, 0xdd, 0x71, 0x03,
	0xf6, 0xe2, 0x8f, 0x9e, 0xc8, 0xd1, 0x9e, 0x32, 0x4e, 0xc8, 0x02, 0xcf, 0x1b, 0x93, 0xb2, 0x43,
	0xdf, 0xee, 0xe7, 0xca, 0x9a, 0x2e, 0xb4, 0x5a, 0xc6, 0x9b, 0xa5, 0xa5, 0xf4, 0x9c, 0x6e, 0x07,
	0xb5, 0xa6, 0xf1, 0xea, 0x5d, 0x73, 0x9a, 0x7e, 0x1a, 0x9d, 0x2b, 0x2a, 0xb9, 0x10, 0xa5, 0x74,
	0x7a, 0xf8, 0x09, 0x00, 0x00, 0xff, 0xff, 0xae, 0xcf, 0xb4, 0xef, 0xd9, 0x01, 0x00, 0x00,
}
