GrabBag/AppUtils/AppCommon/Src/BasePresenter.cpp

178 lines
4.9 KiB
C++
Raw Normal View History

#include "BasePresenter.h"
#include "VrLog.h"
#include <fstream>
BasePresenter::BasePresenter(QObject *parent)
: QObject(parent)
, m_currentCameraIndex(0)
, m_bCameraConnected(false)
, m_bAlgoDetectThreadRunning(false)
, m_pCameraReconnectTimer(nullptr)
, m_expectedCameraCount(0)
{
// 创建相机重连定时器
m_pCameraReconnectTimer = new QTimer(this);
connect(m_pCameraReconnectTimer, &QTimer::timeout, this, &BasePresenter::OnCameraReconnectTimer);
}
BasePresenter::~BasePresenter()
{
// 停止检测线程
StopAlgoDetectThread();
// 停止重连定时器
StopCameraReconnectTimer();
// 清理相机设备
for (auto& camera : m_vrEyeDeviceList) {
if (camera.second) {
delete camera.second;
camera.second = nullptr;
}
}
m_vrEyeDeviceList.clear();
}
int BasePresenter::Init()
{
LOG_INFO("BasePresenter::Init() - 基类初始化\n");
return 0;
}
int BasePresenter::StartDetection(int cameraIndex, bool isAuto)
{
LOG_INFO("BasePresenter::StartDetection() - 开始检测, cameraIndex=%d, isAuto=%d\n", cameraIndex, isAuto);
if (m_bAlgoDetectThreadRunning) {
LOG_WARNING("检测线程已经在运行中\n");
return -1;
}
// 设置当前相机索引
if (cameraIndex >= 0) {
m_currentCameraIndex = cameraIndex;
}
// 启动算法检测线程
StartAlgoDetectThread();
return 0;
}
int BasePresenter::StopDetection()
{
LOG_INFO("BasePresenter::StopDetection() - 停止检测\n");
// 停止算法检测线程
StopAlgoDetectThread();
return 0;
}
int BasePresenter::GetDetectionDataCacheSize() const
{
std::lock_guard<std::mutex> lock(const_cast<std::mutex&>(m_detectionDataMutex));
return static_cast<int>(m_detectionDataCache.size());
}
int BasePresenter::SaveDetectionDataToFile(const std::string& filePath)
{
std::lock_guard<std::mutex> lock(m_detectionDataMutex);
if (m_detectionDataCache.empty()) {
LOG_WARNING("检测数据缓存为空,无数据可保存\n");
return -1;
}
// 子类应该实现具体的保存逻辑
LOG_INFO("保存 %d 条检测数据到文件: %s\n", static_cast<int>(m_detectionDataCache.size()), filePath.c_str());
return 0;
}
void BasePresenter::StartAlgoDetectThread()
{
if (m_bAlgoDetectThreadRunning) {
LOG_WARNING("[BasePresenter] 算法检测线程已经在运行\n");
return;
}
m_bAlgoDetectThreadRunning = true;
// 启动检测线程
m_algoDetectThread = std::thread([this]() {
LOG_INFO("[BasePresenter] 算法检测线程启动\n");
AlgoDetectThreadFunc(); // 调用子类实现的检测函数
LOG_INFO("[BasePresenter] 算法检测线程退出\n");
});
}
void BasePresenter::StopAlgoDetectThread()
{
if (!m_bAlgoDetectThreadRunning) {
return;
}
LOG_INFO("[BasePresenter] 正在停止算法检测线程...\n");
m_bAlgoDetectThreadRunning = false;
// 唤醒可能在等待的线程
m_algoDetectCondition.notify_all();
// 等待线程结束
if (m_algoDetectThread.joinable()) {
m_algoDetectThread.join();
}
LOG_INFO("[BasePresenter] 算法检测线程已停止\n");
}
void BasePresenter::ClearDetectionDataCache()
{
std::lock_guard<std::mutex> lock(m_detectionDataMutex);
m_detectionDataCache.clear();
LOG_DEBUG("[BasePresenter] 检测数据缓存已清空\n");
}
void BasePresenter::AddDetectionDataToCache(EVzResultDataType dataType, const SVzLaserLineData& laserData)
{
std::lock_guard<std::mutex> lock(m_detectionDataMutex);
m_detectionDataCache.push_back(std::make_pair(dataType, laserData));
}
int BasePresenter::InitCamera(std::vector<DeviceInfo>& cameraList)
{
LOG_INFO("BasePresenter::InitCamera() - 初始化相机(基类实现)\n");
// 保存相机配置列表(用于重连)
m_cameraConfigList = cameraList;
m_expectedCameraCount = static_cast<int>(cameraList.size());
// 子类应该重写此方法实现具体的相机初始化逻辑
return 0;
}
void BasePresenter::StartCameraReconnectTimer()
{
if (m_pCameraReconnectTimer && !m_pCameraReconnectTimer->isActive()) {
LOG_INFO("启动相机重连定时器每5秒检查一次\n");
m_pCameraReconnectTimer->start(5000); // 每5秒检查一次
}
}
void BasePresenter::StopCameraReconnectTimer()
{
if (m_pCameraReconnectTimer && m_pCameraReconnectTimer->isActive()) {
LOG_INFO("停止相机重连定时器\n");
m_pCameraReconnectTimer->stop();
}
}
void BasePresenter::OnCameraReconnectTimer()
{
// 子类应该重写此方法实现具体的重连逻辑
LOG_DEBUG("相机重连定时器触发(基类实现)\n");
}