GrabBag/AppUtils/AppCommon/Inc/BasePresenter.h

478 lines
15 KiB
C
Raw Permalink Normal View History

#ifndef BASEPRESENTER_H
#define BASEPRESENTER_H
#include <atomic>
#include <condition_variable>
#include <thread>
#include <mutex>
#include <vector>
#include <memory>
#include <string>
#include <QObject>
#include <QTimer>
#include "IVrEyeDevice.h"
#include "VZNL_Types.h"
#include "VrCommonConfig.h" // 包含公共配置结构体
#include "LaserDataLoader.h" // 激光数据加载器
#include "IVisionApplicationStatus.h" // 工作状态枚举
/**
* @brief Presenter类
*
* Presenter的共同功能
* - InitCamera
* - InitAlgoParams -
* - 线DetectTask
* -
* -
*
*
* - InitAlgoParams():
* - ProcessAlgoDetection():
* - OpenDevice():
* - TryReconnectCameras():
* - OnCameraStatusChanged():
*
*
* @code
* class GrabBagPresenter : public BasePresenter {
* protected:
* int InitAlgoParams() override { ... }
* int ProcessAlgoDetection() override { ... }
* int OpenDevice(int cameraIndex, ...) override { ... }
* };
* @endcode
*/
class BasePresenter : public QObject
{
Q_OBJECT
public:
explicit BasePresenter(QObject *parent = nullptr);
virtual ~BasePresenter();
/**
* @brief
* @return
*/
int Init();
/**
* @brief
* @param cameraIndex -1
* @param isAuto
* @return 0: , :
*/
virtual int StartDetection(int cameraIndex = -1, bool isAuto = true);
/**
* @brief
* @return 0: , :
*/
virtual int StopDetection();
/**
* @brief
* @return IP地址和设备指针的pair
*/
std::vector<std::pair<std::string, IVrEyeDevice*>> GetCameraList() const {
return m_vrEyeDeviceList;
}
/**
* @brief
* @param cameraIndex
*/
void SetDefaultCameraIndex(int cameraIndex) {
m_currentCameraIndex = cameraIndex;
}
/**
* @brief
* @return
*/
int GetDetectIndex() const {
return m_currentCameraIndex;
}
/**
* @brief
* @return
*/
int GetDetectionDataCacheSize() const;
/**
* @brief 便
*
*
*
* @param filePath
* @return 0: , :
*/
virtual int SaveDetectionDataToFile(const std::string& filePath);
/**
* @brief virtual
*
*
*
* @param filePath
* @return 0: , :
*/
virtual int LoadDebugDataAndDetect(const std::string& filePath);
/**
* @brief
*
*
*
* @param fNotify
* @param param
*/
void SetCameraStatusCallback(VzNL_OnNotifyStatusCBEx fNotify, void* param);
/**
* @brief
* @return
*/
WorkStatus GetCurrentWorkStatus() const {
return m_currentWorkStatus;
}
/**
* @brief
* @param status
*/
void SetWorkStatus(WorkStatus status);
/**
* @brief
*
* UI状态变化
*
*
* @tparam StatusCallbackType
* @param statusCallback
*/
template<typename StatusCallbackType>
void SetStatusCallback(StatusCallbackType* statusCallback) {
m_pStatusCallback = static_cast<void*>(statusCallback);
}
/**
* @brief
*
*
*
* @tparam StatusCallbackType
* @return
*/
template<typename StatusCallbackType>
StatusCallbackType* GetStatusCallback() const {
return static_cast<StatusCallbackType*>(m_pStatusCallback);
}
/**
* @brief
*
* 使
* GetDetectionCallback()
*
* @param eDataType
* @param pLaserLinePoint 线
* @param pUserData BasePresenter实例指针
*/
static void _StaticDetectionCallback(EVzResultDataType eDataType, SVzLaserLineData* pLaserLinePoint, void* pUserData);
/**
* @brief
*
* 使
* GetCameraStatusCallback()
*
* @param eStatus
* @param pExtData
* @param nDataLength
* @param pInfoParam BasePresenter实例指针
*/
static void _StaticCameraStatusCallback(EVzDeviceWorkStatus eStatus, void* pExtData, unsigned int nDataLength, void* pInfoParam);
protected:
// ============ 纯虚函数 - 子类必须实现 ============
/**
* @brief
* @return 0: , :
*/
virtual int InitApp() = 0;
/**
* @brief
*
*
* -
* -
* -
*
* @return 0: , :
*/
virtual int InitAlgoParams() = 0;
/**
* @brief
*
*
* - 使
* -
* -
*
* @param detectionDataCache
* @return 0: , :
*/
virtual int ProcessAlgoDetection(std::vector<std::pair<EVzResultDataType, SVzLaserLineData>>& detectionDataCache) = 0;
/**
* @brief
*
* BasePresenter
*
*
* @return
*/
virtual VzNL_OnNotifyStatusCBEx GetCameraStatusCallback() {
return &BasePresenter::_StaticCameraStatusCallback;
}
/**
* @brief
*
* BasePresenter
*
*
* @return
*/
virtual VzNL_AutoOutputLaserLineExCB GetDetectionCallback() {
return &BasePresenter::_StaticDetectionCallback;
}
/**
* @brief
*
* 使
* - keResultDataType_Position (XYZ位置)
* - keResultDataType_PointXYZRGBA (RGBA颜色)
*
* @return
*/
virtual EVzResultDataType GetDetectionDataType() = 0;
/**
* @brief
*
*
* -
* -
* - OpenDevice
* - OnCameraStatusChanged
* -
*
*
*
* @return true: , false:
*/
virtual bool TryReconnectCameras();
/**
* @brief
*
* @param cameraIndex
* @param isConnected
*/
virtual void OnCameraStatusChanged(int cameraIndex, bool isConnected) = 0;
/**
* @brief
*
* BasePresenter
* OnWorkStatusChanged
*
* @param status
*/
virtual void OnWorkStatusChanged(WorkStatus status) {
// 默认空实现子类可以重写以调用UI回调
}
/**
* @brief
*
* BasePresenter
* OnCameraCountChanged
*
* @param count
*/
virtual void OnCameraCountChanged(int count) {
// 默认空实现子类可以重写以调用UI回调
}
/**
* @brief
*
* BasePresenter
* OnStatusUpdate
*
* @param statusMessage
*/
virtual void OnStatusUpdate(const std::string& statusMessage) {
// 默认空实现子类可以重写以调用UI回调
}
// ============ 公共实现方法 ============
/**
* @brief
*
*
* -
* -
* - OpenDevice
* -
*
* @param cameraList
* @return 0: , :
*/
virtual int InitCamera(std::vector<DeviceInfo>& cameraList, bool bRGB, bool bSwing);
/**
* @brief virtual允许子类重写以添加特殊清理逻辑
*/
virtual void ClearDetectionDataCache();
/**
* @brief
* @param dataType
* @param laserData
*/
void AddDetectionDataToCache(EVzResultDataType dataType, const SVzLaserLineData& laserData);
/**
* @brief
*
* 线访
*
*
* @param func
* @return func
*/
template<typename Func>
int AccessDetectionDataCache(Func func) {
std::lock_guard<std::mutex> lock(m_detectionDataMutex);
return func(m_detectionDataCache);
}
private:
/**
* @brief
*
*
* - IVrEyeDevice
* -
* - GetCameraStatusCallback
* - 使 GetOpenDeviceMode
* -
*
* @param cameraIndex 1
* @param cameraName
* @param cameraIp IP地址
* @return 0: , :
*/
int OpenDevice(int cameraIndex, const char* cameraName, const char* cameraIp, bool bRGB, bool bSwing);
/**
* @brief 线
*
* 线
* -
* - ProcessAlgoDetection
* -
*/
void AlgoDetectThreadFunc();
/**
* @brief
*
*
* -
* - ProcessAlgoDetection
* -
*
* @return 0: , :
*/
int DetectTask();
/**
* @brief 线
*/
void StartAlgoDetectThread();
/**
* @brief 线
*/
void StopAlgoDetectThread();
/**
* @brief
*/
void StartCameraReconnectTimer();
/**
* @brief
*/
void StopCameraReconnectTimer();
private slots:
/**
* @brief
*/
void OnCameraReconnectTimer();
protected:
// 相机设备列表
std::vector<std::pair<std::string, IVrEyeDevice*>> m_vrEyeDeviceList;
// 当前相机索引
int m_currentCameraIndex = 0;
// 连接状态标志
bool m_bCameraConnected = false;
// 算法检测线程相关
std::atomic<bool> m_bAlgoDetectThreadRunning;
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;
// 激光数据加载器
LaserDataLoader m_dataLoader;
// 相机重连定时器
QTimer* m_pCameraReconnectTimer;
std::vector<DeviceInfo> m_expectedList;
bool m_bRGB{false};
bool m_bSwing{true};
// 工作状态管理
WorkStatus m_currentWorkStatus = WorkStatus::InitIng;
// 状态回调接口使用void*存储,避免模板化整个类)
void* m_pStatusCallback = nullptr;
};
#endif // BASEPRESENTER_H