syntax = "proto3"; package cmvr.api; import "google/protobuf/timestamp.proto"; enum CommandReasonCode { COMMAND_REASON_CODE_UNSPECIFIED = 0; COMMAND_REASON_CODE_NONE = 1; COMMAND_REASON_CODE_INVALID_ARGUMENT = 2; COMMAND_REASON_CODE_UNAUTHENTICATED = 3; COMMAND_REASON_CODE_PERMISSION_DENIED = 4; COMMAND_REASON_CODE_RECOVERY_RPC_DISABLED = 5; COMMAND_REASON_CODE_DEVICE_NOT_FOUND = 6; COMMAND_REASON_CODE_DEVICE_UNAVAILABLE = 7; COMMAND_REASON_CODE_UNSUPPORTED_COMMAND = 8; COMMAND_REASON_CODE_SYSTEM_STARTING = 9; COMMAND_REASON_CODE_SYSTEM_STOPPING = 10; COMMAND_REASON_CODE_SAFETY_LATCHED = 11; COMMAND_REASON_CODE_SAFETY_STATE_MISSING = 12; COMMAND_REASON_CODE_SAFETY_STATE_STALE = 13; COMMAND_REASON_CODE_HARDWARE_UNSAFE = 14; COMMAND_REASON_CODE_EMERGENCY_STOP_ACTIVE = 15; COMMAND_REASON_CODE_PROTECTIVE_STOP_ACTIVE = 16; COMMAND_REASON_CODE_DEVICE_DISCONNECTED = 17; COMMAND_REASON_CODE_DEVICE_FAULT = 18; COMMAND_REASON_CODE_DEVICE_NOT_READY = 19; COMMAND_REASON_CODE_DEVICE_STILL_MOVING = 20; COMMAND_REASON_CODE_CONTROL_BUSY = 21; COMMAND_REASON_CODE_GENERATION_MISMATCH = 22; COMMAND_REASON_CODE_COMMAND_ID_REQUIRED = 23; COMMAND_REASON_CODE_COMMAND_ID_CONFLICT = 24; COMMAND_REASON_CODE_RESULT_EVICTED = 25; COMMAND_REASON_CODE_LEDGER_EXHAUSTED = 26; COMMAND_REASON_CODE_BACKPRESSURE = 27; COMMAND_REASON_CODE_DEADLINE_EXCEEDED_BEFORE_DISPATCH = 28; COMMAND_REASON_CODE_OUTCOME_UNKNOWN = 29; COMMAND_REASON_CODE_PARTICIPANT_TIMEOUT = 30; COMMAND_REASON_CODE_STOP_UNCONFIRMED = 31; COMMAND_REASON_CODE_RECOVERY_EPOCH_MISMATCH = 32; COMMAND_REASON_CODE_RECOVERY_REASON_REQUIRED = 33; COMMAND_REASON_CODE_RECOVERY_AUDIT_FAILED = 34; COMMAND_REASON_CODE_INTERNAL_ERROR = 35; } enum CommandExecutionState { COMMAND_EXECUTION_STATE_UNSPECIFIED = 0; COMMAND_EXECUTION_STATE_RECEIVED = 1; COMMAND_EXECUTION_STATE_RESERVED = 2; COMMAND_EXECUTION_STATE_REJECTED_BEFORE_DISPATCH = 3; COMMAND_EXECUTION_STATE_ADMITTED = 4; COMMAND_EXECUTION_STATE_DISPATCHING = 5; COMMAND_EXECUTION_STATE_ACCEPTED_BY_HARDWARE = 6; COMMAND_EXECUTION_STATE_COMPLETED = 7; COMMAND_EXECUTION_STATE_FAILED = 8; COMMAND_EXECUTION_STATE_CANCELED_BEFORE_DISPATCH = 9; COMMAND_EXECUTION_STATE_OUTCOME_UNKNOWN = 10; } message DeviceLifecycle { enum Lifecycle { STATE_INIT = 0; STATE_READY = 1; STATE_RUNNING = 2; STATE_ERROR = 3; STATE_ESTOP = 4; STATE_STOP = 5; } Lifecycle state = 1; } message CommandHeader { message Request { string device_id = 1; // 目标设备名称 google.protobuf.Timestamp timestamp = 2; // 请求时间 string command_id = 3; string expected_service_instance_id = 4; optional uint64 expected_device_generation = 5; uint32 valid_for_ms = 6; } message Feedback { bool success = 1; // 是否成功 string error_message = 2; // 错误信息(成功时为空) google.protobuf.Timestamp timestamp = 3; // 回复时间 CommandReasonCode reason_code = 4; string command_id = 5; string service_instance_id = 6; uint64 safety_epoch = 7; uint64 device_generation = 8; CommandExecutionState execution_state = 9; } } message AudioData { enum AudioFormat { PCM = 0; MP3 = 1; AAC = 2; WAV = 3; OPUS = 4; } bytes data = 1; int32 sample_rate = 2; int32 channels = 3; AudioFormat format = 4; string codec = 5; int64 pts = 6; int32 nb_samples = 7; } message ConfigParam { string param_name = 1; oneof param_value { int32 int_value = 2; // 整数类型 double double_value = 3; // 浮点数类型 string string_value = 4; // 字符串类型 bool bool_value = 5; // 布尔类型 bytes bytes_value = 6; // 二进制数据类型 } } message JsonDeviceCommand { message Request { CommandHeader.Request header = 1; string request_json = 2; } message Feedback { CommandHeader.Feedback header = 1; string response_json = 2; } }