GrabBag/GrabBagApp/Presenter/Inc/RobotProtocol.h

193 lines
5.8 KiB
C
Raw Normal View History

2025-06-08 12:48:04 +08:00
#ifndef ROBOTPROTOCOL_H
#define ROBOTPROTOCOL_H
#include <functional>
#include <vector>
2025-06-08 12:48:04 +08:00
#include "IYModbusTCPServer.h"
2025-06-08 12:48:04 +08:00
/**
* @brief ModbusTCP协议封装类
*
*/
class RobotProtocol
{
public:
/**
* @brief
*/
struct RobotCoordinate {
float x; // X坐标
float y; // Y坐标
float z; // Z坐标
float rx; // X轴旋转
float ry; // Y轴旋转
float rz; // Z轴旋转
};
/**
* @brief x,y,z,rz
*/
struct TargetPosition {
float x; // X坐标
float y; // Y坐标
float z; // Z坐标
float rz; // Z轴旋转yaw角
uint16_t cameraId; // 相机ID从1开始编号
};
/**
* @brief
*/
struct MultiTargetData {
uint16_t count; // 目标数量
uint16_t cameraId; // 当前检测的相机ID从1开始编号
std::vector<TargetPosition> targets; // 目标位置列表
MultiTargetData() : count(0), cameraId(1) {} // 默认相机ID为1
};
2025-06-08 12:48:04 +08:00
/**
* @brief
*/
enum RobotStatus {
STATUS_DISCONNECTED = 0, // 断开连接
STATUS_CONNECTED = 1, // 已连接
STATUS_IDLE = 2, // 空闲状态
STATUS_WORKING = 3, // 工作中
STATUS_ERROR = 4 // 错误状态
};
/**
* @brief
* @param connected true-false-
*/
using ConnectionCallback = std::function<void(bool connected)>;
/**
* @brief
* @param startWork true-false-
* @param cameraId ID112...
2025-06-08 12:48:04 +08:00
*/
using WorkSignalCallback = std::function<bool(bool startWork, int cameraId)>;
2025-06-08 12:48:04 +08:00
public:
RobotProtocol();
~RobotProtocol();
/**
* @brief ModbusTCP服务
* @param port TCP端口号502
* @return 0--
*/
int Initialize(uint16_t port = 502);
/**
* @brief
*/
void Deinitialize();
/**
* @brief
* @param multiTargetData
* @param cameraId ID1
2025-06-08 12:48:04 +08:00
* @return 0--
*/
int SetMultiTargetData(const MultiTargetData& multiTargetData, uint16_t cameraId);
2025-06-08 12:48:04 +08:00
/**
* @brief
* @return
*/
RobotStatus GetDetectionStatus() const;
/**
* @brief
* @param callback
*/
void SetConnectionCallback(const ConnectionCallback& callback);
/**
* @brief
* @param callback
*/
void SetWorkSignalCallback(const WorkSignalCallback& callback);
/**
* @brief
* @return true-false-
*/
bool IsRunning() const;
/**
* @brief
* @param status 0-1-12-23-
* @return 0--
*/
int SetWorkStatus(uint16_t status);
// 工作状态定义(公共常量)
static const uint16_t WORK_STATUS_IDLE = 0; // 空闲
static const uint16_t WORK_STATUS_CAMERA1_DONE = 1; // 相机1工作完成
static const uint16_t WORK_STATUS_CAMERA2_DONE = 2; // 相机2工作完成
static const uint16_t WORK_STATUS_BUSY = 3; // 忙碌
2025-06-08 12:48:04 +08:00
private:
/**
* @brief ModbusTCP服务器
*/
void StopModbusTCPServer();
/**
* @brief ModbusTCP连接状态变化
* @param connected true-false-
*/
void OnModbusTCPConnectionChanged(bool connected);
2025-06-08 12:48:04 +08:00
/**
* @brief 线
* @param unitId ID
* @param startAddress
* @param quantity
* @param values
* @return
*/
IYModbusTCPServer::ErrorCode OnWriteCoils(uint8_t unitId, uint16_t startAddress,
uint16_t quantity, const uint8_t* values);
/**
* @brief
* @param unitId ID
* @param startAddress
* @param quantity
* @param values
* @return
*/
IYModbusTCPServer::ErrorCode OnWriteRegisters(uint8_t unitId, uint16_t startAddress,
uint16_t quantity, const uint16_t* values);
private:
// ModbusTCP相关
IYModbusTCPServer* m_pModbusServer; // ModbusTCP服务器实例
bool m_bServerRunning; // 服务器运行状态
uint16_t m_nPort; // TCP端口
// 机械臂数据
RobotStatus m_robotStatus; // 机械臂状态
// 回调函数
ConnectionCallback m_connectionCallback; // 连接状态回调
WorkSignalCallback m_workSignalCallback; // 工作信号回调
// Modbus地址映射
static const uint16_t WORK_SIGNAL_ADDR = 0; // 工作信号线圈地址 (所有相机)
static const uint16_t STATUS_ADDR = 1; // 状态地址
static const uint16_t COORD_ONE_START_ADDR = 4; // 相机一的检测开始地址
static const uint16_t COORD_TWO_START_ADDR = 46; // 相机二的检测开始地址
2025-06-08 12:48:04 +08:00
};
#endif // ROBOTPROTOCOL_H