2025-12-27 09:34:02 +08:00

190 lines
6.0 KiB
C++
Raw Permalink 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 WHEELMEASUREPRESENTER_H
#define WHEELMEASUREPRESENTER_H
#include "BasePresenter.h"
#include "IVrWheelMeasureConfig.h"
#include "IWheelMeasureStatus.h"
#include "CommonDialogCameraLevel.h"
#include <QImage>
#include <QString>
#include <QStringList>
/**
* @brief 车轮拱高测量Presenter
* 继承BasePresenter负责相机控制、算法调用和结果处理
*/
class WheelMeasurePresenter : public BasePresenter,
public IVrWheelMeasureConfigChangeNotify,
public ICameraLevelCalculator,
public ICameraLevelResultSaver
{
Q_OBJECT
signals:
void configUpdated();
public:
explicit WheelMeasurePresenter(QObject* parent = nullptr);
~WheelMeasurePresenter();
// ============ 实现 BasePresenter 纯虚函数 ============
/**
* @brief 私有初始化(实现纯虚函数)
*/
int InitApp() override;
/**
* @brief 初始化算法参数(实现纯虚函数)
*/
int InitAlgoParams() override;
/**
* @brief 执行算法检测(实现纯虚函数)
*/
int ProcessAlgoDetection(std::vector<std::pair<EVzResultDataType, SVzLaserLineData>>& detectionDataCache) override;
/**
* @brief 获取检测数据类型(实现纯虚函数)
*/
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;
/**
* @brief Modbus写寄存器回调重写虚函数
*/
void OnModbusWriteCallback(uint16_t startAddress, const uint16_t* data, uint16_t count) override;
// ============ 实现 ICameraLevelCalculator 接口 ============
bool CalculatePlaneCalibration(
const std::vector<std::pair<EVzResultDataType, SVzLaserLineData>>& scanData,
double planeCalib[9],
double& planeHeight,
double invRMatrix[9]) override;
// ============ 实现 ICameraLevelResultSaver 接口 ============
bool SaveLevelingResults(double planeCalib[9], double planeHeight, double invRMatrix[9],
int cameraIndex, const QString& cameraName) override;
bool LoadLevelingResults(int cameraIndex, const QString& cameraName,
double planeCalib[9], double& planeHeight, double invRMatrix[9]) override;
// ============ IVrWheelMeasureConfigChangeNotify 接口实现 ============
void OnConfigChanged(const WheelMeasureConfigResult& configResult) override;
// ============ 公共接口 ============
/**
* @brief 设置状态更新接口
*/
void setStatusUpdate(IWheelMeasureStatus* statusUpdate) { m_statusUpdate = statusUpdate; }
/**
* @brief 获取配置接口
*/
IVrWheelMeasureConfig* GetConfig() const { return m_config; }
/**
* @brief 获取配置结果
*/
WheelMeasureConfigResult* GetConfigResult() { return &m_configResult; }
/**
* @brief 获取相机名称列表
*/
QStringList getCameraNames() const;
/**
* @brief 重新检测
*/
void ResetDetect(int cameraIndex = 0);
/**
* @brief 启动所有相机检测(依次执行)
*/
void StartAllDetection();
/**
* @brief 停止所有相机检测(完成当前设备后停止)
*/
void StopAllDetection();
/**
* @brief 检查是否正在进行顺序检测
*/
bool IsSequentialDetecting() const { return m_sequentialDetecting; }
/**
* @brief 设置默认相机索引
*/
void SetDefaultCameraIndex(int cameraIndex) { m_currentCameraIndex = cameraIndex; }
/**
* @brief 获取当前默认相机索引
*/
int GetDefaultCameraIndex() const { return m_currentCameraIndex; }
/**
* @brief 静态相机状态回调函数
*/
static void _StaticCameraNotify(EVzDeviceWorkStatus eStatus, void* pExtData, unsigned int nDataLength, void* pInfoParam);
private:
// 初始化配置
bool initializeConfig(const QString& configPath);
// 初始化相机
bool initializeCameras();
// 处理扫描数据
void processScanData(std::vector<std::pair<EVzResultDataType, SVzLaserLineData>>& detectionDataCache);
// 根据相机索引获取调平参数
WheelCameraPlaneCalibParam* getPlaneCalibParam(int cameraIndex);
// 相机状态回调处理
void _CameraNotify(EVzDeviceWorkStatus eStatus, void* pExtData, unsigned int nDataLength, void* pInfoParam);
private:
IVrWheelMeasureConfig* m_config = nullptr;
WheelMeasureConfigResult m_configResult;
IWheelMeasureStatus* m_statusUpdate = nullptr;
int m_currentCameraIndex = 1; // 默认相机索引1-based
// 顺序检测相关
bool m_sequentialDetecting = false; // 是否正在顺序检测所有设备
bool m_stopSequentialRequested = false; // 是否请求停止顺序检测
int m_sequentialCurrentIndex = 0; // 当前顺序检测的设备索引0-based
int m_sequentialTotalCount = 0; // 需要顺序检测的设备总数
// 继续检测下一个设备
void continueSequentialDetection();
};
#endif // WHEELMEASUREPRESENTER_H