syntax = "proto3";

package cmvr.api;

import "cmvr/api/common.proto";
import "cmvr/api/agv_command.proto";

// AGV 通用服务。该服务只暴露控制器无关的能力，
// 厂商协议、地图文件格式和控制器特有参数由具体 AGV 适配器内部处理。
service AgvService {
  // 获取 AGV 当前运行状态快照。
  rpc getRuntimeState(AgvRuntimeStateCommand.Request) returns (AgvRuntimeStateCommand.Feedback);

  // 获取当前导航任务状态。
  rpc getNavigationStatus(AgvNavigationStatusCommand.Request) returns (AgvNavigationStatusCommand.Feedback);

  // 执行急停或等效安全停止动作。
  rpc emergencyStop(CommandHeader.Request) returns (CommandHeader.Feedback);

  // 清除可恢复故障或告警。
  rpc clearFault(CommandHeader.Request) returns (CommandHeader.Feedback);

  // 导航到指定地图位姿。目标位姿 x/y 单位为米，theta 单位为弧度。
  rpc navigateToPose(AgvNavigateToPoseCommand.Request) returns (AgvNavigateToPoseCommand.Feedback);

  // 导航到指定地图站点。
  rpc navigateToStation(AgvNavigateToStationCommand.Request) returns (AgvNavigateToStationCommand.Feedback);

  // 按显式站点路径执行导航。
  rpc followPath(AgvFollowPathCommand.Request) returns (AgvFollowPathCommand.Feedback);

  // 暂停当前导航任务。
  rpc pauseNavigation(CommandHeader.Request) returns (CommandHeader.Feedback);

  // 恢复已暂停的导航任务。
  rpc resumeNavigation(CommandHeader.Request) returns (CommandHeader.Feedback);

  // 取消当前导航任务。
  rpc cancelNavigation(CommandHeader.Request) returns (CommandHeader.Feedback);

  // 下发底盘速度控制指令。vx/vy 单位为米/秒，wz 单位为弧度/秒。
  rpc setVelocity(AgvSetVelocityCommand.Request) returns (AgvSetVelocityCommand.Feedback);

  // 停止底盘速度控制。该接口不等价于取消导航任务。
  rpc stopVelocityControl(CommandHeader.Request) returns (CommandHeader.Feedback);

  // 查询 AGV 控制器可用地图名称列表。
  rpc listMaps(AgvListMapsCommand.Request) returns (AgvListMapsCommand.Feedback);

  // 查询当前地图中的站点列表。
  rpc listStations(AgvListStationsCommand.Request) returns (AgvListStationsCommand.Feedback);

  // 切换当前使用地图。
  rpc switchMap(AgvMapCommand.Request) returns (AgvMapCommand.Feedback);

  // 上传地图内容到 AGV 控制器。地图内容字段由适配器解释。
  rpc uploadMap(AgvMapCommand.Request) returns (AgvMapCommand.Feedback);

  // 下载指定地图内容。
  rpc downloadMap(AgvMapCommand.Request) returns (AgvMapCommand.Feedback);

  // 开始建图/扫图会话。请求只选择 2D、3D 或二者都要，
  // 控制器特有地图格式由 AGV 适配器内部转换。
  rpc startMapping(AgvStartMappingCommand.Request) returns (AgvStartMappingCommand.Feedback);

  // 以服务端流方式发送统一地图。resume_token 为空时应先发送全量快照；
  // 后续是否发送增量由 AGV 适配器能力决定，并通过 update_type 标记。
  rpc streamMap(AgvMapStreamCommand.Request) returns (stream AgvMapStreamCommand.Feedback);

  // 停止当前建图/扫图会话。
  rpc stopMapping(CommandHeader.Request) returns (CommandHeader.Feedback);
}
