GrabBag/GrabBagApp/Presenter/Inc/GrabBagPresenter.h

175 lines
6.9 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 GRABBAGPRESENTER_H
#define GRABBAGPRESENTER_H
#include <condition_variable>
#include <thread>
#include "IVrConfig.h"
#include "IVrEyeDevice.h"
#include "IYGrabBagStatus.h"
#include "DetectPresenter.h"
#include "RobotProtocol.h"
#include "SerialProtocol.h"
#include "VZNL_Types.h"
#include "SG_bagPositioning_Export.h"
#include "LaserDataLoader.h"
#include "PathManager.h"
#include "ConfigManager.h"
#include <QImage>
#include <QPainter>
#include <QColor>
#include <memory>
class GrabBagPresenter : public IVrConfigChangeNotify, public IConfigChangeListener
{
public:
GrabBagPresenter();
~GrabBagPresenter();
// 初始化
int Init();
// 设置状态回调
void SetStatusCallback(IYGrabBagStatus* status);
// 开始检测
int StartDetection(int cameraIndex = -1, bool isAuto = true); // cameraIndex: -1表示所有相机1/2...表示特定相机
// 停止检测
int StopDetection();
// 加载调试数据进行检测
int LoadDebugDataAndDetect(const std::string& filePath);
// 为所有相机设置状态回调
void SetCameraStatusCallback(VzNL_OnNotifyStatusCBEx fNotify, void* param);
// 设置默认相机索引
void SetDefaultCameraIndex(int cameraIndex);
// 获取当前默认相机索引
int GetDefaultCameraIndex() const { return m_currentCameraIndex; }
// 获取配置对象
IVrConfig* GetConfig() { return m_vrConfig; }
// 获取相机列表
std::vector<std::pair<std::string, IVrEyeDevice*>> GetCameraList() const { return m_vrEyeDeviceList; } // 返回相机列表包括IP地址和设备指针
// 手眼标定矩阵管理
const CalibMatrix GetClibMatrix(int index) const;
// 实现IVrConfigChangeNotify接口
virtual void OnConfigChanged(const ConfigResult& configResult) override;
// 实现IConfigChangeListener接口
virtual void OnSystemConfigChanged(const SystemConfig& config) override;
virtual void OnCameraParamChanged(int cameraIndex, const CameraUIParam& cameraParam) override;
virtual void OnAlgorithmParamChanged(const VrAlgorithmParams& algorithmParams) override;
// 配置管理
ConfigManager* GetConfigManager() { return m_pConfigManager.get(); }
// 获取检测数据缓存的副本(用于保存数据)
int GetDetectIndex() const { return m_currentCameraIndex; }
int GetDetectionDataCacheSize() const { return m_detectionDataCache.size(); }
// 保存检测数据到文件(默认实现)
int SaveDetectionDataToFile(const std::string& filePath);
static void _StaticCameraNotify(EVzDeviceWorkStatus eStatus, void* pExtData, unsigned int nDataLength, void* pInfoParam);
static void _StaticDetectionCallback(EVzResultDataType eDataType, SVzLaserLineData* pLaserLinePoint, void* pParam);
private:
// 机械臂协议相关方法
int InitRobotProtocol();
// 串口协议相关方法
int InitSerialProtocol();
// 算法初始化接口
int InitAlgorithmParams();
// 机械臂协议回调函数
void OnRobotConnectionChanged(bool connected);
bool OnRobotWorkSignal(bool startWork, int cameraIndex);
// 串口协议回调函数
void OnSerialConnectionChanged(bool connected);
bool OnSerialWorkSignal(bool startWork, int cameraIndex);
// 连接状态检查和更新
void CheckAndUpdateWorkStatus();
int _OpenDevice(int cameraIndex, const char* cameraName, const char* cameraIp, ProjectType& projectType, IVrEyeDevice** pDevice = nullptr);
// 静态回调函数,供外部使用
void _CameraNotify(EVzDeviceWorkStatus eStatus, void* pExtData, unsigned int nDataLength, void* pInfoParam);
// 检测数据回调函数
void _DetectionCallback(EVzResultDataType eDataType, SVzLaserLineData* pLaserLinePoint, void* pParam);
// 算法检测线程
void _AlgoDetectThread();
int _DetectTask();
// 释放缓存的检测数据
void _ClearDetectionDataCache();
// 发送检测结果给机械臂
void _SendDetectionResultToRobot(const DetectionResult& detectionResult, int cameraIndex);
// 根据相机索引获取调平参数
SSG_planeCalibPara _GetCameraCalibParam(int cameraIndex);
private:
IVrConfig* m_vrConfig = nullptr;
std::vector<std::pair<std::string, IVrEyeDevice*>> m_vrEyeDeviceList;
IYGrabBagStatus* m_pStatus = nullptr;
DetectPresenter* m_pDetectPresenter = nullptr;
RobotProtocol* m_pRobotProtocol = nullptr;
SerialProtocol* m_pSerialProtocol = nullptr;
// 连接状态标志
bool m_bCameraConnected = false; // 相机连接状态
bool m_bRobotConnected = false; // 机械臂连接状态
bool m_bSerialConnected = false; // 串口连接状态
WorkStatus m_currentWorkStatus = WorkStatus::Error; // 当前工作状态
int m_currentCameraIndex = 0; // 当前使用的相机编号
std::atomic<bool> m_bAlgoDetectThreadRunning = false;
std::mutex m_algoDetectMutex;
std::condition_variable m_algoDetectCondition;
std::thread m_algoDetectThread; // 算法检测线程
// 检测数据缓存 - 统一存储两种类型的数据
std::mutex m_detectionDataMutex;
std::vector<std::pair<EVzResultDataType, SVzLaserLineData>> m_detectionDataCache; // 统一存储数据
// 算法参数成员变量
SG_bagPositionParam m_algoParam; // 算法参数
SSG_planeCalibPara m_planeCalibParam; // 默认平面校准参数
std::vector<VrCameraPlaneCalibParam> m_cameraCalibParams; // 多相机调平参数
std::vector<CalibMatrix> m_clibMatrixList; // 手眼标定矩阵列表
VrDebugParam m_debugParam; // 调试参数
// 颜色参数成员变量
SSG_hsvCmpParam m_hsvCmpParam; // HSV颜色比较参数
RGB m_rgbColorPattern; // RGB颜色模式
double m_frontColorTemplate[RGN_HIST_SIZE]; // 颜色模板参数
double m_backColorTemplate[RGN_HIST_SIZE]; // 颜色模板参数
ProjectType m_projectType;
// 调试数据加载器
LaserDataLoader m_dataLoader;
// 配置管理器
std::unique_ptr<ConfigManager> m_pConfigManager;
};
#endif // GRABBAGPRESENTER_H