GrabBag/AppUtils/UICommon/Inc/CommonDialogCameraLevel.h

171 lines
5.9 KiB
C
Raw Normal View History

#ifndef COMMONDIALOGCAMERALEVEL_H
#define COMMONDIALOGCAMERALEVEL_H
#include <QDialog>
#include <QWidget>
#include <QComboBox>
#include <QLineEdit>
#include <QMessageBox>
#include <QThread>
#include <vector>
#include <mutex>
#include <functional>
#include "IVrEyeDevice.h"
#include "VZNL_Types.h"
#include "LaserDataLoader.h"
#include "BasePresenter.h"
namespace Ui {
class CommonDialogCameraLevel;
}
/**
* @brief
*
*
*/
class ICameraLevelCalculator
{
public:
virtual ~ICameraLevelCalculator() = default;
/**
* @brief
* @param scanData 线
* @param planeCalib (9)
* @param planeHeight
* @param invRMatrix (9)
* @return true: , false:
*/
virtual bool CalculatePlaneCalibration(
const std::vector<std::pair<EVzResultDataType, SVzLaserLineData>>& scanData,
double planeCalib[9],
double& planeHeight,
double invRMatrix[9]) = 0;
};
/**
* @brief
*
*
*/
class ICameraLevelResultSaver
{
public:
virtual ~ICameraLevelResultSaver() = default;
/**
* @brief
* @param planeCalib (9)
* @param planeHeight
* @param invRMatrix (9)
* @param cameraIndex 1-based
* @param cameraName
* @return true: , false:
*/
virtual bool SaveLevelingResults(double planeCalib[9], double planeHeight, double invRMatrix[9],
int cameraIndex, const QString& cameraName) = 0;
/**
* @brief
* @param cameraIndex 1-based
* @param cameraName
* @param planeCalib (9)
* @param planeHeight
* @param invRMatrix (9)
* @return true: , false:
*/
virtual bool LoadLevelingResults(int cameraIndex, const QString& cameraName,
double planeCalib[9], double& planeHeight, double invRMatrix[9]) = 0;
};
/**
* @brief
*
*
*
*/
class CommonDialogCameraLevel : public QDialog
{
Q_OBJECT
public:
explicit CommonDialogCameraLevel(QWidget *parent = nullptr);
~CommonDialogCameraLevel();
// Delete copy constructor and assignment operator due to atomic members
CommonDialogCameraLevel(const CommonDialogCameraLevel&) = delete;
CommonDialogCameraLevel& operator=(const CommonDialogCameraLevel&) = delete;
/**
* @brief Presenter
* @param cameraList
* @param presenter BasePresenter指针访
* @param calculator
* @param resultSaver
*/
void SetCameraList(const std::vector<std::pair<std::string, IVrEyeDevice*>>& cameraList,
BasePresenter* presenter,
ICameraLevelCalculator* calculator,
ICameraLevelResultSaver* resultSaver);
private slots:
void on_btn_apply_clicked();
void on_btn_cancel_clicked();
void on_combo_camera_currentIndexChanged(int index);
private:
Ui::CommonDialogCameraLevel *ui;
// 相机列表和名称
std::vector<std::pair<std::string, IVrEyeDevice*>> m_cameraList;
BasePresenter* m_presenter = nullptr;
ICameraLevelCalculator* m_calculator = nullptr;
ICameraLevelResultSaver* m_resultSaver = nullptr;
// 扫描数据缓存
std::vector<std::pair<EVzResultDataType, SVzLaserLineData>> m_scanDataCache;
std::mutex m_scanDataMutex;
LaserDataLoader m_dataLoader; // 数据加载器,用于释放内存
// 状态回调相关
std::atomic<bool> m_swingFinished {false}; // 摆动完成标志,同时表示扫描完成
std::atomic<bool> m_callbackRestored {false}; // 状态回调是否已恢复
// 初始化相机选择框
void initializeCameraCombo();
// 执行相机调平
bool performCameraLeveling();
// 直接使用相机接口进行扫描
bool startCameraScan(int cameraIndex);
bool stopCameraScan(int cameraIndex);
// 检测数据回调函数
static void StaticDetectionCallback(EVzResultDataType eDataType, SVzLaserLineData* pLaserLinePoint, void* pUserData);
void DetectionCallback(EVzResultDataType eDataType, SVzLaserLineData* pLaserLinePoint);
// 状态回调函数
static void StaticStatusCallback(EVzDeviceWorkStatus eStatus, void* pExtData, unsigned int nDataLength, void* pInfoParam);
void StatusCallback(EVzDeviceWorkStatus eStatus, void* pExtData, unsigned int nDataLength, void* pInfoParam);
// 设置和恢复状态回调
void setLevelingStatusCallback();
void restorePresenterStatusCallback();
// 处理扫描到的地面数据进行调平计算
bool calculatePlaneCalibration(double planeCalib[9], double& planeHeight, double invRMatrix[9]);
// 清空扫描数据缓存
void clearScanDataCache();
// 更新调平结果显示
void updateLevelingResults(double planeCalib[9], double planeHeight, double invRMatrix[9]);
// 检查并显示相机标定状态
void checkAndDisplayCalibrationStatus(int cameraIndex);
};
#endif // COMMONDIALOGCAMERALEVEL_H