添加注释

This commit is contained in:
tankaitao 2026-06-23 16:44:03 +08:00
parent 2e01a6035a
commit b4468809da
8 changed files with 5190 additions and 2456 deletions

View File

@ -1,12 +1,12 @@
src1100_agvs {
id: "agv_src1100"
ip: "192.168.192.5"
port_status: 19301
port_control: 19301
port_nav: 19301
port_config: 19301
port_other: 19301
port_push: 19301
port_status: 19204
port_control: 19205
port_nav: 19206
port_config: 19207
port_other: 19210
port_push: 19302

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,11 @@
//
// Created by linbo on 2025/6/20.
//
/**
* @file agv_src1100.h
* @brief SRC-1100/2200 AGV
* AbstractAgv TCP
*/
#ifndef AGV_SRC1100_H
#define AGV_SRC1100_H
#pragma once
@ -10,78 +15,292 @@
#include <atomic>
#include <thread>
#include "nlohmann/json.hpp"
using json = nlohmann::json;
namespace cmvr::device {
class AgvSrc1100 final : public AbstractAgv {
public:
explicit AgvSrc1100(const XmlNode& cfg);
explicit AgvSrc1100(const config::AGVsrc1100Config& cfg);
~AgvSrc1100() override;
/**
* @brief SRC-1100/2200 AGV
*
* AbstractAgv SRC
*
*
* @note 线访
*/
class AgvSrc1100 final : public AbstractAgv {
public:
// ==================== 构造 / 析构 ====================
Status state() const override;
std::string lastError() const override;
/**
* @brief XML 使
* @param cfg XML IDIP
*/
explicit AgvSrc1100(const XmlNode& cfg);
void start() override;
void stop() override;
void update() override;
/**
* @brief Protobuf
* @param cfg AGVsrc1100Config IDIP
*/
explicit AgvSrc1100(const config::AGVsrc1100Config& cfg);
void getStatusInfo(AgvStatusInfo& info) override;
void getBatteryStatus(BatteryStatus& info, bool simple = false) override;
void getRobotLocation(RobotLocation& info) override;
void downloadMap(DownloadMapResult& info, const std::string& map_name) override;
void getMapStatus(MapStatus& info) override;
void uploadMap(UploadMapResult& info, const std::string& map_json) override;
void lockRobotControl(LockResult& info, const std::string& nick_name) override;
void getCurrentLockStatus(CurrentLockStatus& info) override;
/**
* @brief
*/
~AgvSrc1100() override;
void robotMotionControl(MotionCtrlRes& res, const MotionCtrlReq& req) override;
// ==================== 生命周期管理(通用) ====================
void robotLoadMap(LoadMapRes& res, const LoadMapReq& req) override;
/**
* @brief
* @return Status CREATED / INITIALIZED / RUNNING / PAUSED / STOPPED / FAULT
*/
Status state() const override;
void queryLoadMapStatus(QueryLoadMapStatusRes& res) override;
void queryStationList(QueryStationRes& res) override;
/**
* @brief
* @return
*/
std::string lastError() const override;
void robotGoTargetList(GoTargetListRes& res, const GoTargetListReq& req) override;
/**
* @brief
* @note socket
*/
void start() override;
/**
* @brief TCP
*/
void stop() override;
/**
* @brief
* @note
*/
void update() override;
// ==================== 端口 19204 机器人状态 API允许 10 个连接) ====================
// 功能:查询机器人各种状态信息(只读操作,不改变机器人状态)
/**
* @brief 1000, robot_status_info_req
* @param info AgvStatusInfo
* @note IPMACWi-Fi
*/
void getStatusInfo(AgvStatusInfo& info) override;
/**
* @brief 1007, robot_status_battery_req
* @param info BatteryStatus
* @param simple true
* @note
*/
void getBatteryStatus(BatteryStatus& info, bool simple = false) override;
/**
* @brief 1004, robot_status_loc_req
* @param info RobotLocation
* @note X/Y
*/
void getRobotLocation(RobotLocation& info) override;
/**
* @brief 1300, robot_status_map_req
* @param info MapStatus
* @note
*/
void getMapStatus(MapStatus& info) override;
/**
* @brief 1060, robot_status_current_lock_req
* @param info CurrentLockStatus
* @note IP//
*/
void getCurrentLockStatus(CurrentLockStatus& info) override;
/**
* @brief 1022, robot_status_loadmap_req
* @param res loadmap_status
* @note loadmap_status: 0=, 1=, 2=
*/
void queryLoadMapStatus(QueryLoadMapStatusRes& res) override;
/**
* @brief 1301, robot_status_station_req
* @param res QueryStationRes
* @note ID
*/
void queryStationList(QueryStationRes& res) override;
/**
* @brief 1020, robot_status_task_req
* @param res RobotStatusTaskCurrentRes
* @param req simple=true task_status
* @note //
*/
void robotStatusTaskCurrent(RobotStatusTaskCurrentRes& res, const RobotStatusTaskCurrentReq& req) override;
/**
* @brief 1110, robot_status_task_status_package_req
* @param res QueryTaskStatusPackageRes
* @param req task_ids +
* @note ID//
*/
void robotStatusTaskPackage(QueryTaskStatusPackageRes& res, const QueryTaskStatusPackageReq& req) override;
// ==================== 端口 19205 机器人控制 API允许 5 个连接) ====================
// 功能:下发控制指令,改变机器人运动或状态(非导航类指令)
/**
* @brief 2010, robot_control_motion_req
* @param res
* @param req vx/vy/w/steer/real_steer/duration
* @warning
* @note vx/vy/w steer/real_steer
*/
void robotMotionControl(MotionCtrlRes& res, const MotionCtrlReq& req) override;
/**
* @brief 2022, robot_control_loadmap_req
* @param res
* @param req
* @note
*/
void robotLoadMap(LoadMapRes& res, const LoadMapReq& req) override;
// ==================== 端口 19206 机器人导航 API允许 5 个连接) ====================
// 功能:下发导航任务
/**
* @brief 3066, robot_task_gotargetlist_req
* @param res ret_code=0
* @param req move_task_list
* @attention
* - task_idsource_idid
* - source_id id 线
* -
* -
*/
void robotGoTargetList(GoTargetListRes& res, const GoTargetListReq& req) override;
/**
* @brief 3051, robot_task_gotarget_req
* @param res ret_code=0
* @param req freeGo
* @warning
* - ****/
* -
* - warning/error
* - freeGo
*/
void robotGoTarget(RobotGoTargetRes& res, const RobotGoTargetReq& req) override;
// ==================== 端口 19207 机器人配置 API允许 5 个连接) ====================
// 功能:配置类操作(地图上传/下载、控制权管理、参数修改等)
/**
* @brief 4005, robot_config_lock_req
* @param info LockResult
* @param nick_name
* @note
*/
void lockRobotControl(LockResult& info, const std::string& nick_name) override;
/**
* @brief 4010, robot_config_uploadmap_req
* @param info UploadMapResult
* @param map_json JSON
* @note JSON
*/
void uploadMap(UploadMapResult& info, const std::string& map_json) override;
/**
* @brief 4011, robot_config_downloadmap_req
* @param info DownloadMapResult JSON
* @param map_name
* @note JSON info.map_content
*/
void downloadMap(DownloadMapResult& info, const std::string& map_name) override;
// ==================== 端口 19210 其他 API允许 5 个连接) ====================
// 功能:外设控制(顶升/货叉/辊筒/音频/IO 等)
// 当前未实现具体方法,预留扩展
// ==================== 端口 19301 机器人推送 API允许 10 个连接) ====================
// 功能:接收机器人主动推送的实时状态数据
// 相关配置方法(如 9300可能在此当前未实现
void robotStatusTask(RobotStatusTaskRes& res, const RobotStatusTaskReq& req) override;
// ---------- 新增任务控制接口3001/3002/3003及停止运动2000 ----------
void robotTaskPause(RobotTaskPauseRes& res) override;
void robotTaskResume(RobotTaskResumeRes& res) override;
void robotTaskCancel(RobotTaskCancelRes& res) override;
void robotControlStop(RobotControlStopRes& res) override;
private:
// ==================== 私有通信辅助函数 ====================
/**
* @brief
* @param sock socket
* @param port 19204/19205/19206/19207/19210/19301
* @note 线 sock
*/
void asyncConnect(int& sock, int port);
/**
* @brief
* @param sock socket
* @param header 16
* @return true current_json_ JSONfalse
* @note JSON
*/
bool sendAndRecv(int sock, const uint8_t* header);
/**
* @brief socket
* @param sock socket
* @note
*/
void flushSocket(int sock);
/**
* @brief socket
* @param sock socket
* @param timeout_ms 0
*/
void setSocketTimeout(int sock, int timeout_ms);
/**
* @brief JSON
* @param json_str JSON
* @param root json
* @param err_msg
* @return true false
*/
bool parseJson(const std::string& json_str, json& root, std::string& err_msg);
// ==================== 成员变量 ====================
mutable std::mutex mutex_; ///< 保护状态和错误信息的互斥锁
std::atomic<Status> status_{Status::CREATED}; ///< 当前设备运行状态(原子变量)
std::string last_error_; ///< 最后一次错误信息
std::string current_json_; ///< 最近一次响应的 JSON 内容(由 sendAndRecv 填充)
// ---------- 各端口 Socket 文件描述符 ----------
int sock_status_ = -1; ///< 19204 状态 API 端口
int sock_control_ = -1; ///< 19205 控制 API 端口
int sock_nav_ = -1; ///< 19206 导航 API 端口
int sock_config_ = -1; ///< 19207 配置 API 端口
int sock_other_ = -1; ///< 19210 其他 API 端口
int sock_push_ = -1; ///< 19301 推送 API 端口
private:
void asyncConnect(int& sock, int port);
bool sendAndRecv(int sock, const uint8_t* header);
void flushSocket(int sock);
void setSocketTimeout(int sock, int timeout_ms);
// 辅助函数将JSON字符串解析为Json::Value同时做错误处理
bool parseJson(const std::string& json_str, json& root, std::string& err_msg);
mutable std::mutex mutex_;
std::atomic<Status> status_{Status::CREATED};
std::string last_error_;
std::string current_json_;
// 多socket
int sock_status_ = -1;
int sock_control_ = -1;
int sock_nav_ = -1;
int sock_config_ = -1;
int sock_other_ = -1;
int sock_push_ = -1;
std::vector<std::thread> connect_threads_;
mutable std::mutex connect_mutex_;
};
std::vector<std::thread> connect_threads_; ///< 各端口异步连接线程
mutable std::mutex connect_mutex_; ///< 保护 connect_threads_ 的互斥锁
};
} // namespace cmvr::device

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,14 @@
//
// Created by xtkuang on 2025/6/1.
//
/**
* @file grpc_agv_service.h
* @brief gRPC AGV
* api::AgvService::Service AGV RPC
* DeviceManager AGV AgvSrc1100
* @author xtkuang
* @date 2025-06-01
*/
#ifndef GRPC_AGV_SERVICE_H
#define GRPC_AGV_SERVICE_H
@ -11,121 +19,260 @@
namespace cmvr::service {
class gRPCAGVServiceImpl final : public api::AgvService::Service {
public:
gRPCAGVServiceImpl();
~gRPCAGVServiceImpl() override = default;
/**
* @brief gRPC AGV
* gRPC AGV
*/
class gRPCAGVServiceImpl final : public api::AgvService::Service {
public:
/**
* @brief DeviceManager
*/
gRPCAGVServiceImpl();
// AGV服务接口
grpc::Status GetStatusInfo(grpc::ServerContext* context,
const api::GetAgvStatusInfoCommand_Request* request,
api::GetAgvStatusInfoCommand_Feedback* response) override;
/**
* @brief
*/
~gRPCAGVServiceImpl() override = default;
grpc::Status GetBatteryStatus(grpc::ServerContext* context,
const api::RobotStatusBatteryCommand_Request* request,
api::RobotStatusBatteryCommand_Feedback* response) override;
// ===================== 基本状态查询接口 =====================
grpc::Status GetRobotLocation(grpc::ServerContext* context,
const api::RobotStatusLocCommand_Request* request,
api::RobotStatusLocCommand_Feedback* response) override;
/**
* @brief AGV 1000
* @param context gRPC 使
* @param request IDheader.device_id
* @param response AGV IPMAC
* @return grpc::Status::OK response.header
*/
grpc::Status GetStatusInfo(grpc::ServerContext* context,
const api::GetAgvStatusInfoCommand_Request* request,
api::GetAgvStatusInfoCommand_Feedback* response) override;
grpc::Status RobotConfigDownloadMap(grpc::ServerContext* context,
const api::RobotConfigDownloadMapCommand_Request* request,
api::RobotConfigDownloadMapCommand_Feedback* response) override;
/**
* @brief 1007
* @param context gRPC 使
* @param request ID simple
* @param response
* @return grpc::Status::OK response.header
*/
grpc::Status GetBatteryStatus(grpc::ServerContext* context,
const api::RobotStatusBatteryCommand_Request* request,
api::RobotStatusBatteryCommand_Feedback* response) override;
grpc::Status GetMapStatus(grpc::ServerContext* context,
const api::RobotStatusMapCommand_Request* request,
api::RobotStatusMapCommand_Feedback* response) override;
/**
* @brief 1004
* @param context gRPC 使
* @param request ID
* @param response
* @return grpc::Status::OK response.header
*/
grpc::Status GetRobotLocation(grpc::ServerContext* context,
const api::RobotStatusLocCommand_Request* request,
api::RobotStatusLocCommand_Feedback* response) override;
grpc::Status RobotConfigUploadMap(grpc::ServerContext* context,
const api::RobotConfigUploadMapCommand_Request* request,
api::RobotConfigUploadMapCommand_Feedback* response) override;
/**
* @brief gRPC接口
*/
grpc::Status RobotConfigLock(grpc::ServerContext* context,
const api::RobotConfigLockCommand_Request* request,
api::RobotConfigLockCommand_Feedback* response) override;
// ===================== 地图管理接口 =====================
/**
* @brief 4011
* @param context gRPC 使
* @param request ID
* @param response JSON
* @return grpc::Status::OK response.header
*/
grpc::Status RobotConfigDownloadMap(grpc::ServerContext* context,
const api::RobotConfigDownloadMapCommand_Request* request,
api::RobotConfigDownloadMapCommand_Feedback* response) override;
/**
* @brief 1300
* @param context gRPC 使
* @param request ID
* @param response
* @return grpc::Status::OK response.header
*/
grpc::Status GetMapStatus(grpc::ServerContext* context,
const api::RobotStatusMapCommand_Request* request,
api::RobotStatusMapCommand_Feedback* response) override;
/**
* @brief gRPC接口
*/
grpc::Status GetCurrentLockStatus(grpc::ServerContext* context,
const api::RobotStatusCurrentLockCommand_Request* request,
api::RobotStatusCurrentLockCommand_Feedback* response) override;
/**
* @brief 4010
* @param context gRPC 使
* @param request ID JSON
* @param response ret_code
* @return grpc::Status::OK response.header
*/
grpc::Status RobotConfigUploadMap(grpc::ServerContext* context,
const api::RobotConfigUploadMapCommand_Request* request,
api::RobotConfigUploadMapCommand_Feedback* response) override;
/**
* @brief AGV开环速度运动控制
* @param context grpc上下文
* @param request header携带device_id区分多AGV
* @param response
*/
grpc::Status RobotMotionControl(grpc::ServerContext* context,
const api::RobotMotionControlCommand_Request* request,
api::RobotMotionControlCommand_Feedback* response) override;
// ===================== 控制权管理接口 =====================
/**
* @brief 4005
* @param context gRPC 使
* @param request ID
* @param response ret_code
* @return grpc::Status::OK response.header
*/
grpc::Status RobotConfigLock(grpc::ServerContext* context,
const api::RobotConfigLockCommand_Request* request,
api::RobotConfigLockCommand_Feedback* response) override;
/**
* @brief
* @param context grpc上下文
* @param request
* @param response
*/
grpc::Status RobotLoadMap(
grpc::ServerContext* context,
const api::RobotLoadMapCommand_Request* request,
api::RobotLoadMapCommand_Feedback* response) override;
/**
* @brief 1060
* @param context gRPC 使
* @param request ID
* @param response IP//
* @return grpc::Status::OK response.header
*/
grpc::Status GetCurrentLockStatus(grpc::ServerContext* context,
const api::RobotStatusCurrentLockCommand_Request* request,
api::RobotStatusCurrentLockCommand_Feedback* response) override;
/**
* @brief
* @param context grpc上下文
* @param request
* @param response
*/
grpc::Status QueryLoadMapStatus(
grpc::ServerContext* context,
const api::RobotQueryLoadMapStatusCommand_Request* request,
api::RobotQueryLoadMapStatusCommand_Feedback* response) override;
// ===================== 运动控制接口 =====================
/**
* @brief
* @param context grpc上下文
* @param request
* @param response
*/
grpc::Status QueryStationList(
grpc::ServerContext* context,
const api::QueryStationListCommand_Request* request,
api::QueryStationListCommand_Feedback* response) override;
/**
* @brief 2010
* @param context gRPC 使
* @param request ID vx, vy, w, steer, duration
* @param response ret_code
* @note vx/vy/w
* @return grpc::Status::OK response.header
*/
grpc::Status RobotMotionControl(grpc::ServerContext* context,
const api::RobotMotionControlCommand_Request* request,
api::RobotMotionControlCommand_Feedback* response) override;
/**
* @brief 2022
* @param context gRPC 使
* @param request ID
* @param response ret_code
* @return grpc::Status::OK response.header
*/
grpc::Status RobotLoadMap(grpc::ServerContext* context,
const api::RobotLoadMapCommand_Request* request,
api::RobotLoadMapCommand_Feedback* response) override;
/**
* @brief
* @param context grpc上下文
* @param request
* @param response
*/
grpc::Status RobotGoTargetList(
grpc::ServerContext* context,
const api::RobotGoTargetListCommand_Request* request,
api::RobotGoTargetListCommand_Feedback* response) override;
/**
* @brief 2000
* @param context gRPC 使
* @param request ID
* @param response ret_code
* @return grpc::Status::OK response.header
*/
grpc::Status RobotControlStop(grpc::ServerContext* context,
const api::RobotControlStopCommand::Request* request,
api::RobotControlStopCommand::Feedback* response) override;
// ===================== 导航任务接口 =====================
grpc::Status RobotStatusTask(
grpc::ServerContext* context,
const api::RobotStatusTaskCommand_Request* request,
api::RobotStatusTaskCommand_Feedback* response) override;
/**
* @brief 1022
* @param context gRPC 使
* @param request ID
* @param response loadmap_status0=, 1=, 2=
* @return grpc::Status::OK response.header
*/
grpc::Status QueryLoadMapStatus(grpc::ServerContext* context,
const api::RobotQueryLoadMapStatusCommand_Request* request,
api::RobotQueryLoadMapStatusCommand_Feedback* response) override;
/**
* @brief 1301
* @param context gRPC 使
* @param request ID
* @param response ID
* @return grpc::Status::OK response.header
*/
grpc::Status QueryStationList(grpc::ServerContext* context,
const api::QueryStationListCommand_Request* request,
api::QueryStationListCommand_Feedback* response) override;
/**
* @brief 3066
* @param context gRPC 使
* @param request ID move_task_list
* @param response ret_code=0
* @attention task_id, source_id, id
*
* @return grpc::Status::OK response.header
*/
grpc::Status RobotGoTargetList(grpc::ServerContext* context,
const api::RobotGoTargetListCommand_Request* request,
api::RobotGoTargetListCommand_Feedback* response) override;
/**
* @brief 1020
* @param context gRPC 使
* @param request ID simple
* @param response
* @return grpc::Status::OK response.header
*/
grpc::Status RobotStatusTaskCurrent(grpc::ServerContext* context,
const api::RobotStatusTaskCurrentCommand_Request* request,
api::RobotStatusTaskCurrentCommand_Feedback* response) override;
/**
* @brief 1110
* @param context gRPC 使
* @param request ID task_ids +
* @param response
* @return grpc::Status::OK response.header
*/
grpc::Status RobotStatusTaskPackage(grpc::ServerContext* context,
const api::RobotStatusTaskPackageCommand_Request* request,
api::RobotStatusTaskPackageCommand_Feedback* response) override;
/**
* @brief 3051
* @param context gRPC 使
* @param request ID PGV
* @param response ret_code=0
* @warning
* @return grpc::Status::OK response.header
*/
grpc::Status RobotGoTarget(grpc::ServerContext* context,
const api::RobotGoTargetCommand_Request* request,
api::RobotGoTargetCommand_Feedback* response) override;
private:
device::DeviceManager& dmgr_;
};
}
/**
* @brief 3001
* @param context gRPC 使
* @param request ID
* @param response ret_code
* @return grpc::Status::OK response.header
*/
grpc::Status RobotTaskPause(grpc::ServerContext* context,
const api::RobotTaskPauseCommand::Request* request,
api::RobotTaskPauseCommand::Feedback* response) override;
#endif //GRPC_AGV_SERVICE_H
/**
* @brief 3002
* @param context gRPC 使
* @param request ID
* @param response ret_code
* @return grpc::Status::OK response.header
*/
grpc::Status RobotTaskResume(grpc::ServerContext* context,
const api::RobotTaskResumeCommand::Request* request,
api::RobotTaskResumeCommand::Feedback* response) override;
/**
* @brief 3003
* @param context gRPC 使
* @param request ID
* @param response ret_code
* @return grpc::Status::OK response.header
*/
grpc::Status RobotTaskCancel(grpc::ServerContext* context,
const api::RobotTaskCancelCommand::Request* request,
api::RobotTaskCancelCommand::Feedback* response) override;
private:
device::DeviceManager& dmgr_; ///< 设备管理器引用,用于根据 device_id 获取 AGV 设备实例。
};
} // namespace cmvr::service
#endif // GRPC_AGV_SERVICE_H

View File

@ -1,6 +1,15 @@
//
// Created by xtkuang on 2025/6/1.
//
/**
* @file grpc_agv_service.cpp
* @brief gRPC AGV
* RPC device_id DeviceManager AGV
* Protobuf
* success/error_message
* @author xtkuang
* @date 2025-06-01
*/
#include "./service/grpc/include/grpc_agv_service.h"
@ -12,9 +21,21 @@
namespace cmvr::service {
/**
* @brief DeviceManager
*/
gRPCAGVServiceImpl::gRPCAGVServiceImpl() : dmgr_(device::DeviceManager::getInstance()) {
}
// ===================== GetStatusInfo =====================
/**
* @brief AGV
* @details device_id getStatusInfo
* @param context 使
* @param request ID
* @param response
* @return OK response.header
*/
grpc::Status gRPCAGVServiceImpl::GetStatusInfo(
grpc::ServerContext* context,
const api::GetAgvStatusInfoCommand_Request* request,
@ -28,6 +49,7 @@ namespace cmvr::service {
device::AbstractAgv::AgvStatusInfo device_status;
agv_device->getStatusInfo(device_status);
// 映射到 Protobuf 消息
auto* proto_status = response->mutable_status();
proto_status->set_id(device_status.id);
proto_status->set_vehicle_id(device_status.vehicle_id);
@ -58,62 +80,75 @@ namespace cmvr::service {
}
}
grpc::Status gRPCAGVServiceImpl::GetBatteryStatus(
grpc::ServerContext* context,
const api::RobotStatusBatteryCommand_Request* request,
api::RobotStatusBatteryCommand_Feedback* response)
{
try {
std::string dev_id = request->header().device_id();
LOG(INFO) << "[gRPCAGVServiceImpl] (GetBatteryStatus): id=" << dev_id;
const auto agv_device = dmgr_.getDevice<device::AbstractAgv>(dev_id);
bool simple = false;
if (request->has_data())
{
simple = request->data().simple();
}
device::AbstractAgv::BatteryStatus bat_info;
agv_device->getBatteryStatus(bat_info, simple);
auto* proto_bat = response->mutable_status();
proto_bat->set_battery_level(bat_info.battery_level);
proto_bat->set_battery_temp(bat_info.battery_temp);
proto_bat->set_charging(bat_info.charging);
proto_bat->set_voltage(bat_info.voltage);
proto_bat->set_current(bat_info.current);
proto_bat->set_max_charge_voltage(bat_info.max_charge_voltage);
proto_bat->set_max_charge_current(bat_info.max_charge_current);
proto_bat->set_manual_charge(bat_info.manual_charge);
proto_bat->set_auto_charge(bat_info.auto_charge);
proto_bat->set_battery_cycle(bat_info.battery_cycle);
proto_bat->set_battery_user_data(bat_info.battery_user_data);
proto_bat->set_extra(bat_info.extra);
proto_bat->set_ret_code(bat_info.ret_code);
proto_bat->set_create_on(bat_info.create_on);
proto_bat->set_err_msg(bat_info.err_msg);
auto* header = response->mutable_header();
header->set_success(true);
header->set_error_message("");
setCurrentTimestamp(header->mutable_timestamp());
LOG(INFO) << "GetBatteryStatus device_id:" << dev_id << " level: " << bat_info.battery_level;
return grpc::Status::OK;
}
catch (std::exception &e)
// ===================== GetBatteryStatus =====================
/**
* @brief
* @details simple getBatteryStatus
* @param context 使
* @param request ID simple
* @param response
*/
grpc::Status gRPCAGVServiceImpl::GetBatteryStatus(
grpc::ServerContext* context,
const api::RobotStatusBatteryCommand_Request* request,
api::RobotStatusBatteryCommand_Feedback* response)
{
auto* header = response->mutable_header();
header->set_success(false);
header->set_error_message(e.what());
setCurrentTimestamp(header->mutable_timestamp());
return grpc::Status::OK;
try {
std::string dev_id = request->header().device_id();
LOG(INFO) << "[gRPCAGVServiceImpl] (GetBatteryStatus): id=" << dev_id;
const auto agv_device = dmgr_.getDevice<device::AbstractAgv>(dev_id);
bool simple = false;
if (request->has_data())
{
simple = request->data().simple();
}
device::AbstractAgv::BatteryStatus bat_info;
agv_device->getBatteryStatus(bat_info, simple);
auto* proto_bat = response->mutable_status();
proto_bat->set_battery_level(bat_info.battery_level);
proto_bat->set_battery_temp(bat_info.battery_temp);
proto_bat->set_charging(bat_info.charging);
proto_bat->set_voltage(bat_info.voltage);
proto_bat->set_current(bat_info.current);
proto_bat->set_max_charge_voltage(bat_info.max_charge_voltage);
proto_bat->set_max_charge_current(bat_info.max_charge_current);
proto_bat->set_manual_charge(bat_info.manual_charge);
proto_bat->set_auto_charge(bat_info.auto_charge);
proto_bat->set_battery_cycle(bat_info.battery_cycle);
proto_bat->set_battery_user_data(bat_info.battery_user_data);
proto_bat->set_extra(bat_info.extra);
proto_bat->set_ret_code(bat_info.ret_code);
proto_bat->set_create_on(bat_info.create_on);
proto_bat->set_err_msg(bat_info.err_msg);
auto* header = response->mutable_header();
header->set_success(true);
header->set_error_message("");
setCurrentTimestamp(header->mutable_timestamp());
LOG(INFO) << "GetBatteryStatus device_id:" << dev_id << " level: " << bat_info.battery_level;
return grpc::Status::OK;
}
catch (std::exception &e)
{
auto* header = response->mutable_header();
header->set_success(false);
header->set_error_message(e.what());
setCurrentTimestamp(header->mutable_timestamp());
return grpc::Status::OK;
}
}
}
// ===================== GetRobotLocation =====================
/**
* @brief
* @param context 使
* @param request ID
* @param response
*/
grpc::Status gRPCAGVServiceImpl::GetRobotLocation(
grpc::ServerContext* context,
const api::RobotStatusLocCommand_Request* request,
@ -157,7 +192,13 @@ api::RobotStatusBatteryCommand_Feedback* response)
}
}
// ===================== RobotConfigDownloadMap =====================
/**
* @brief
* @param context 使
* @param request ID
* @param response JSON
*/
grpc::Status gRPCAGVServiceImpl::RobotConfigDownloadMap(
grpc::ServerContext* context,
const api::RobotConfigDownloadMapCommand_Request* request,
@ -196,8 +237,13 @@ api::RobotStatusBatteryCommand_Feedback* response)
}
}
// ===================== GetMapStatus =====================
/**
* @brief
* @param context 使
* @param request ID
* @param response
*/
grpc::Status gRPCAGVServiceImpl::GetMapStatus(
grpc::ServerContext* context,
const api::RobotStatusMapCommand_Request* request,
@ -249,7 +295,13 @@ api::RobotStatusBatteryCommand_Feedback* response)
}
}
// ===================== RobotConfigUploadMap =====================
/**
* @brief
* @param context 使
* @param request ID JSON
* @param response
*/
grpc::Status gRPCAGVServiceImpl::RobotConfigUploadMap(
grpc::ServerContext* context,
const api::RobotConfigUploadMapCommand_Request* request,
@ -287,39 +339,33 @@ api::RobotStatusBatteryCommand_Feedback* response)
}
}
// ===================== RobotConfigLock =====================
/**
* @brief gRPC
* @param context grpc上下文
* @param request nick_name抢占者名称
* @param response
*/
* @brief
* @param context 使
* @param request ID
* @param response
*/
grpc::Status gRPCAGVServiceImpl::RobotConfigLock(
grpc::ServerContext* context,
const api::RobotConfigLockCommand_Request* request,
api::RobotConfigLockCommand_Feedback* response)
{
try {
// 动态从header拿设备ID和查询接口统一
std::string dev_id = request->header().device_id();
LOG(INFO) << "[gRPCAGVServiceImpl] (RobotConfigLock): id=" << dev_id;
// 根据device_id获取对应AGV实例
const auto agv_device = dmgr_.getDevice<device::AbstractAgv>(dev_id);
// 读取抢占者名称
std::string nick_name = request->data().nick_name();
device::AbstractAgv::LockResult lock_res;
// 调用底层抢占接口
agv_device->lockRobotControl(lock_res, nick_name);
// 填充protobuf返回数据
auto* proto_status = response->mutable_status();
proto_status->set_ret_code(lock_res.ret_code);
proto_status->set_create_on(lock_res.create_on);
proto_status->set_err_msg(lock_res.err_msg);
// 响应头标记成功 + 时间戳对齐全局规范
auto* header = response->mutable_header();
header->set_success(true);
header->set_error_message("");
@ -330,7 +376,6 @@ api::RobotStatusBatteryCommand_Feedback* response)
}
catch (std::exception &e)
{
// 统一异常捕获,和相机/查询接口风格完全一致
auto* header = response->mutable_header();
header->set_success(false);
header->set_error_message(e.what());
@ -339,71 +384,72 @@ api::RobotStatusBatteryCommand_Feedback* response)
}
}
/**
* @brief gRPC接口
*/
grpc::Status gRPCAGVServiceImpl::GetCurrentLockStatus(
// ===================== GetCurrentLockStatus =====================
/**
* @brief
* @param context 使
* @param request ID
* @param response
*/
grpc::Status gRPCAGVServiceImpl::GetCurrentLockStatus(
grpc::ServerContext* context,
const api::RobotStatusCurrentLockCommand_Request* request,
api::RobotStatusCurrentLockCommand_Feedback* response)
{
try {
// 1. 读取请求device_id打印日志和相机代码保持一致
std::string dev_id = request->header().device_id();
LOG(INFO) << "[gRPCAGVServiceImpl] (GetCurrentLockStatus): id=" << dev_id;
// 2. 按device_id获取AGV设备实例和相机 dmgr_.getDevice<AbstractCamera>(dev_id) 统一写法
const auto agv_dev = dmgr_.getDevice<device::AbstractAgv>(dev_id);
// 3. 调用底层接口获取控制权信息
device::AbstractAgv::CurrentLockStatus lock_info;
agv_dev->getCurrentLockStatus(lock_info);
// 4. 填充protobuf返回结构体
auto* proto_status = response->mutable_status();
proto_status->set_locked(lock_info.locked);
proto_status->set_ip(lock_info.ip);
proto_status->set_port(lock_info.port);
proto_status->set_type(lock_info.type);
proto_status->set_nick_name(lock_info.nick_name);
proto_status->set_time_t(lock_info.time_t);
proto_status->set_desc(lock_info.desc);
proto_status->set_ret_code(lock_info.ret_code);
proto_status->set_create_on(lock_info.create_on);
proto_status->set_err_msg(lock_info.err_msg);
// 5. 响应header标记成功 + 填充时间戳(对齐相机接口)
response->mutable_header()->set_success(true);
setCurrentTimestamp(response->mutable_header()->mutable_timestamp());
LOG(INFO) << "Query current lock status, device_id:" << dev_id
<< ", locked:" << lock_info.locked << ", nick:" << lock_info.nick_name;
return grpc::Status::OK;
}
catch (std::exception &e)
{
// 异常统一捕获失败header填错误信息+时间戳,和相机完全对齐
response->mutable_header()->set_success(false);
response->mutable_header()->set_error_message(e.what());
setCurrentTimestamp(response->mutable_header()->mutable_timestamp());
return grpc::Status::OK;
try {
std::string dev_id = request->header().device_id();
LOG(INFO) << "[gRPCAGVServiceImpl] (GetCurrentLockStatus): id=" << dev_id;
const auto agv_dev = dmgr_.getDevice<device::AbstractAgv>(dev_id);
device::AbstractAgv::CurrentLockStatus lock_info;
agv_dev->getCurrentLockStatus(lock_info);
auto* proto_status = response->mutable_status();
proto_status->set_locked(lock_info.locked);
proto_status->set_ip(lock_info.ip);
proto_status->set_port(lock_info.port);
proto_status->set_type(lock_info.type);
proto_status->set_nick_name(lock_info.nick_name);
proto_status->set_time_t(lock_info.time_t);
proto_status->set_desc(lock_info.desc);
proto_status->set_ret_code(lock_info.ret_code);
proto_status->set_create_on(lock_info.create_on);
proto_status->set_err_msg(lock_info.err_msg);
response->mutable_header()->set_success(true);
setCurrentTimestamp(response->mutable_header()->mutable_timestamp());
LOG(INFO) << "Query current lock status, device_id:" << dev_id
<< ", locked:" << lock_info.locked << ", nick:" << lock_info.nick_name;
return grpc::Status::OK;
}
catch (std::exception &e)
{
response->mutable_header()->set_success(false);
response->mutable_header()->set_error_message(e.what());
setCurrentTimestamp(response->mutable_header()->mutable_timestamp());
return grpc::Status::OK;
}
}
}
// ===================== RobotMotionControl =====================
/**
* @brief
* @param context 使
* @param request ID
* @param response
*/
grpc::Status gRPCAGVServiceImpl::RobotMotionControl(
grpc::ServerContext* context,
const api::RobotMotionControlCommand_Request* request,
api::RobotMotionControlCommand_Feedback* response)
{
try {
// 从header读取device_id区分多台AGV设备
std::string dev_id = request->header().device_id();
LOG(INFO) << "[gRPCAGVServiceImpl] (RobotMotionControl): target device_id=" << dev_id;
const auto agv_dev = dmgr_.getDevice<device::AbstractAgv>(dev_id);
// grpc入参转换到底层结构体
device::AbstractAgv::MotionCtrlReq req;
auto& input_data = request->data();
req.vx = input_data.vx();
@ -413,17 +459,14 @@ grpc::Status gRPCAGVServiceImpl::GetCurrentLockStatus(
req.real_steer = input_data.real_steer();
req.duration = input_data.duration();
// 调用底层运动控制接口
device::AbstractAgv::MotionCtrlRes res;
agv_dev->robotMotionControl(res, req);
// 填充grpc返回状态
auto* resp_status = response->mutable_status();
resp_status->set_ret_code(res.ret_code);
resp_status->set_create_on(res.create_on);
resp_status->set_err_msg(res.err_msg);
// 统一规范header成功标记+时间戳
auto* header = response->mutable_header();
header->set_success(true);
header->set_error_message("");
@ -436,7 +479,6 @@ grpc::Status gRPCAGVServiceImpl::GetCurrentLockStatus(
}
catch (std::exception& e)
{
// 全局统一异常捕获模板
auto* header = response->mutable_header();
header->set_success(false);
header->set_error_message(e.what());
@ -445,6 +487,13 @@ grpc::Status gRPCAGVServiceImpl::GetCurrentLockStatus(
}
}
// ===================== RobotLoadMap =====================
/**
* @brief
* @param context 使
* @param request ID
* @param response
*/
grpc::Status gRPCAGVServiceImpl::RobotLoadMap(
grpc::ServerContext* context,
const api::RobotLoadMapCommand_Request* request,
@ -470,7 +519,6 @@ grpc::Status gRPCAGVServiceImpl::GetCurrentLockStatus(
auto* header = response->mutable_header();
header->set_success(true);
header->set_error_message("");
// 修复取timestamp子字段
setCurrentTimestamp(header->mutable_timestamp());
LOG(INFO) << "RobotLoadMap finish, dev_id:" << dev_id
@ -483,13 +531,18 @@ grpc::Status gRPCAGVServiceImpl::GetCurrentLockStatus(
auto* header = response->mutable_header();
header->set_success(false);
header->set_error_message(e.what());
// 修复取timestamp子字段
setCurrentTimestamp(header->mutable_timestamp());
return grpc::Status::OK;
}
}
// ===================== QueryLoadMapStatus =====================
/**
* @brief
* @param context 使
* @param request ID
* @param response loadmap_status
*/
grpc::Status gRPCAGVServiceImpl::QueryLoadMapStatus(
grpc::ServerContext* context,
const api::RobotQueryLoadMapStatusCommand_Request* request,
@ -529,6 +582,13 @@ grpc::Status gRPCAGVServiceImpl::GetCurrentLockStatus(
}
}
// ===================== QueryStationList =====================
/**
* @brief
* @param context 使
* @param request ID
* @param response
*/
grpc::Status gRPCAGVServiceImpl::QueryStationList(
grpc::ServerContext* context,
const api::QueryStationListCommand_Request* request,
@ -547,7 +607,6 @@ grpc::Status gRPCAGVServiceImpl::GetCurrentLockStatus(
resp_status->set_create_on(res.create_on);
resp_status->set_err_msg(res.err_msg);
// 填充站点数组
for (auto& st : res.stations)
{
auto* pb_st = resp_status->add_stations();
@ -584,7 +643,13 @@ grpc::Status gRPCAGVServiceImpl::GetCurrentLockStatus(
}
}
// ===================== RobotGoTargetList =====================
/**
* @brief
* @param context 使
* @param request ID move_task_list
* @param response
*/
grpc::Status gRPCAGVServiceImpl::RobotGoTargetList(
grpc::ServerContext* context,
const api::RobotGoTargetListCommand_Request* request,
@ -636,28 +701,31 @@ grpc::Status gRPCAGVServiceImpl::GetCurrentLockStatus(
}
}
grpc::Status gRPCAGVServiceImpl::RobotStatusTask(
// ===================== RobotStatusTaskCurrent =====================
/**
* @brief
* @param context 使
* @param request ID simple
* @param response
*/
grpc::Status gRPCAGVServiceImpl::RobotStatusTaskCurrent(
grpc::ServerContext* context,
const api::RobotStatusTaskCommand_Request* request,
api::RobotStatusTaskCommand_Feedback* response)
const api::RobotStatusTaskCurrentCommand_Request* request,
api::RobotStatusTaskCurrentCommand_Feedback* response)
{
try {
std::string dev_id = request->header().device_id();
LOG(INFO) << "[gRPCAGVServiceImpl] (RobotStatusTask): id=" << dev_id;
LOG(INFO) << "[gRPCAGVServiceImpl] (RobotStatusTaskCurrent): id=" << dev_id;
const auto agv_dev = dmgr_.getDevice<device::AbstractAgv>(dev_id);
// 嵌套结构体 必须加 AbstractAgv::
device::AbstractAgv::RobotStatusTaskReq req;
device::AbstractAgv::RobotStatusTaskCurrentReq req;
if (request->has_data())
{
req.simple = request->data().simple();
}
device::AbstractAgv::RobotStatusTaskRes res;
agv_dev->robotStatusTask(res, req);
device::AbstractAgv::RobotStatusTaskCurrentRes res;
agv_dev->robotStatusTaskCurrent(res, req);
auto* out_data = response->mutable_data();
out_data->set_ret_code(res.ret_code);
@ -690,7 +758,7 @@ grpc::Status gRPCAGVServiceImpl::GetCurrentLockStatus(
header->set_error_message("");
setCurrentTimestamp(header->mutable_timestamp());
LOG(INFO) << "RobotStatusTask device_id:" << dev_id << " task_status: " << res.task_status;
LOG(INFO) << "RobotStatusTaskCurrent dev_id:" << dev_id << " task_status:" << res.task_status;
return grpc::Status::OK;
}
catch (std::exception &e)
@ -703,6 +771,438 @@ grpc::Status gRPCAGVServiceImpl::GetCurrentLockStatus(
}
}
// ===================== RobotStatusTaskPackage =====================
/**
* @brief
* @param context 使
* @param request ID task_ids
* @param response
*/
grpc::Status gRPCAGVServiceImpl::RobotStatusTaskPackage(
grpc::ServerContext* context,
const api::RobotStatusTaskPackageCommand_Request* request,
api::RobotStatusTaskPackageCommand_Feedback* response)
{
try {
std::string dev_id = request->header().device_id();
LOG(INFO) << "[gRPCAGVServiceImpl] (RobotStatusTaskPackage): id=" << dev_id;
const auto agv_dev = dmgr_.getDevice<device::AbstractAgv>(dev_id);
device::AbstractAgv::QueryTaskStatusPackageReq req;
const auto& pb_ids = request->data().task_ids();
for (auto& tid : pb_ids)
{
req.task_ids.push_back(tid);
}
}
device::AbstractAgv::QueryTaskStatusPackageRes res;
agv_dev->robotStatusTaskPackage(res, req);
auto* out_data = response->mutable_data();
out_data->set_ret_code(res.ret_code);
out_data->set_create_on(res.create_on);
out_data->set_err_msg(res.err_msg);
auto* pkg_pb = out_data->mutable_task_status_package();
auto& pkg_data = res.task_status_package;
pkg_pb->set_closest_target(pkg_data.closest_target);
pkg_pb->set_source_name(pkg_data.source_name);
pkg_pb->set_target_name(pkg_data.target_name);
pkg_pb->set_percentage(pkg_data.percentage);
pkg_pb->set_distance(pkg_data.distance);
pkg_pb->set_info(pkg_data.info);
for (auto& st_item : pkg_data.task_status_list)
{
auto* st_pb = pkg_pb->add_task_status_list();
st_pb->set_task_id(st_item.task_id);
st_pb->set_status(st_item.status);
st_pb->set_type(st_item.type);
}
auto* header = response->mutable_header();
header->set_success(true);
header->set_error_message("");
setCurrentTimestamp(header->mutable_timestamp());
LOG(INFO) << "RobotStatusTaskPackage dev_id:" << dev_id << " query task count:" << req.task_ids.size() << " ret_code:" << res.ret_code;
return grpc::Status::OK;
}
catch (std::exception &e)
{
auto* header = response->mutable_header();
header->set_success(false);
header->set_error_message(e.what());
setCurrentTimestamp(header->mutable_timestamp());
return grpc::Status::OK;
}
}
// ===================== RobotGoTarget =====================
/**
* @brief
* @param context 使
* @param request ID PGV
* @param response
* @warning
*/
grpc::Status gRPCAGVServiceImpl::RobotGoTarget(
grpc::ServerContext* context,
const api::RobotGoTargetCommand_Request* request,
api::RobotGoTargetCommand_Feedback* response)
{
try
{
std::string dev_id = request->header().device_id();
LOG(INFO) << "[RobotGoTarget] device_id:" << dev_id;
auto agv_dev = dmgr_.getDevice<device::AbstractAgv>(dev_id);
if (!agv_dev)
{
auto* header = response->mutable_header();
header->set_success(false);
header->set_error_message("device not found");
setCurrentTimestamp(header->mutable_timestamp());
return grpc::Status::OK;
}
device::AbstractAgv::RobotGoTargetReq req;
auto& pb_data = request->data();
// -------- 必填字段 --------
req.source_id = pb_data.source_id();
req.id = pb_data.id();
if (pb_data.has_task_id()) req.task_id = pb_data.task_id();
// -------- 运动参数 --------
if (pb_data.has_angle()) req.angle = pb_data.angle();
if (pb_data.has_method()) req.method = pb_data.method();
if (pb_data.has_max_speed()) req.max_speed = pb_data.max_speed();
if (pb_data.has_max_wspeed()) req.max_wspeed = pb_data.max_wspeed();
if (pb_data.has_max_acc()) req.max_acc = pb_data.max_acc();
if (pb_data.has_max_wacc()) req.max_wacc = pb_data.max_wacc();
if (pb_data.has_duration()) req.duration = pb_data.duration();
if (pb_data.has_orientation()) req.orientation = pb_data.orientation();
if (pb_data.has_spin()) req.spin = pb_data.spin();
if (pb_data.has_delay()) req.delay = pb_data.delay();
if (pb_data.has_start_rot_dir()) req.start_rot_dir = pb_data.start_rot_dir();
if (pb_data.has_end_rot_dir()) req.end_rot_dir = pb_data.end_rot_dir();
if (pb_data.has_reach_dist()) req.reach_dist = pb_data.reach_dist();
if (pb_data.has_reach_angle()) req.reach_angle = pb_data.reach_angle();
if (pb_data.has_skill_name()) req.skill_name = pb_data.skill_name();
// -------- PGV 二次定位 --------
if (pb_data.has_pgv())
{
auto& pgv_pb = pb_data.pgv();
req.pgv.use_pgv = pgv_pb.use_pgv();
req.pgv.use_down_pgv = pgv_pb.use_down_pgv();
if (pgv_pb.has_pgv_adjust_dist()) req.pgv.pgv_adjust_dist = pgv_pb.pgv_adjust_dist();
if (pgv_pb.has_pgv_adjust_cx()) req.pgv.pgv_adjust_cx = pgv_pb.pgv_adjust_cx();
if (pgv_pb.has_pgv_adjust_cy()) req.pgv.pgv_adjust_cy = pgv_pb.pgv_adjust_cy();
if (pgv_pb.has_pgv_x_adjust()) req.pgv.pgv_x_adjust = pgv_pb.pgv_x_adjust();
}
// -------- 设备动作 --------
if (pb_data.has_operation()) req.operation = pb_data.operation();
if (pb_data.has_jack_height()) req.jack_height = pb_data.jack_height();
if (pb_data.has_start_height()) req.start_height = pb_data.start_height();
if (pb_data.has_end_height()) req.end_height = pb_data.end_height();
if (pb_data.has_fork_mid_height()) req.fork_mid_height = pb_data.fork_mid_height();
if (pb_data.has_fork_dist()) req.fork_dist = pb_data.fork_dist();
if (pb_data.has_direction()) req.direction = pb_data.direction();
if (pb_data.has_recognize()) req.recognize = pb_data.recognize();
if (pb_data.has_recfile()) req.recfile = pb_data.recfile();
// -------- 音频 --------
if (pb_data.has_sounds_args())
{
auto& s_pb = pb_data.sounds_args();
if (s_pb.has_name()) req.sounds_args.name = s_pb.name();
if (s_pb.has_loop()) req.sounds_args.loop = s_pb.loop();
if (s_pb.has_stop()) req.sounds_args.stop = s_pb.stop();
}
// -------- WaitDI --------
if (pb_data.has_wait_di_args())
{
auto& di_pb = pb_data.wait_di_args();
req.wait_di_args.timeout = di_pb.timeout();
for (auto& item : di_pb.di())
{
device::AbstractAgv::DIItem di;
di.id = item.id();
di.status = item.status();
req.wait_di_args.DI.push_back(di);
}
}
// -------- SetDO --------
if (pb_data.has_set_do_args())
{
auto& do_pb = pb_data.set_do_args();
for (auto& item : do_pb.do_list())
{
device::AbstractAgv::DOItem d;
d.id = item.id();
d.status = item.status();
req.set_do_args.DO.push_back(d);
}
}
// -------- 脚本 --------
if (pb_data.has_script_name()) req.script_name = pb_data.script_name();
if (pb_data.has_script_stage()) req.script_stage = pb_data.script_stage();
if (pb_data.has_script_args())
{
auto& s_arg_pb = pb_data.script_args();
for (auto& kv : s_arg_pb.str_kv()) req.script_args.str_kv[kv.first] = kv.second;
for (auto& kv : s_arg_pb.num_kv()) req.script_args.num_kv[kv.first] = kv.second;
for (auto& d : s_arg_pb.do_list())
{
device::AbstractAgv::DOItem di;
di.id = d.id();
di.status = d.status();
req.script_args.do_list.push_back(di);
}
for (auto& di : s_arg_pb.di_list())
{
device::AbstractAgv::DIItem d;
d.id = di.id();
d.status = di.status();
req.script_args.di_list.push_back(d);
}
}
// -------- 原地旋转 --------
if (pb_data.has_move_angle()) req.move_angle = pb_data.move_angle();
if (pb_data.has_speed_w()) req.speed_w = pb_data.speed_w();
if (pb_data.has_loc_mode()) req.loc_mode = pb_data.loc_mode();
// -------- 自由导航 --------
if (pb_data.has_freego())
{
auto& fg_pb = pb_data.freego();
req.freeGo.x = fg_pb.x();
req.freeGo.y = fg_pb.y();
req.freeGo.theta = fg_pb.theta();
}
// 调用设备层
device::AbstractAgv::RobotGoTargetRes res;
agv_dev->robotGoTarget(res, req);
auto* out_data = response->mutable_data();
out_data->set_ret_code(res.ret_code);
out_data->set_create_on(res.create_on);
out_data->set_err_msg(res.err_msg);
auto* header = response->mutable_header();
header->set_success(true);
header->set_error_message("");
setCurrentTimestamp(header->mutable_timestamp());
LOG(INFO) << "[RobotGoTarget] finish ret_code=" << res.ret_code;
return grpc::Status::OK;
}
catch (std::exception& e)
{
auto* header = response->mutable_header();
header->set_success(false);
header->set_error_message(std::string("exception:") + e.what());
setCurrentTimestamp(header->mutable_timestamp());
return grpc::Status::OK;
}
}
// ===================== RobotControlStop =====================
/**
* @brief
* @param context 使
* @param request ID
* @param response
*/
grpc::Status gRPCAGVServiceImpl::RobotControlStop(
grpc::ServerContext* context,
const api::RobotControlStopCommand::Request* request,
api::RobotControlStopCommand::Feedback* response) {
const auto& header = request->header();
std::string device_id = header.device_id();
auto* fb_header = response->mutable_header();
if (device_id.empty()) {
fb_header->set_error_message("Missing device_id");
return grpc::Status::OK;
}
auto agv = dmgr_.getDevice<cmvr::device::AbstractAgv>(device_id);
if (!agv) {
fb_header->set_error_message("Device not found or not an AGV");
return grpc::Status::OK;
}
cmvr::device::AbstractAgv::RobotControlStopRes res;
agv->robotControlStop(res);
auto* status = response->mutable_status();
status->set_ret_code(res.ret_code);
status->set_create_on(res.create_on);
status->set_err_msg(res.err_msg);
if (res.ret_code == 0) {
fb_header->set_error_message("");
} else {
fb_header->set_error_message(res.err_msg.empty() ? "Stop motion failed" : res.err_msg);
}
return grpc::Status::OK;
}
// ===================== RobotTaskPause =====================
/**
* @brief
* @param context 使
* @param request ID
* @param response
*/
grpc::Status gRPCAGVServiceImpl::RobotTaskPause(
grpc::ServerContext* context,
const api::RobotTaskPauseCommand::Request* request,
api::RobotTaskPauseCommand::Feedback* response) {
const auto& header = request->header();
std::string device_id = header.device_id();
auto* fb_header = response->mutable_header();
if (device_id.empty()) {
fb_header->set_error_message("Missing device_id");
return grpc::Status::OK;
}
auto agv = dmgr_.getDevice<cmvr::device::AbstractAgv>(device_id);
if (!agv) {
fb_header->set_error_message("Device not found or not an AGV");
return grpc::Status::OK;
}
cmvr::device::AbstractAgv::RobotTaskPauseRes res;
try {
agv->robotTaskPause(res);
} catch (const std::exception& e) {
fb_header->set_error_message(std::string("Exception: ") + e.what());
return grpc::Status::OK;
}
auto* status = response->mutable_status();
status->set_ret_code(res.ret_code);
status->set_create_on(res.create_on);
status->set_err_msg(res.err_msg);
if (res.ret_code != 0) {
fb_header->set_error_message(res.err_msg.empty() ? "Pause task failed" : res.err_msg);
} else {
fb_header->set_error_message("");
}
return grpc::Status::OK;
}
// ===================== RobotTaskResume =====================
/**
* @brief
* @param context 使
* @param request ID
* @param response
*/
grpc::Status gRPCAGVServiceImpl::RobotTaskResume(
grpc::ServerContext* context,
const api::RobotTaskResumeCommand::Request* request,
api::RobotTaskResumeCommand::Feedback* response) {
const auto& header = request->header();
std::string device_id = header.device_id();
auto* fb_header = response->mutable_header();
if (device_id.empty()) {
fb_header->set_error_message("Missing device_id");
return grpc::Status::OK;
}
auto agv = dmgr_.getDevice<cmvr::device::AbstractAgv>(device_id);
if (!agv) {
fb_header->set_error_message("Device not found or not an AGV");
return grpc::Status::OK;
}
cmvr::device::AbstractAgv::RobotTaskResumeRes res;
try {
agv->robotTaskResume(res);
} catch (const std::exception& e) {
fb_header->set_error_message(std::string("Exception: ") + e.what());
return grpc::Status::OK;
}
auto* status = response->mutable_status();
status->set_ret_code(res.ret_code);
status->set_create_on(res.create_on);
status->set_err_msg(res.err_msg);
if (res.ret_code != 0) {
fb_header->set_error_message(res.err_msg.empty() ? "Resume task failed" : res.err_msg);
} else {
fb_header->set_error_message("");
}
return grpc::Status::OK;
}
// ===================== RobotTaskCancel =====================
/**
* @brief
* @param context 使
* @param request ID
* @param response
*/
grpc::Status gRPCAGVServiceImpl::RobotTaskCancel(
grpc::ServerContext* context,
const api::RobotTaskCancelCommand::Request* request,
api::RobotTaskCancelCommand::Feedback* response) {
const auto& header = request->header();
std::string device_id = header.device_id();
auto* fb_header = response->mutable_header();
if (device_id.empty()) {
fb_header->set_error_message("Missing device_id");
return grpc::Status::OK;
}
auto agv = dmgr_.getDevice<cmvr::device::AbstractAgv>(device_id);
if (!agv) {
fb_header->set_error_message("Device not found or not an AGV");
return grpc::Status::OK;
}
cmvr::device::AbstractAgv::RobotTaskCancelRes res;
try {
agv->robotTaskCancel(res);
} catch (const std::exception& e) {
fb_header->set_error_message(std::string("Exception: ") + e.what());
return grpc::Status::OK;
}
auto* status = response->mutable_status();
status->set_ret_code(res.ret_code);
status->set_create_on(res.create_on);
status->set_err_msg(res.err_msg);
if (res.ret_code != 0) {
fb_header->set_error_message(res.err_msg.empty() ? "Cancel task failed" : res.err_msg);
} else {
fb_header->set_error_message("");
}
return grpc::Status::OK;
}
} // namespace cmvr::service

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,8 @@
/**
* @file agv_service.proto
* @brief AGV服务的gRPC接口AGV相关命令
* gRPCAGVServiceImpl
*/
syntax = "proto3";
import "cmvr/api/agv_command.proto";
@ -45,16 +50,25 @@ service AgvService {
rpc RobotGoTargetList(RobotGoTargetListCommand.Request) returns (RobotGoTargetListCommand.Feedback);
// 1020 robot_status_task_req
rpc RobotStatusTask(RobotStatusTaskCommand.Request) returns (RobotStatusTaskCommand.Feedback);
// 1020 robot_status_task_req
rpc RobotStatusTaskCurrent(RobotStatusTaskCurrentCommand.Request) returns (RobotStatusTaskCurrentCommand.Feedback);
// 1110 robot_status_task_status_package_req
rpc RobotStatusTaskPackage(RobotStatusTaskPackageCommand.Request) returns (RobotStatusTaskPackageCommand.Feedback);
// 3051 robot_task_gotarget_req 0x0BEB
rpc RobotGoTarget(RobotGoTargetCommand.Request) returns (RobotGoTargetCommand.Feedback);
// 0x07D0
rpc RobotControlStop(RobotControlStopCommand.Request) returns (RobotControlStopCommand.Feedback);
}
// 3001 (0x0BB9)
rpc RobotTaskPause(RobotTaskPauseCommand.Request) returns (RobotTaskPauseCommand.Feedback);
// 3002 (0x0BBA)
rpc RobotTaskResume(RobotTaskResumeCommand.Request) returns (RobotTaskResumeCommand.Feedback);
// 3003 (0x0BBB)
rpc RobotTaskCancel(RobotTaskCancelCommand.Request) returns (RobotTaskCancelCommand.Feedback);
}