// Copyright 2020 The ChromiumOS Authors
// 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.27.1
// 	protoc        v3.17.1
// source: lab/servo.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)
)

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

// Enum value maps for ServoSetupType.
var (
	ServoSetupType_name = map[int32]string{
		0: "SERVO_SETUP_REGULAR",
		1: "SERVO_SETUP_DUAL_V4",
		2: "SERVO_SETUP_INVALID",
	}
	ServoSetupType_value = map[string]int32{
		"SERVO_SETUP_REGULAR": 0,
		"SERVO_SETUP_DUAL_V4": 1,
		"SERVO_SETUP_INVALID": 2,
	}
)

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

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

func (ServoSetupType) Descriptor() protoreflect.EnumDescriptor {
	return file_lab_servo_proto_enumTypes[0].Descriptor()
}

func (ServoSetupType) Type() protoreflect.EnumType {
	return &file_lab_servo_proto_enumTypes[0]
}

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

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

// Servo Firmware Channel describes the firmware expected to have on servos.
// Next Tag : 4
type ServoFwChannel int32

const (
	// Servo firmware from Stable channel.
	ServoFwChannel_SERVO_FW_STABLE ServoFwChannel = 0
	// The previous Servo firmware from Stable channel.
	ServoFwChannel_SERVO_FW_PREV ServoFwChannel = 1
	// Servo firmware from Dev channel.
	ServoFwChannel_SERVO_FW_DEV ServoFwChannel = 2
	// Servo firmware from Alpha channel.
	ServoFwChannel_SERVO_FW_ALPHA ServoFwChannel = 3
)

// Enum value maps for ServoFwChannel.
var (
	ServoFwChannel_name = map[int32]string{
		0: "SERVO_FW_STABLE",
		1: "SERVO_FW_PREV",
		2: "SERVO_FW_DEV",
		3: "SERVO_FW_ALPHA",
	}
	ServoFwChannel_value = map[string]int32{
		"SERVO_FW_STABLE": 0,
		"SERVO_FW_PREV":   1,
		"SERVO_FW_DEV":    2,
		"SERVO_FW_ALPHA":  3,
	}
)

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

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

func (ServoFwChannel) Descriptor() protoreflect.EnumDescriptor {
	return file_lab_servo_proto_enumTypes[1].Descriptor()
}

func (ServoFwChannel) Type() protoreflect.EnumType {
	return &file_lab_servo_proto_enumTypes[1]
}

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

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

// NEXT TAG: 10
type Servo struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// 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"`
	ServoFwChannel ServoFwChannel `protobuf:"varint,9,opt,name=servo_fw_channel,json=servoFwChannel,proto3,enum=lab.ServoFwChannel" json:"servo_fw_channel,omitempty"`
}

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

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

func (*Servo) ProtoMessage() {}

func (x *Servo) ProtoReflect() protoreflect.Message {
	mi := &file_lab_servo_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 Servo.ProtoReflect.Descriptor instead.
func (*Servo) Descriptor() ([]byte, []int) {
	return file_lab_servo_proto_rawDescGZIP(), []int{0}
}

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

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

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

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

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

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

func (x *Servo) GetServoFwChannel() ServoFwChannel {
	if x != nil {
		return x.ServoFwChannel
	}
	return ServoFwChannel_SERVO_FW_STABLE
}

// Servo Topology describe connected servo devices on DUT set-up to provide
// Servo functionality. Next Tag : 3
type ServoTopology struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Main     *ServoTopologyItem   `protobuf:"bytes,1,opt,name=main,proto3" json:"main,omitempty"`
	Children []*ServoTopologyItem `protobuf:"bytes,2,rep,name=children,proto3" json:"children,omitempty"`
}

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

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

func (*ServoTopology) ProtoMessage() {}

func (x *ServoTopology) ProtoReflect() protoreflect.Message {
	mi := &file_lab_servo_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 ServoTopology.ProtoReflect.Descriptor instead.
func (*ServoTopology) Descriptor() ([]byte, []int) {
	return file_lab_servo_proto_rawDescGZIP(), []int{1}
}

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

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

// Servo Topology Item describe details of one servo device on DUT set-up.
// Next Tag : 6
type ServoTopologyItem struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// 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 provides 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 provides the serial number of the device.
	Serial string `protobuf:"bytes,3,opt,name=serial,proto3" json:"serial,omitempty"`
	// usb_hub_port provides 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"`
	// This is the firmware version of servo device.
	FwVersion string `protobuf:"bytes,5,opt,name=fw_version,json=fwVersion,proto3" json:"fw_version,omitempty"`
}

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

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

func (*ServoTopologyItem) ProtoMessage() {}

func (x *ServoTopologyItem) ProtoReflect() protoreflect.Message {
	mi := &file_lab_servo_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 ServoTopologyItem.ProtoReflect.Descriptor instead.
func (*ServoTopologyItem) Descriptor() ([]byte, []int) {
	return file_lab_servo_proto_rawDescGZIP(), []int{2}
}

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

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

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

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

func (x *ServoTopologyItem) GetFwVersion() string {
	if x != nil {
		return x.FwVersion
	}
	return ""
}

var File_lab_servo_proto protoreflect.FileDescriptor

var file_lab_servo_proto_rawDesc = []byte{
	0x0a, 0x0f, 0x6c, 0x61, 0x62, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x12, 0x03, 0x6c, 0x61, 0x62, 0x22, 0xc5, 0x02, 0x0a, 0x05, 0x53, 0x65, 0x72, 0x76, 0x6f,
	0x12, 0x25, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x6f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61,
	0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x6f, 0x48,
	0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x6f,
	0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x65, 0x72,
	0x76, 0x6f, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x6f, 0x5f,
	0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65,
	0x72, 0x76, 0x6f, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72,
	0x76, 0x6f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73,
	0x65, 0x72, 0x76, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x34, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76,
	0x6f, 0x5f, 0x73, 0x65, 0x74, 0x75, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e,
	0x6c, 0x61, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x6f, 0x53, 0x65, 0x74, 0x75, 0x70, 0x54, 0x79,
	0x70, 0x65, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x6f, 0x53, 0x65, 0x74, 0x75, 0x70, 0x12, 0x39,
	0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x6f, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79,
	0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x53, 0x65, 0x72,
	0x76, 0x6f, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76,
	0x6f, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x3d, 0x0a, 0x10, 0x73, 0x65, 0x72,
	0x76, 0x6f, 0x5f, 0x66, 0x77, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x09, 0x20,
	0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x6f, 0x46,
	0x77, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x6f, 0x46,
	0x77, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x6f,
	0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x6f, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12,
	0x2a, 0x0a, 0x04, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e,
	0x6c, 0x61, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x6f, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67,
	0x79, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x32, 0x0a, 0x08, 0x63,
	0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e,
	0x6c, 0x61, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x6f, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67,
	0x79, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22,
	0xa5, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x6f, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67,
	0x79, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x79, 0x73,
	0x66, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x0c, 0x73, 0x79, 0x73, 0x66, 0x73, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x16,
	0x0a, 0x06, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
	0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x75, 0x73, 0x62, 0x5f, 0x68, 0x75,
	0x62, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x73,
	0x62, 0x48, 0x75, 0x62, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x77, 0x5f, 0x76,
	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x77,
	0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2a, 0x5b, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x6f,
	0x53, 0x65, 0x74, 0x75, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x45, 0x52,
	0x56, 0x4f, 0x5f, 0x53, 0x45, 0x54, 0x55, 0x50, 0x5f, 0x52, 0x45, 0x47, 0x55, 0x4c, 0x41, 0x52,
	0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x45, 0x52, 0x56, 0x4f, 0x5f, 0x53, 0x45, 0x54, 0x55,
	0x50, 0x5f, 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x56, 0x34, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x53,
	0x45, 0x52, 0x56, 0x4f, 0x5f, 0x53, 0x45, 0x54, 0x55, 0x50, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c,
	0x49, 0x44, 0x10, 0x02, 0x2a, 0x5e, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x6f, 0x46, 0x77, 0x43,
	0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x45, 0x52, 0x56, 0x4f, 0x5f,
	0x46, 0x57, 0x5f, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x53,
	0x45, 0x52, 0x56, 0x4f, 0x5f, 0x46, 0x57, 0x5f, 0x50, 0x52, 0x45, 0x56, 0x10, 0x01, 0x12, 0x10,
	0x0a, 0x0c, 0x53, 0x45, 0x52, 0x56, 0x4f, 0x5f, 0x46, 0x57, 0x5f, 0x44, 0x45, 0x56, 0x10, 0x02,
	0x12, 0x12, 0x0a, 0x0e, 0x53, 0x45, 0x52, 0x56, 0x4f, 0x5f, 0x46, 0x57, 0x5f, 0x41, 0x4c, 0x50,
	0x48, 0x41, 0x10, 0x03, 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_servo_proto_rawDescOnce sync.Once
	file_lab_servo_proto_rawDescData = file_lab_servo_proto_rawDesc
)

func file_lab_servo_proto_rawDescGZIP() []byte {
	file_lab_servo_proto_rawDescOnce.Do(func() {
		file_lab_servo_proto_rawDescData = protoimpl.X.CompressGZIP(file_lab_servo_proto_rawDescData)
	})
	return file_lab_servo_proto_rawDescData
}

var file_lab_servo_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
var file_lab_servo_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_lab_servo_proto_goTypes = []interface{}{
	(ServoSetupType)(0),       // 0: lab.ServoSetupType
	(ServoFwChannel)(0),       // 1: lab.ServoFwChannel
	(*Servo)(nil),             // 2: lab.Servo
	(*ServoTopology)(nil),     // 3: lab.ServoTopology
	(*ServoTopologyItem)(nil), // 4: lab.ServoTopologyItem
}
var file_lab_servo_proto_depIdxs = []int32{
	0, // 0: lab.Servo.servo_setup:type_name -> lab.ServoSetupType
	3, // 1: lab.Servo.servo_topology:type_name -> lab.ServoTopology
	1, // 2: lab.Servo.servo_fw_channel:type_name -> lab.ServoFwChannel
	4, // 3: lab.ServoTopology.main:type_name -> lab.ServoTopologyItem
	4, // 4: lab.ServoTopology.children:type_name -> lab.ServoTopologyItem
	5, // [5:5] is the sub-list for method output_type
	5, // [5:5] is the sub-list for method input_type
	5, // [5:5] is the sub-list for extension type_name
	5, // [5:5] is the sub-list for extension extendee
	0, // [0:5] is the sub-list for field type_name
}

func init() { file_lab_servo_proto_init() }
func file_lab_servo_proto_init() {
	if File_lab_servo_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_lab_servo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Servo); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_lab_servo_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ServoTopology); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_lab_servo_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ServoTopologyItem); 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_servo_proto_rawDesc,
			NumEnums:      2,
			NumMessages:   3,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_lab_servo_proto_goTypes,
		DependencyIndexes: file_lab_servo_proto_depIdxs,
		EnumInfos:         file_lab_servo_proto_enumTypes,
		MessageInfos:      file_lab_servo_proto_msgTypes,
	}.Build()
	File_lab_servo_proto = out.File
	file_lab_servo_proto_rawDesc = nil
	file_lab_servo_proto_goTypes = nil
	file_lab_servo_proto_depIdxs = nil
}
