GrabBag/Module/BinocularMarkReceiver/Inc/IBinocularMarkReceiver.h

188 lines
5.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef IBINOCULARMARKRECEIVER_H
#define IBINOCULARMARKRECEIVER_H
#include <functional>
#include <vector>
#include <string>
#include <cstdint>
// 导出宏定义
#ifdef _WIN32
# ifdef BINOCULARMARKRECEIVER_LIBRARY
# define BINOCULARMARKRECEIVER_EXPORT __declspec(dllexport)
# else
# define BINOCULARMARKRECEIVER_EXPORT __declspec(dllimport)
# endif
#else
# define BINOCULARMARKRECEIVER_EXPORT __attribute__((visibility("default")))
#endif
/**
* @brief 通用 Mark 3D 数据结构
* 不依赖具体算法库的 Mark 数据定义
*/
struct VrMark3D
{
int markID; // Mark ID
double x; // X 坐标
double y; // Y 坐标
double z; // Z 坐标
VrMark3D() : markID(-1), x(0.0), y(0.0), z(0.0) {}
VrMark3D(int id, double _x, double _y, double _z)
: markID(id), x(_x), y(_y), z(_z) {}
};
/**
* @brief 事件类型枚举
*/
enum class ReceiverEventType
{
UNKNOWN, // 未知事件
CONNECTED, // 已连接
DISCONNECTED, // 已断开
CONNECTION_ERROR, // 连接错误
HEARTBEAT_TIMEOUT // 心跳超时
};
/**
* @brief 双目Mark数据接收器接口
* 用于从BinocularMarkApp接收3D Mark检测结果
*/
class BINOCULARMARKRECEIVER_EXPORT IBinocularMarkReceiver
{
public:
virtual ~IBinocularMarkReceiver() = default;
/**
* @brief 单次检测结果结构
*/
struct SingleDetectionResult {
std::vector<VrMark3D> marks; // 检测到的3D标记列表
std::string leftImageBase64; // 左相机图像Base64编码
std::string rightImageBase64; // 右相机图像Base64编码
int64_t timestamp; // 时间戳
int errorCode; // 错误码0表示成功
};
/**
* @brief 图像数据结构
*/
struct ImageData {
std::string leftImageBase64; // 左相机图像Base64编码
std::string rightImageBase64; // 右相机图像Base64编码
int64_t timestamp; // 时间戳
};
/**
* @brief Mark结果回调函数类型持续工作模式
* @param marks 检测到的3D标记列表
* @param timestamp 时间戳
* @param errorCode 错误码0表示成功
*/
using MarkResultCallback = std::function<void(const std::vector<VrMark3D>& marks,
int64_t timestamp,
int errorCode)>;
/**
* @brief 事件回调函数类型
* @param eventType 事件类型
* @param errorMsg 错误消息(可选)
*/
using EventCallback = std::function<void(ReceiverEventType eventType, const std::string& errorMsg)>;
/**
* @brief 启动TCP客户端并连接到服务器
* @param serverIp 服务器IP地址
* @param serverPort 服务器端口
* @return 0-成功,其他-失败
*/
virtual int Connect(const std::string& serverIp, uint16_t serverPort) = 0;
/**
* @brief 断开连接
* @return 0-成功,其他-失败
*/
virtual int Disconnect() = 0;
/**
* @brief 检查是否已连接
* @return true-已连接false-未连接
*/
virtual bool IsConnected() const = 0;
/**
* @brief 发送触发检测命令已废弃使用RequestSingleDetection代替
* @return 0-成功,其他-失败
*/
virtual int TriggerDetection() = 0;
/**
* @brief 请求单次检测同步返回图像和Mark结果
* @param timeoutMs 超时时间毫秒默认5000ms
* @return 检测结果结构体
*/
virtual SingleDetectionResult RequestSingleDetection(int timeoutMs = 5000) = 0;
/**
* @brief 请求获取单次图像(同步返回)
* @param timeoutMs 超时时间毫秒默认5000ms
* @return 图像数据结构体
*/
virtual ImageData RequestSingleImage(int timeoutMs = 5000) = 0;
/**
* @brief 开始持续工作(持续检测并回调结果)
* @return 0-成功,其他-失败
*/
virtual int StartWork() = 0;
/**
* @brief 停止持续工作
* @return 0-成功,其他-失败
*/
virtual int StopWork() = 0;
/**
* @brief 设置标定矩阵(发送标定文件内容到服务端)
* @param calibrationXml 标定文件XML内容
* @return 0-成功,其他-失败
*/
virtual int SetCalibrationMatrix(const std::string& calibrationXml) = 0;
/**
* @brief 设置曝光时间
* @param exposureTime 曝光时间
* @return 0-成功,其他-失败
*/
virtual int SetExposureTime(double exposureTime) = 0;
/**
* @brief 设置增益
* @param gain 增益
* @return 0-成功,其他-失败
*/
virtual int SetGain(double gain) = 0;
/**
* @brief 设置Mark结果回调持续工作模式使用
* @param callback 回调函数
*/
virtual void SetMarkResultCallback(MarkResultCallback callback) = 0;
/**
* @brief 设置事件回调
* @param callback 回调函数
*/
virtual void SetEventCallback(EventCallback callback) = 0;
/**
* @brief 创建BinocularMarkReceiver实例
* @param ppReceiver 接收器实例指针
* @return 0-成功,其他-失败
*/
static int CreateInstance(IBinocularMarkReceiver** ppReceiver);
};
#endif // IBINOCULARMARKRECEIVER_H