syntax = "proto3";

import "cmvr/api/common.proto";

package cmvr.api;

// AGV状态信息
message AgvStatusInfo {
  optional string id = 1;                      // AGV ID
  optional string vehicle_id = 2;              // 车辆ID
  optional string version = 3;                 // 软件版本
  optional string model = 4;                   // 型号
  optional string dsp_version = 5;             // DSP版本
  optional string current_ip = 6;              // 当前IP地址
  optional string mac = 7;                     // MAC地址
  optional int32 rssi = 8;                     // 信号强度
  optional int32 ret_code = 9;                 // 返回码
  optional string err_msg = 10;                // 错误信息
}

// 获取AGV状态命令
message GetAgvStatusInfoCommand {
  message Request {
    CommandHeader.Request header = 1;
  }

  message Feedback {
    CommandHeader.Feedback header = 1;
    AgvStatusInfo status = 2;
  }
}


// ===================== 电池状态查询 =====================
message AgvBatteryStatus {
  optional double battery_level = 1;        // 电池电量 [0,1]
  optional double battery_temp = 2;         // 电池温度 ℃
  optional bool charging = 3;               // 是否正在充电
  optional double voltage = 4;              // 电压 V
  optional double current = 5;               // 电流 A
  optional double max_charge_voltage = 6;   // 最大充电电压，-1=不支持
  optional double max_charge_current = 7;   // 最大充电电流，-1=不支持
  optional bool manual_charge = 8;          // 手动充电状态
  optional bool auto_charge = 9;            // 自动充电状态
  optional int32 battery_cycle = 10;        // 电池循环次数
  optional string battery_user_data = 11;   // 电池自定义数据
  optional string extra = 12;               // 客户自定义数据
  optional int32 ret_code = 13;             // 错误码
  optional string create_on = 14;           // 时间戳
  optional string err_msg = 15;             // 错误信息
}

message RobotStatusBatteryRequestData {
  optional bool simple = 1;  // true:仅简单数据 false:全量数据，默认false
}

message RobotStatusBatteryCommand {
  message Request {
    CommandHeader.Request header = 1;
    RobotStatusBatteryRequestData data = 2;
  }
  message Feedback {
    CommandHeader.Feedback header = 1;
    AgvBatteryStatus status = 2;
  }
}



// ===================== 机器人位置查询 =====================
message AgvRobotLocation {
  optional double x = 1;                // X坐标(m)
  optional double y = 2;                // Y坐标(m)
  optional double angle = 3;            // 姿态角(rad)
  optional double confidence = 4;       // 定位置信度[0,1]
  optional string current_station = 5;  // 当前最近站点ID
  optional string last_station = 6;     // 上一站点ID
  optional int32 loc_method = 7;        // 定位方式
  optional int32 ret_code = 8;          // 错误码
  optional string create_on = 9;        // 时间戳
  optional string err_msg = 10;         // 错误信息
}

message RobotStatusLocCommand {
  message Request {
    CommandHeader.Request header = 1;
  }
  message Feedback {
    CommandHeader.Feedback header = 1;
    AgvRobotLocation status = 2;
  }
}


// ===================== 地图下载 =====================
message RobotConfigDownloadMapRequestData {
  optional string map_name = 1;  // 地图名称
}

message AgvDownloadMapResult {
  optional int32 ret_code = 1;
  optional string create_on = 2;
  optional string err_msg = 3;
  optional string map_content = 4; // 完整地图JSON文本
}

message RobotConfigDownloadMapCommand {
  message Request {
    CommandHeader.Request header = 1;
    RobotConfigDownloadMapRequestData data = 2;
  }
  message Feedback {
    CommandHeader.Feedback header = 1;
    AgvDownloadMapResult status = 2;
  }
}



// 单条地图文件信息
message MapFileInfo {
  optional string name = 1;
  optional string modified = 2;
  optional int64 size = 3;
}

// 地图查询响应
message AgvMapStatus {
  optional string current_map = 1;
  optional string current_map_md5 = 2;
  repeated string maps = 3;
  repeated MapFileInfo map_files_info = 4;
  optional int32 ret_code = 5;
  optional string create_on = 6;
  optional string err_msg = 7;
}

// 查询地图状态命令
message RobotStatusMapCommand {
  message Request {
    CommandHeader.Request header = 1;
  }
  message Feedback {
    CommandHeader.Feedback header = 1;
    AgvMapStatus status = 2;
  }
}