GrabBag/AppUtils/AppCommon/Inc/BasePresenter.h

196 lines
4.8 KiB
C
Raw 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"
/**
* @brief
*/
struct DeviceInfo
{
std::string name; // 设备名称
std::string ip; // 设备IP地址
};
/**
* @brief Presenter类
*
* Presenter的共同功能
* -
* - 线
* -
* -
*
*
* - AlgoDetectThreadFunc(): 线
* - ProcessDetectionData():
*
*
* @code
* class GrabBagPresenter : public BasePresenter {
* protected:
* void AlgoDetectThreadFunc() override {
* // 实现具体的检测算法
* }
* void ProcessDetectionData(...) override {
* // 实现数据处理逻辑
* }
* };
* @endcode
*/
class BasePresenter : public QObject
{
Q_OBJECT
public:
explicit BasePresenter(QObject *parent = nullptr);
virtual ~BasePresenter();
/**
* @brief Presenter
* @return 0: , :
*/
virtual 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 GetDefaultCameraIndex() const {
return m_currentCameraIndex;
}
/**
* @brief
* @return
*/
int GetDetectionDataCacheSize() const;
/**
* @brief
* @param filePath
* @return 0: , :
*/
virtual int SaveDetectionDataToFile(const std::string& filePath);
protected:
/**
* @brief 线
*
*
*/
virtual void AlgoDetectThreadFunc() = 0;
/**
* @brief 线
*/
void StartAlgoDetectThread();
/**
* @brief 线
*/
void StopAlgoDetectThread();
/**
* @brief
*/
void ClearDetectionDataCache();
/**
* @brief
* @param dataType
* @param laserData
*/
void AddDetectionDataToCache(EVzResultDataType dataType, const SVzLaserLineData& laserData);
/**
* @brief
* @param cameraList
* @return 0: , :
*/
virtual int InitCamera(std::vector<DeviceInfo>& cameraList);
/**
* @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;
// 相机重连定时器
QTimer* m_pCameraReconnectTimer;
std::vector<DeviceInfo> m_cameraConfigList;
int m_expectedCameraCount;
};
#endif // BASEPRESENTER_H