// Code generated by protoc-gen-go. DO NOT EDIT.
// source: lab/dut_state.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: 13
type PeripheralState int32

const (
	// Please keep for all unknown states.
	PeripheralState_UNKNOWN PeripheralState = 0
	// Device and software on it is working as expected.
	PeripheralState_WORKING PeripheralState = 1
	// Configuration for device is not provided.
	PeripheralState_MISSING_CONFIG PeripheralState = 5
	// Configuration contains incorrect information.
	PeripheralState_WRONG_CONFIG PeripheralState = 4
	// Device is not connected/plugged.
	PeripheralState_NOT_CONNECTED PeripheralState = 2
	// Device is not reachable over ssh.
	PeripheralState_NO_SSH PeripheralState = 6
	// Device is broken or not working as expected. the state used if no specified state for the issue.
	PeripheralState_BROKEN PeripheralState = 3
	// Device cannot be repaired or required manual attention to fix/replace it.
	PeripheralState_NEED_REPLACEMENT PeripheralState = 7
	// Servo specific states.
	// Servod daemon cannot start on servo-host because cr50 testlab not enabled.
	PeripheralState_CCD_TESTLAB_ISSUE PeripheralState = 8
	// Servod daemon cannot start on servo-host.
	PeripheralState_SERVOD_ISSUE PeripheralState = 9
	// device lid is not open.
	PeripheralState_LID_OPEN_FAILED PeripheralState = 10
	// the ribbon cable between servo and DUT is broken or not connected.
	PeripheralState_BAD_RIBBON_CABLE PeripheralState = 11
	// the EC on the DUT has issue.
	PeripheralState_EC_BROKEN PeripheralState = 12
)

var PeripheralState_name = map[int32]string{
	0:  "UNKNOWN",
	1:  "WORKING",
	5:  "MISSING_CONFIG",
	4:  "WRONG_CONFIG",
	2:  "NOT_CONNECTED",
	6:  "NO_SSH",
	3:  "BROKEN",
	7:  "NEED_REPLACEMENT",
	8:  "CCD_TESTLAB_ISSUE",
	9:  "SERVOD_ISSUE",
	10: "LID_OPEN_FAILED",
	11: "BAD_RIBBON_CABLE",
	12: "EC_BROKEN",
}

var PeripheralState_value = map[string]int32{
	"UNKNOWN":           0,
	"WORKING":           1,
	"MISSING_CONFIG":    5,
	"WRONG_CONFIG":      4,
	"NOT_CONNECTED":     2,
	"NO_SSH":            6,
	"BROKEN":            3,
	"NEED_REPLACEMENT":  7,
	"CCD_TESTLAB_ISSUE": 8,
	"SERVOD_ISSUE":      9,
	"LID_OPEN_FAILED":   10,
	"BAD_RIBBON_CABLE":  11,
	"EC_BROKEN":         12,
}

func (x PeripheralState) String() string {
	return proto.EnumName(PeripheralState_name, int32(x))
}

func (PeripheralState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_bfe5ddd3f74c848d, []int{0}
}

// Next Tag: 4
type HardwareState int32

const (
	// keep for all unknown state by default.
	HardwareState_HARDWARE_UNKNOWN          HardwareState = 0
	HardwareState_HARDWARE_NORMAL           HardwareState = 1
	HardwareState_HARDWARE_ACCEPTABLE       HardwareState = 2
	HardwareState_HARDWARE_NEED_REPLACEMENT HardwareState = 3
)

var HardwareState_name = map[int32]string{
	0: "HARDWARE_UNKNOWN",
	1: "HARDWARE_NORMAL",
	2: "HARDWARE_ACCEPTABLE",
	3: "HARDWARE_NEED_REPLACEMENT",
}

var HardwareState_value = map[string]int32{
	"HARDWARE_UNKNOWN":          0,
	"HARDWARE_NORMAL":           1,
	"HARDWARE_ACCEPTABLE":       2,
	"HARDWARE_NEED_REPLACEMENT": 3,
}

func (x HardwareState) String() string {
	return proto.EnumName(HardwareState_name, int32(x))
}

func (HardwareState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_bfe5ddd3f74c848d, []int{1}
}

// CR50-related configs by definition shouldn't be a state config, but a build config.
// However, we don't have a way to source it from any external configuration system,
// and it's changed frequently enough to handle cr50 tests, which makes
// it basically impossible for manual updatings: See crbug.com/1057145 for the
// troubles it causes.
//
// So we temporarily set it in state config so that repair job can update it.
// For further changes of it, please see tracking bug crbug.com/1057719.
//
// phases for cr50 module. Next Tag: 3
type DutState_CR50Phase int32

const (
	DutState_CR50_PHASE_INVALID DutState_CR50Phase = 0
	DutState_CR50_PHASE_PREPVT  DutState_CR50Phase = 1
	DutState_CR50_PHASE_PVT     DutState_CR50Phase = 2
)

var DutState_CR50Phase_name = map[int32]string{
	0: "CR50_PHASE_INVALID",
	1: "CR50_PHASE_PREPVT",
	2: "CR50_PHASE_PVT",
}

var DutState_CR50Phase_value = map[string]int32{
	"CR50_PHASE_INVALID": 0,
	"CR50_PHASE_PREPVT":  1,
	"CR50_PHASE_PVT":     2,
}

func (x DutState_CR50Phase) String() string {
	return proto.EnumName(DutState_CR50Phase_name, int32(x))
}

func (DutState_CR50Phase) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_bfe5ddd3f74c848d, []int{0, 0}
}

// key env for cr50 RW version. Next Tag: 3
type DutState_CR50KeyEnv int32

const (
	DutState_CR50_KEYENV_INVALID DutState_CR50KeyEnv = 0
	DutState_CR50_KEYENV_PROD    DutState_CR50KeyEnv = 1
	DutState_CR50_KEYENV_DEV     DutState_CR50KeyEnv = 2
)

var DutState_CR50KeyEnv_name = map[int32]string{
	0: "CR50_KEYENV_INVALID",
	1: "CR50_KEYENV_PROD",
	2: "CR50_KEYENV_DEV",
}

var DutState_CR50KeyEnv_value = map[string]int32{
	"CR50_KEYENV_INVALID": 0,
	"CR50_KEYENV_PROD":    1,
	"CR50_KEYENV_DEV":     2,
}

func (x DutState_CR50KeyEnv) String() string {
	return proto.EnumName(DutState_CR50KeyEnv_name, int32(x))
}

func (DutState_CR50KeyEnv) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_bfe5ddd3f74c848d, []int{0, 1}
}

// Next Tag: 10
type DutState struct {
	Id                  *ChromeOSDeviceID `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	Servo               PeripheralState   `protobuf:"varint,2,opt,name=servo,proto3,enum=lab.PeripheralState" json:"servo,omitempty"`
	Chameleon           PeripheralState   `protobuf:"varint,3,opt,name=chameleon,proto3,enum=lab.PeripheralState" json:"chameleon,omitempty"`
	AudioLoopbackDongle PeripheralState   `protobuf:"varint,4,opt,name=audio_loopback_dongle,json=audioLoopbackDongle,proto3,enum=lab.PeripheralState" json:"audio_loopback_dongle,omitempty"`
	// Indicate how many working bluetooth btpeer for a device.
	WorkingBluetoothBtpeer int32              `protobuf:"varint,5,opt,name=working_bluetooth_btpeer,json=workingBluetoothBtpeer,proto3" json:"working_bluetooth_btpeer,omitempty"`
	Cr50Phase              DutState_CR50Phase `protobuf:"varint,6,opt,name=cr50_phase,json=cr50Phase,proto3,enum=lab.DutState_CR50Phase" json:"cr50_phase,omitempty"`
	// Detected based on the cr50 RW version that the DUT is running on.
	Cr50KeyEnv DutState_CR50KeyEnv `protobuf:"varint,7,opt,name=cr50_key_env,json=cr50KeyEnv,proto3,enum=lab.DutState_CR50KeyEnv" json:"cr50_key_env,omitempty"`
	// Detected during running admin_audit task.
	StorageState         HardwareState `protobuf:"varint,8,opt,name=storage_state,json=storageState,proto3,enum=lab.HardwareState" json:"storage_state,omitempty"`
	ServoUsbState        HardwareState `protobuf:"varint,9,opt,name=servo_usb_state,json=servoUsbState,proto3,enum=lab.HardwareState" json:"servo_usb_state,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

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

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

var xxx_messageInfo_DutState proto.InternalMessageInfo

func (m *DutState) GetId() *ChromeOSDeviceID {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *DutState) GetServo() PeripheralState {
	if m != nil {
		return m.Servo
	}
	return PeripheralState_UNKNOWN
}

func (m *DutState) GetChameleon() PeripheralState {
	if m != nil {
		return m.Chameleon
	}
	return PeripheralState_UNKNOWN
}

func (m *DutState) GetAudioLoopbackDongle() PeripheralState {
	if m != nil {
		return m.AudioLoopbackDongle
	}
	return PeripheralState_UNKNOWN
}

func (m *DutState) GetWorkingBluetoothBtpeer() int32 {
	if m != nil {
		return m.WorkingBluetoothBtpeer
	}
	return 0
}

func (m *DutState) GetCr50Phase() DutState_CR50Phase {
	if m != nil {
		return m.Cr50Phase
	}
	return DutState_CR50_PHASE_INVALID
}

func (m *DutState) GetCr50KeyEnv() DutState_CR50KeyEnv {
	if m != nil {
		return m.Cr50KeyEnv
	}
	return DutState_CR50_KEYENV_INVALID
}

func (m *DutState) GetStorageState() HardwareState {
	if m != nil {
		return m.StorageState
	}
	return HardwareState_HARDWARE_UNKNOWN
}

func (m *DutState) GetServoUsbState() HardwareState {
	if m != nil {
		return m.ServoUsbState
	}
	return HardwareState_HARDWARE_UNKNOWN
}

func init() {
	proto.RegisterEnum("lab.PeripheralState", PeripheralState_name, PeripheralState_value)
	proto.RegisterEnum("lab.HardwareState", HardwareState_name, HardwareState_value)
	proto.RegisterEnum("lab.DutState_CR50Phase", DutState_CR50Phase_name, DutState_CR50Phase_value)
	proto.RegisterEnum("lab.DutState_CR50KeyEnv", DutState_CR50KeyEnv_name, DutState_CR50KeyEnv_value)
	proto.RegisterType((*DutState)(nil), "lab.DutState")
}

func init() { proto.RegisterFile("lab/dut_state.proto", fileDescriptor_bfe5ddd3f74c848d) }

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