322 lines
9.5 KiB
C
Raw Normal View History

#ifndef TUNNELCHANNELPRESENTER_H
#define TUNNELCHANNELPRESENTER_H
#include <condition_variable>
#include <thread>
#include <map>
#include <mutex>
#include <memory>
#include <atomic>
#include <chrono>
#include "BasePresenter.h"
#include "IVrEyeDevice.h"
#include "IHikDevice.h"
#include "ConfigManager.h"
#include "IYTunnelChannelStatus.h"
#include "VrConvert.h"
#include "LaserDataLoader.h"
#include "CommonDialogCameraLevel.h"
#include "channelSpaceMeasure_Export.h"
#include <QImage>
#include <QPainter>
#include <QColor>
#include <QObject>
#include <QTimer>
#include <memory>
// Forward declarations
class DetectPresenter;
/**
* @brief
*
*
* 1. (IHikDevice) - 2D图像采集
* 2. 3D相机 (VrEyeDevice/VzNLSDK) - 3D点云采集进行算法检测
*
* WorkpieceApp
*/
class TunnelChannelPresenter : public BasePresenter, public IVrConfigChangeNotify,
public ICameraLevelCalculator, public ICameraLevelResultSaver
{
Q_OBJECT
public:
explicit TunnelChannelPresenter(QObject *parent = nullptr);
~TunnelChannelPresenter();
// 初始化
int InitApp() override;
// 获取配置管理器
ConfigManager* GetConfigManager() { return m_pConfigManager; }
/**
* @brief
* @param hWnd 使
*/
void SetHikDisplayWindow(void* hWnd) { m_hHikDisplayWnd = hWnd; }
// 实现IVrConfigChangeNotify接口
virtual void OnConfigChanged(const ConfigResult& configResult) override;
// ============ 海康相机相关 ============
/**
* @brief
* @return 0: , :
*/
int InitHikDevice();
/**
* @brief
* @param config
* @return 0: , :
*/
int ConnectHikCamera(const HikCameraConfig& config);
/**
* @brief
*/
void DisconnectHikCamera();
/**
* @brief
* @return 0: , :
*/
int StartHikPreview();
/**
* @brief
* @param hWnd
* @return 0: , :
*/
int StartHikPreviewEx(void* hWnd);
/**
* @brief
*/
void StopHikPreview();
/**
* @brief
* @return
*/
QImage GetCurrentHikFrame() const;
/**
* @brief
* @return true: , false:
*/
bool IsHikCameraConnected() const;
// ============ 实现 ICameraLevelCalculator 接口 ============
/**
* @brief
*/
bool CalculatePlaneCalibration(
const std::vector<std::pair<EVzResultDataType, SVzLaserLineData>>& scanData,
double planeCalib[9],
double& planeHeight,
double invRMatrix[9]) override;
// ============ 实现 ICameraLevelResultSaver 接口 ============
/**
* @brief
*/
bool SaveLevelingResults(double planeCalib[9], double planeHeight, double invRMatrix[9],
int cameraIndex, const QString& cameraName) override;
/**
* @brief
*/
bool LoadLevelingResults(int cameraIndex, const QString& cameraName,
double planeCalib[9], double& planeHeight, double invRMatrix[9]) override;
// ============ 算法参数配置接口 ============
/**
* @brief
*/
void GetAlgoParams(SSG_cornerParam& cornerParam,
SSG_outlierFilterParam& filterParam,
SSG_treeGrowParam& treeParam,
SSX_channelParam& channelParam,
bool& horizonScan) const;
/**
* @brief
*/
void SetAlgoParams(const SSG_cornerParam& cornerParam,
const SSG_outlierFilterParam& filterParam,
const SSG_treeGrowParam& treeParam,
const SSX_channelParam& channelParam,
bool horizonScan);
/**
* @brief
* @return truefalse
*/
bool SaveAlgoParamsToConfig();
protected:
// ============ 实现 BasePresenter 纯虚函数 ============
/**
* @brief
*/
int InitAlgoParams() override;
/**
* @brief
* @param detectionDataCache
*/
int ProcessAlgoDetection(std::vector<std::pair<EVzResultDataType, SVzLaserLineData>>& detectionDataCache) override;
/**
* @brief
* 使Position点云数据
*/
EVzResultDataType GetDetectionDataType() override {
return keResultDataType_Position;
}
/**
* @brief
*/
void OnCameraStatusChanged(int cameraIndex, bool isConnected) override;
/**
* @brief
*/
void OnWorkStatusChanged(WorkStatus status) override;
/**
* @brief
*/
void OnCameraCountChanged(int count) override;
/**
* @brief
*/
void OnStatusUpdate(const std::string& statusMessage) override;
private:
// ============ 海康相机相关私有方法 ============
/**
* @brief
*/
void OnHikFrameReceived(unsigned char* pRGBData, int dataSize,
const HikFrameInfo& frameInfo);
/**
* @brief
*/
void OnHikDeviceStatusChanged(EHikDeviceStatus status);
/**
* @brief
*/
void OnHikExceptionReceived(EHikExceptionType exceptionType);
/**
* @brief
*/
void OnHikReconnectTimer();
// ============ 连接状态管理 ============
/**
* @brief
*/
void CheckAndUpdateWorkStatus();
/**
* @brief
*/
void NotifyHikCameraStatus(bool isConnected);
/**
* @brief
*/
void NotifyRobotConnectionStatus(bool isConnected);
/**
* @brief
*/
void NotifySerialConnectionStatus(bool isConnected);
signals:
// ============ 跨线程信号用于SDK回调到主线程 ============
/**
* @brief 线
*/
void sigHikImageUpdated(const QImage& image);
/**
* @brief 线
*/
void sigHikStatusChanged(int status);
/**
* @brief 线
*/
void sigHikException(int exceptionType);
private slots:
// ============ 跨线程槽函数 ============
/**
* @brief 线
*/
void onHikImageUpdatedInMainThread(const QImage& image);
/**
* @brief 线
*/
void onHikStatusChangedInMainThread(int status);
/**
* @brief 线
*/
void onHikExceptionInMainThread(int exceptionType);
private:
// 配置管理器
ConfigManager* m_pConfigManager = nullptr;
// ============ 海康相机设备(使用封装接口) ============
IHikDevice* m_pHikDevice = nullptr; // 海康相机设备接口
bool m_bHikConnected = false; // 海康相机连接状态
QTimer* m_pHikReconnectTimer = nullptr; // 海康相机重连定时器
// 海康相机当前帧
mutable std::mutex m_hikFrameMutex;
QImage m_currentHikFrame;
// 帧率限制避免过度刷新UI
std::chrono::steady_clock::time_point m_lastHikFrameTime;
static constexpr int HIK_FRAME_INTERVAL_MS = 33; // 约30fps
// 海康相机显示窗口句柄(用于硬件渲染)
void* m_hHikDisplayWnd = nullptr;
// 检测处理器
DetectPresenter* m_pDetectPresenter = nullptr;
// ============ 通道间距测量算法参数 ============
SSG_cornerParam m_cornerParam; // 角点检测参数
SSG_outlierFilterParam m_outlierFilterParam; // 离群点过滤参数
SSG_treeGrowParam m_treeGrowParam; // 树生长参数
SSX_channelParam m_channelParam; // 通道参数
bool m_bHorizonScan = true; // 扫描方向true-水平扫描false-垂直扫描
};
#endif // TUNNELCHANNELPRESENTER_H