GrabBag/Module/BinocularMarkReceiver/_Inc/BinocularMarkReceiver.h

172 lines
6.4 KiB
C
Raw Permalink Normal View History

2025-12-10 00:01:32 +08:00
#ifndef BINOCULARMARKRECEIVER_H
#define BINOCULARMARKRECEIVER_H
#include "IBinocularMarkReceiver.h"
#include "IVrTCPClient.h"
2025-12-10 00:01:32 +08:00
#include <mutex>
#include <condition_variable>
#include <thread>
#include <atomic>
#include <string>
#include <vector>
2025-12-10 00:01:32 +08:00
/**
* @brief BinocularMarkReceiver实现类
* TCP客户端BinocularMarkApp发送的Mark检测结果
*/
class BinocularMarkReceiver : public IBinocularMarkReceiver
2025-12-10 00:01:32 +08:00
{
public:
BinocularMarkReceiver();
2025-12-10 00:01:32 +08:00
~BinocularMarkReceiver() override;
// 实现IBinocularMarkReceiver接口
int Connect(const std::string& serverIp, uint16_t serverPort) override;
2025-12-10 00:01:32 +08:00
int Disconnect() override;
bool IsConnected() const override;
SingleDetectionResult RequestSingleDetection(int timeoutMs = 5000) override;
ImageData RequestSingleImage(int timeoutMs = 5000) override;
int StartWork() override;
int StopWork() override;
2025-12-20 16:18:12 +08:00
int StartCapture() override;
int StopCapture() override;
std::string GetCalibrationMatrix(int timeoutMs = 3000) override;
int SetCalibrationMatrix(const std::string& calibrationXml) override;
2025-12-20 16:18:12 +08:00
int SetExposureTime(SVrCameraEnum target, double exposureTime) override;
int SetGain(SVrCameraEnum target, double gain) override;
CameraInfo GetCameraInfo(SVrCameraEnum target, int timeoutMs = 3000) override;
2025-12-10 00:01:32 +08:00
void SetMarkResultCallback(MarkResultCallback callback) override;
2025-12-20 16:18:12 +08:00
void SetImageCallback(ImageCallback callback) override;
void SetEventCallback(EventCallback callback) override;
2025-12-10 00:01:32 +08:00
private:
2025-12-10 00:01:32 +08:00
/**
* @brief
2025-12-10 00:01:32 +08:00
*/
void parseFrames();
2025-12-10 00:01:32 +08:00
/**
* @brief JSON消息
* @param jsonData JSON数据
2025-12-10 00:01:32 +08:00
*/
void handleJsonMessage(const std::string& jsonData);
2025-12-10 00:01:32 +08:00
/**
* @brief Mark结果消息
* @param jsonStr JSON字符串
2025-12-10 00:01:32 +08:00
*/
void handleMarkResult(const std::string& jsonStr);
2025-12-10 00:01:32 +08:00
/**
* @brief
* @param jsonStr JSON字符串
2025-12-10 00:01:32 +08:00
*/
void handleSingleDetectionResult(const std::string& jsonStr);
2025-12-10 00:01:32 +08:00
/**
* @brief
* @param jsonStr JSON字符串
2025-12-10 00:01:32 +08:00
*/
void handleImageData(const std::string& jsonStr);
2025-12-10 00:01:32 +08:00
2025-12-20 16:18:12 +08:00
/**
* @brief
* @param jsonStr JSON字符串
*/
void handleHeartbeat(const std::string& jsonStr);
2025-12-10 00:01:32 +08:00
/**
* @brief
* @param jsonStr JSON字符串
2025-12-10 00:01:32 +08:00
*/
void handleHeartbeatAck(const std::string& jsonStr);
2025-12-10 00:01:32 +08:00
/**
* @brief
* @param jsonStr JSON字符串
2025-12-10 00:01:32 +08:00
*/
void handleCommandResponse(const std::string& jsonStr);
2025-12-10 00:01:32 +08:00
2025-12-20 16:18:12 +08:00
/**
* @brief
* @param jsonStr JSON字符串
*/
void handleCameraInfoResponse(const std::string& jsonStr);
/**
* @brief
* @param jsonStr JSON字符串
*/
void handleCalibrationMatrixResponse(const std::string& jsonStr);
2025-12-10 00:01:32 +08:00
/**
* @brief
* @param jsonData JSON数据
* @return +++
*/
std::string buildFrame(const std::string& jsonData);
2025-12-10 00:01:32 +08:00
/**
* @brief JSON消息
* @param messageType
* @param jsonData JSON数据字符串
2025-12-10 00:01:32 +08:00
* @return 0--
*/
int sendJsonMessage(const std::string& messageType, const std::string& jsonData);
2025-12-10 00:01:32 +08:00
private:
// TCP回调函数
static void tcpRecvCallback(IVrTCPClient* pClient, const char* pData, const int nLen, void* pParam);
static void linkEventCallback(IVrTCPClient* pClient, bool connected, void* pParam);
2025-12-10 00:01:32 +08:00
// 心跳线程函数
void heartbeatThreadFunc();
IVrTCPClient* m_pTcpClient; // TCP客户端
2025-12-10 00:01:32 +08:00
std::string m_serverIp; // 服务器IP
uint16_t m_serverPort; // 服务器端口
std::atomic<bool> m_bConnected; // 连接状态
2025-12-10 00:01:32 +08:00
std::vector<char> m_dataBuffer; // 数据缓冲区(处理粘包)
2025-12-10 00:01:32 +08:00
MarkResultCallback m_markResultCallback; // Mark结果回调
2025-12-20 16:18:12 +08:00
ImageCallback m_imageCallback; // 图像回调
EventCallback m_eventCallback; // 事件回调
// 同步等待结果存储
SingleDetectionResult m_pendingSingleDetectionResult;
ImageData m_pendingImageData;
2025-12-20 16:18:12 +08:00
CameraInfo m_pendingLeftCameraInfo;
CameraInfo m_pendingRightCameraInfo;
std::string m_pendingCalibrationMatrix;
std::condition_variable m_cvSingleDetection; // 单次检测条件变量
std::condition_variable m_cvImageData; // 图像数据条件变量
2025-12-20 16:18:12 +08:00
std::condition_variable m_cvLeftCameraInfo; // 左相机信息条件变量
std::condition_variable m_cvRightCameraInfo; // 右相机信息条件变量
std::condition_variable m_cvCalibrationMatrix; // 标定矩阵条件变量
bool m_bSingleDetectionReady;
bool m_bImageDataReady;
2025-12-20 16:18:12 +08:00
bool m_bLeftCameraInfoReady;
bool m_bRightCameraInfoReady;
bool m_bCalibrationMatrixReady;
// 心跳线程
std::thread m_heartbeatThread;
std::atomic<bool> m_bHeartbeatRunning;
2025-12-20 16:18:12 +08:00
std::atomic<bool> m_bHeartbeatEnabled; // 是否启用心跳
int m_nHeartbeatInterval; // 心跳间隔(秒)
2025-12-20 16:18:12 +08:00
std::condition_variable m_cvHeartbeat; // 心跳线程条件变量
std::mutex m_mutexHeartbeat; // 心跳线程互斥锁
2025-12-10 00:01:32 +08:00
mutable std::mutex m_mutex; // 线程安全锁
// 帧格式常量
static constexpr const char* FRAME_HEADER = "##START#";
static constexpr const char* FRAME_TAIL = "#END";
2025-12-10 00:01:32 +08:00
static constexpr int FRAME_HEADER_SIZE = 8;
static constexpr int FRAME_TAIL_SIZE = 4;
static constexpr int FRAME_LENGTH_SIZE = 8;
2025-12-10 00:01:32 +08:00
};
#endif // BINOCULARMARKRECEIVER_H