syntax = "proto3";

package device;

// import "google/protobuf/any.proto"; // REMOVED: Not suitable for embedded systems.

option go_package = "internal/domain/device/proto";

// --- Concrete Command & Data Structures ---

// 平台生成的原始485指令，单片机直接发送到总线
message Raw485Command {
  int32 bus_number = 1;    // 总线号，用于指示单片机将指令发送到哪个总线
  bytes command_bytes = 2; // 原始485指令的字节数组
}

// BatchCollectCommand
// 一个完整的、包含所有元数据的批量采集任务。
message BatchCollectCommand {
  string correlation_id = 1;        // 用于关联请求和响应的唯一ID
  repeated CollectTask tasks = 2;   // 采集任务列表
}

// CollectTask
// 定义了单个采集任务的“意图”。
message CollectTask {
  Raw485Command command = 1; // 平台生成的原始485指令
}

// CollectResult
// 这是设备响应的、极致精简的数据包。
message CollectResult {
  string correlation_id = 1;   // 从下行指令中原样返回的关联ID
  repeated float values = 2;   // 按预定顺序排列的采集值
}


// --- Main Downlink Instruction Wrapper ---

// 指令 (所有从平台下发到设备的数据都应该被包装在这里面)
// 使用 oneof 来替代 google.protobuf.Any，这是嵌入式环境下的标准做法。
// 它高效、类型安全，且只解码一次。
message Instruction {
  oneof payload {
    Raw485Command raw_485_command = 1;
    BatchCollectCommand batch_collect_command = 2;
    CollectResult collect_result = 3; // ADDED：用于上行数据
    // 如果未来有其他指令类型，比如开关控制，可以直接在这里添加
    // SwitchCommand switch_command = 3;
  }
}
