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

// NEXT TAG: 6
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"`
	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 init() {
	proto.RegisterType((*Servo)(nil), "lab.Servo")
}

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

var fileDescriptor_34a04ba68a815039 = []byte{
	// 188 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0xcf, 0x49, 0x4c, 0xd2,
	0x2f, 0x4e, 0x2d, 0x2a, 0xcb, 0xd7, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0xce, 0x49, 0x4c,
	0x52, 0xea, 0x67, 0xe4, 0x62, 0x0d, 0x06, 0x09, 0x0a, 0xa9, 0x72, 0xf1, 0x81, 0x65, 0xe3, 0x33,
	0xf2, 0x8b, 0x4b, 0xf2, 0x12, 0x73, 0x53, 0x25, 0x98, 0x14, 0x18, 0x35, 0x38, 0x83, 0x78, 0xc1,
	0xa2, 0x1e, 0x50, 0x41, 0x21, 0x59, 0x2e, 0x2e, 0x88, 0xb2, 0x82, 0xfc, 0xa2, 0x12, 0x09, 0x66,
	0x05, 0x46, 0x0d, 0xd6, 0x20, 0x4e, 0xb0, 0x48, 0x40, 0x7e, 0x51, 0x89, 0x90, 0x22, 0x17, 0x0f,
	0x44, 0xba, 0x38, 0xb5, 0x28, 0x33, 0x31, 0x47, 0x82, 0x05, 0x6c, 0x06, 0x37, 0x58, 0x2c, 0x18,
	0x2c, 0x84, 0x30, 0xa1, 0xa4, 0xb2, 0x20, 0x55, 0x82, 0x15, 0xac, 0x00, 0x62, 0x42, 0x48, 0x65,
	0x41, 0xaa, 0x93, 0x7e, 0x94, 0x6e, 0x7a, 0xbe, 0x5e, 0x72, 0x46, 0x51, 0x7e, 0x6e, 0x66, 0x69,
	0xae, 0x5e, 0x7e, 0x51, 0xba, 0x3e, 0x8c, 0x93, 0x5f, 0xac, 0x9f, 0x99, 0x97, 0x56, 0x94, 0xa8,
	0x0f, 0xf6, 0x80, 0x7e, 0x7a, 0xbe, 0x7e, 0x4e, 0x62, 0x52, 0x12, 0x1b, 0x98, 0x67, 0x0c, 0x08,
	0x00, 0x00, 0xff, 0xff, 0xff, 0x48, 0xdb, 0xc6, 0xe1, 0x00, 0x00, 0x00,
}
