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

// Servo Setup Type describes the capabilities of servos.
// Next Tag : 3
type ServoSetupType int32

const (
	ServoSetupType_SERVO_SETUP_REGULAR ServoSetupType = 0
	ServoSetupType_SERVO_SETUP_DUAL_V4 ServoSetupType = 1
	// SERVO_SETUP_INVALID explicitly marks errors in servo setup.
	ServoSetupType_SERVO_SETUP_INVALID ServoSetupType = 2
)

var ServoSetupType_name = map[int32]string{
	0: "SERVO_SETUP_REGULAR",
	1: "SERVO_SETUP_DUAL_V4",
	2: "SERVO_SETUP_INVALID",
}

var ServoSetupType_value = map[string]int32{
	"SERVO_SETUP_REGULAR": 0,
	"SERVO_SETUP_DUAL_V4": 1,
	"SERVO_SETUP_INVALID": 2,
}

func (x ServoSetupType) String() string {
	return proto.EnumName(ServoSetupType_name, int32(x))
}

func (ServoSetupType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_34a04ba68a815039, []int{0}
}

// NEXT TAG: 9
type Servo struct {
	// Servo-specific configs
	ServoHostname string `protobuf:"bytes,2,opt,name=servo_hostname,json=servoHostname,proto3" json:"servo_hostname,omitempty"`
	ServoPort     int32  `protobuf:"varint,3,opt,name=servo_port,json=servoPort,proto3" json:"servo_port,omitempty"`
	ServoSerial   string `protobuf:"bytes,4,opt,name=servo_serial,json=servoSerial,proto3" json:"servo_serial,omitempty"`
	// Based on https://docs.google.com/document/d/1TPp7yp-uwFUh5xOnBLI4jPYtYD7IcdyQ1dgqFqtcJEU/edit?ts=5d8eafb7#heading=h.csdfk1i6g0l
	// servo_type will contain different setup of servos. So string is recommended than enum.
	ServoType  string         `protobuf:"bytes,5,opt,name=servo_type,json=servoType,proto3" json:"servo_type,omitempty"`
	ServoSetup ServoSetupType `protobuf:"varint,7,opt,name=servo_setup,json=servoSetup,proto3,enum=lab.ServoSetupType" json:"servo_setup,omitempty"`
	// Based on http://go/fleet-servo-topology
	ServoTopology        *ServoTopology `protobuf:"bytes,8,opt,name=servo_topology,json=servoTopology,proto3" json:"servo_topology,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

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

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

var xxx_messageInfo_Servo proto.InternalMessageInfo

func (m *Servo) GetServoHostname() string {
	if m != nil {
		return m.ServoHostname
	}
	return ""
}

func (m *Servo) GetServoPort() int32 {
	if m != nil {
		return m.ServoPort
	}
	return 0
}

func (m *Servo) GetServoSerial() string {
	if m != nil {
		return m.ServoSerial
	}
	return ""
}

func (m *Servo) GetServoType() string {
	if m != nil {
		return m.ServoType
	}
	return ""
}

func (m *Servo) GetServoSetup() ServoSetupType {
	if m != nil {
		return m.ServoSetup
	}
	return ServoSetupType_SERVO_SETUP_REGULAR
}

func (m *Servo) GetServoTopology() *ServoTopology {
	if m != nil {
		return m.ServoTopology
	}
	return nil
}

// Servo Topology describe connected servo devices on DUT set-up to provide Servo functionality.
// Next Tag : 3
type ServoTopology struct {
	Main                 *ServoTopologyItem   `protobuf:"bytes,1,opt,name=main,proto3" json:"main,omitempty"`
	Children             []*ServoTopologyItem `protobuf:"bytes,2,rep,name=children,proto3" json:"children,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_ServoTopology proto.InternalMessageInfo

func (m *ServoTopology) GetMain() *ServoTopologyItem {
	if m != nil {
		return m.Main
	}
	return nil
}

func (m *ServoTopology) GetChildren() []*ServoTopologyItem {
	if m != nil {
		return m.Children
	}
	return nil
}

// Servo Topology Item describe details of one servo device on DUT set-up.
// Next Tag : 5
type ServoTopologyItem struct {
	// type provides the type of servo device. Keeping as String to avoid issue with introduce new type.
	Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
	// sysfs_product providess the product name of the device recorded in File System.
	SysfsProduct string `protobuf:"bytes,2,opt,name=sysfs_product,json=sysfsProduct,proto3" json:"sysfs_product,omitempty"`
	// serial providess the serilal number of the device.
	Serial string `protobuf:"bytes,3,opt,name=serial,proto3" json:"serial,omitempty"`
	// usb_hub_port providess the port connection to the device.
	// e.g. '1-6.2.2' where
	//   '1-6'  - port on the labstation
	//   '2'    - port on smart-hub connected to the labstation
	//   '2'    - port on servo hub (part of servo_v4 or servo_v4.1) connected to the smart-hub
	// The same path will look '1-6.2' if connected servo_v4 directly to the labstation.
	UsbHubPort           string   `protobuf:"bytes,4,opt,name=usb_hub_port,json=usbHubPort,proto3" json:"usb_hub_port,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ServoTopologyItem proto.InternalMessageInfo

func (m *ServoTopologyItem) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *ServoTopologyItem) GetSysfsProduct() string {
	if m != nil {
		return m.SysfsProduct
	}
	return ""
}

func (m *ServoTopologyItem) GetSerial() string {
	if m != nil {
		return m.Serial
	}
	return ""
}

func (m *ServoTopologyItem) GetUsbHubPort() string {
	if m != nil {
		return m.UsbHubPort
	}
	return ""
}

func init() {
	proto.RegisterEnum("lab.ServoSetupType", ServoSetupType_name, ServoSetupType_value)
	proto.RegisterType((*Servo)(nil), "lab.Servo")
	proto.RegisterType((*ServoTopology)(nil), "lab.ServoTopology")
	proto.RegisterType((*ServoTopologyItem)(nil), "lab.ServoTopologyItem")
}

func init() { proto.RegisterFile("lab/servo.proto", fileDescriptor_34a04ba68a815039) }

var fileDescriptor_34a04ba68a815039 = []byte{
	// 413 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0x4b, 0x6b, 0xdb, 0x40,
	0x14, 0x85, 0x2b, 0xbf, 0xe2, 0x5c, 0x3f, 0xea, 0x4e, 0x20, 0xd5, 0xa6, 0xa0, 0xba, 0x14, 0x4c,
	0xa0, 0x12, 0xb8, 0xd9, 0x74, 0xe9, 0x12, 0xd3, 0xb8, 0x98, 0xd6, 0x48, 0xb6, 0x17, 0xed, 0x42,
	0xcc, 0x38, 0x8a, 0x2d, 0x90, 0x7c, 0x87, 0x79, 0x14, 0xfc, 0x07, 0xf2, 0xbb, 0x8b, 0xaf, 0xa4,
	0x84, 0xc4, 0x90, 0x9d, 0xce, 0x77, 0x8e, 0x0e, 0x33, 0xf7, 0x0e, 0xbc, 0xcd, 0xb8, 0x08, 0x74,
	0xa2, 0xfe, 0xa1, 0x2f, 0x15, 0x1a, 0x64, 0xf5, 0x8c, 0x8b, 0xe1, 0x43, 0x0d, 0x9a, 0xd1, 0x11,
	0xb2, 0xcf, 0xd0, 0x27, 0x37, 0xde, 0xa1, 0x36, 0x7b, 0x9e, 0x27, 0x6e, 0xcd, 0x73, 0x46, 0xe7,
	0x61, 0x8f, 0xe8, 0x6d, 0x09, 0xd9, 0x07, 0x80, 0x22, 0x26, 0x51, 0x19, 0xb7, 0xee, 0x39, 0xa3,
	0x66, 0x78, 0x4e, 0x64, 0x81, 0xca, 0xb0, 0x8f, 0xd0, 0x2d, 0x6c, 0x9d, 0xa8, 0x94, 0x67, 0x6e,
	0x83, 0x3a, 0x3a, 0xc4, 0x22, 0x42, 0x4f, 0x0d, 0xe6, 0x20, 0x13, 0xb7, 0x49, 0x81, 0xa2, 0x61,
	0x79, 0x90, 0x09, 0xbb, 0x86, 0x4e, 0xd5, 0x60, 0xac, 0x74, 0xcf, 0x3c, 0x67, 0xd4, 0x1f, 0x5f,
	0xf8, 0x19, 0x17, 0x7e, 0x54, 0xb4, 0x18, 0x2b, 0x8f, 0xc9, 0x10, 0xf4, 0xa3, 0x66, 0xdf, 0xaa,
	0xd3, 0x1b, 0x94, 0x98, 0xe1, 0xf6, 0xe0, 0xb6, 0x3d, 0x67, 0xd4, 0x19, 0xb3, 0xa7, 0x1f, 0x97,
	0xa5, 0x53, 0xde, 0xa8, 0x92, 0x3f, 0x1b, 0xed, 0xd6, 0xe0, 0x6c, 0x88, 0xd0, 0x7b, 0x96, 0x62,
	0x57, 0xd0, 0xc8, 0x79, 0xba, 0x77, 0x1d, 0xea, 0xb9, 0x3c, 0xed, 0x99, 0x99, 0x24, 0x0f, 0x29,
	0xc3, 0xc6, 0xd0, 0xde, 0xec, 0xd2, 0xec, 0x4e, 0x25, 0x7b, 0xb7, 0xe6, 0xd5, 0x5f, 0xc9, 0x3f,
	0xe6, 0x86, 0x0f, 0x0e, 0xbc, 0x3b, 0xf1, 0x19, 0x83, 0x06, 0x8d, 0xc5, 0xa1, 0xb1, 0xd0, 0x37,
	0xfb, 0x04, 0x3d, 0x7d, 0xd0, 0xf7, 0x3a, 0x96, 0x0a, 0xef, 0xec, 0xc6, 0x94, 0x8b, 0xe9, 0x12,
	0x5c, 0x14, 0x8c, 0x5d, 0x42, 0xab, 0x1c, 0x79, 0x9d, 0xdc, 0x52, 0x31, 0x0f, 0xba, 0x56, 0x8b,
	0x78, 0x67, 0x45, 0xb1, 0xb1, 0x62, 0x21, 0x60, 0xb5, 0xb8, 0xb5, 0xe2, 0xb8, 0xb2, 0xab, 0xbf,
	0xd0, 0x7f, 0x3e, 0x58, 0xf6, 0x1e, 0x2e, 0xa2, 0x69, 0xb8, 0xfe, 0x1d, 0x47, 0xd3, 0xe5, 0x6a,
	0x11, 0x87, 0xd3, 0x1f, 0xab, 0xf9, 0x24, 0x1c, 0xbc, 0x79, 0x69, 0xdc, 0xac, 0x26, 0xf3, 0x78,
	0x7d, 0x3d, 0x70, 0x5e, 0x1a, 0xb3, 0x5f, 0xeb, 0xc9, 0x7c, 0x76, 0x33, 0xa8, 0x7d, 0x0f, 0xfe,
	0x7c, 0xd9, 0xa2, 0xbf, 0xd9, 0x29, 0xcc, 0x53, 0x9b, 0xfb, 0xa8, 0xb6, 0x41, 0x25, 0x50, 0x07,
	0xe9, 0xfe, 0x5e, 0xf1, 0x80, 0x9e, 0x63, 0xb0, 0xc5, 0x20, 0xe3, 0x42, 0xb4, 0x48, 0x7d, 0xfd,
	0x1f, 0x00, 0x00, 0xff, 0xff, 0x03, 0xc8, 0xad, 0xdb, 0xaf, 0x02, 0x00, 0x00,
}
