// 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: 15
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.
	// cr50 console missing or unresponsive.
	PeripheralState_CR50_CONSOLE_MISSING PeripheralState = 13
	// 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
	// Servo is not connected to the DUT.
	PeripheralState_DUT_NOT_CONNECTED PeripheralState = 14
)

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",
	13: "CR50_CONSOLE_MISSING",
	8:  "CCD_TESTLAB_ISSUE",
	9:  "SERVOD_ISSUE",
	10: "LID_OPEN_FAILED",
	11: "BAD_RIBBON_CABLE",
	12: "EC_BROKEN",
	14: "DUT_NOT_CONNECTED",
}

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,
	"CR50_CONSOLE_MISSING": 13,
	"CCD_TESTLAB_ISSUE":    8,
	"SERVOD_ISSUE":         9,
	"LID_OPEN_FAILED":      10,
	"BAD_RIBBON_CABLE":     11,
	"EC_BROKEN":            12,
	"DUT_NOT_CONNECTED":    14,
}

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

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

// The states are using for DUT storage and USB-drive on servo.
// Next Tag: 5
type HardwareState int32

const (
	// keep for all unknown state by default.
	HardwareState_HARDWARE_UNKNOWN HardwareState = 0
	// Hardware is in good shape and pass all verifiers.
	HardwareState_HARDWARE_NORMAL HardwareState = 1
	// Hardware is still good but some not critical verifiers did not pass or provided border values.
	// (used for DUT storage when usage reached 98%)
	HardwareState_HARDWARE_ACCEPTABLE HardwareState = 2
	// Hardware is broken or bad (did not pass verifiers).
	HardwareState_HARDWARE_NEED_REPLACEMENT HardwareState = 3
	// Hardware is not detected to run verifiers.
	// (used for USB-drive when it expected but not detected on the device)
	HardwareState_HARDWARE_NOT_DETECTED HardwareState = 4
)

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

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

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