#ifndef WHEELMEASUREPRESENTER_H #define WHEELMEASUREPRESENTER_H #include "BasePresenter.h" #include "IVrWheelMeasureConfig.h" #include "IWheelMeasureStatus.h" #include "CommonDialogCameraLevel.h" #include #include #include /** * @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>& 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>& 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>& 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