syntax = "proto3";

package cmvr.api;

import "cmvr/api/common.proto";
import "cmvr/msgs/agv.proto";

// 查询 AGV 运行状态命令。
message AgvRuntimeStateCommand {
  // 请求体。
  message Request {
    // 通用请求头。header.device_id 指定目标 AGV 设备。
    CommandHeader.Request header = 1;
  }
  // 反馈体。
  message Feedback {
    // 通用反馈头。包含成功标志、错误信息和反馈时间戳。
    CommandHeader.Feedback header = 1;
    // AGV 当前运行状态快照。
    cmvr.msgs.AgvRuntimeState state = 2;
  }
}

// 查询 AGV 当前导航任务状态命令。
message AgvNavigationStatusCommand {
  // 请求体。
  message Request {
    // 通用请求头。header.device_id 指定目标 AGV 设备。
    CommandHeader.Request header = 1;
  }
  // 反馈体。
  message Feedback {
    // 通用反馈头。包含成功标志、错误信息和反馈时间戳。
    CommandHeader.Feedback header = 1;
    // 当前导航任务状态。
    cmvr.msgs.AgvNavigationStatus status = 2;
  }
}

// 导航到指定地图位姿命令。
message AgvNavigateToPoseCommand {
  // 请求体。
  message Request {
    // 通用请求头。header.device_id 指定目标 AGV 设备。
    CommandHeader.Request header = 1;
    // 目标位姿。x/y 单位：米，theta 单位：弧度。
    cmvr.msgs.AgvPose2d pose = 2;
    // 通用运动约束和执行选项。
    cmvr.msgs.AgvMotionOptions options = 3;
    // AGV 适配器扩展参数，用于传递厂商特有选项。
    cmvr.msgs.AgvAdapterParams adapter_params = 4;
  }
  // 反馈体。
  message Feedback {
    // 通用反馈头。包含成功标志、错误信息和反馈时间戳。
    CommandHeader.Feedback header = 1;
  }
}

// 导航到指定站点命令。
message AgvNavigateToStationCommand {
  // 请求体。
  message Request {
    // 通用请求头。header.device_id 指定目标 AGV 设备。
    CommandHeader.Request header = 1;
    // 目标站点 id。
    string station_id = 2;
    // 通用运动约束和执行选项。
    cmvr.msgs.AgvMotionOptions options = 3;
    // AGV 适配器扩展参数，用于传递厂商特有选项。
    cmvr.msgs.AgvAdapterParams adapter_params = 4;
  }
  // 反馈体。
  message Feedback {
    // 通用反馈头。包含成功标志、错误信息和反馈时间戳。
    CommandHeader.Feedback header = 1;
  }
}

// 按显式站点路径导航命令。
message AgvFollowPathCommand {
  // 请求体。
  message Request {
    // 通用请求头。header.device_id 指定目标 AGV 设备。
    CommandHeader.Request header = 1;
    // 路径段列表。每段包含起点站点 id 和终点站点 id。
    repeated cmvr.msgs.AgvPathSegment path = 2;
  }
  // 反馈体。
  message Feedback {
    // 通用反馈头。包含成功标志、错误信息和反馈时间戳。
    CommandHeader.Feedback header = 1;
  }
}

// 下发底盘速度命令。
message AgvSetVelocityCommand {
  // 请求体。
  message Request {
    // 通用请求头。header.device_id 指定目标 AGV 设备。
    CommandHeader.Request header = 1;
    // 目标车体速度。vx/vy 单位：米/秒，wz 单位：弧度/秒。
    cmvr.msgs.AgvVelocity velocity = 2;
  }
  // 反馈体。
  message Feedback {
    // 通用反馈头。包含成功标志、错误信息和反馈时间戳。
    CommandHeader.Feedback header = 1;
  }
}

// 查询可用地图列表命令。
message AgvListMapsCommand {
  // 请求体。
  message Request {
    // 通用请求头。header.device_id 指定目标 AGV 设备。
    CommandHeader.Request header = 1;
  }
  // 反馈体。
  message Feedback {
    // 通用反馈头。包含成功标志、错误信息和反馈时间戳。
    CommandHeader.Feedback header = 1;
    // 地图名称列表。
    repeated string maps = 2;
  }
}

// 查询当前地图站点列表命令。
message AgvListStationsCommand {
  // 请求体。
  message Request {
    // 通用请求头。header.device_id 指定目标 AGV 设备。
    CommandHeader.Request header = 1;
  }
  // 反馈体。
  message Feedback {
    // 通用反馈头。包含成功标志、错误信息和反馈时间戳。
    CommandHeader.Feedback header = 1;
    // 当前地图中的站点列表。
    repeated cmvr.msgs.AgvStation stations = 2;
  }
}

// 地图上传、下载、切换等通用地图命令。
message AgvMapCommand {
  // 请求体。
  message Request {
    // 通用请求头。header.device_id 指定目标 AGV 设备。
    CommandHeader.Request header = 1;
    // 地图名称。切换/下载时表示目标地图，上传时表示写入的地图名称。
    string map_name = 2;
    // 地图内容。上传地图时使用；下载或切换地图时可为空。
    string content = 3;
  }
  // 反馈体。
  message Feedback {
    // 通用反馈头。包含成功标志、错误信息和反馈时间戳。
    CommandHeader.Feedback header = 1;
    // 地图内容。下载地图时返回；其他命令通常为空。
    string content = 2;
  }
}

// 开始建图/扫图命令。
message AgvStartMappingCommand {
  // 请求体。
  message Request {
    // 通用请求头。header.device_id 指定目标 AGV 设备。
    CommandHeader.Request header = 1;
    // 请求建图维度：2D、3D 或二者都要。未指定时由适配器选择最合适模式。
    cmvr.msgs.AgvMapDimension dimension = 2;
    // 目标地图名称。为空表示由 AGV 或适配器创建/选择默认地图名。
    string map_name = 3;
    // 是否请求实时建图更新。true 表示希望实时推送；false 表示允许离线/批处理。
    bool real_time = 4;
  }
  // 反馈体。
  message Feedback {
    // 通用反馈头。包含成功标志、错误信息和反馈时间戳。
    CommandHeader.Feedback header = 1;
    // 建图会话 id。该值由服务端生成，作为调试和日志关联标识。
    string session_id = 2;
  }
}

// 地图流命令。用于获取当前地图、最近地图、全量快照和后续增量更新。
message AgvMapStreamCommand {
  // 请求体。
  message Request {
    // 通用请求头。header.device_id 指定目标 AGV 设备。
    CommandHeader.Request header = 1;
    // 请求地图维度：2D、3D 或二者都要。该字段不是厂商格式选择器。
    cmvr.msgs.AgvMapDimension dimension = 2;
    // 地图名称。为空表示当前加载地图；若无当前地图，适配器应尝试使用最近保存/创建的地图。
    string map_name = 3;
    // 断点续传令牌。为空表示上位机没有缓存，服务端应先发送全量快照。
    string resume_token = 4;
    // 是否请求全量快照。首次请求通常应为 true。
    bool snapshot = 5;
    // 是否在快照之后保持流并发送增量更新。若适配器不支持增量，可继续发送全量并标记 update_type。
    bool incremental = 6;
    // 单条流消息建议最大载荷大小，单位：字节。小于等于 0 表示使用服务端默认值。
    int32 max_chunk_bytes = 7;
  }
  // 反馈体。
  message Feedback {
    // 通用反馈头。包含成功标志、错误信息和反馈时间戳。
    CommandHeader.Feedback header = 1;
    // 统一地图更新。payload 只会是 map_2d 或 map_3d，不暴露厂商原始格式。
    cmvr.msgs.AgvUnifiedMapUpdate update = 2;
  }
}
