118 lines
4.1 KiB
C++
Raw 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.

#include "VrError.h"
#include "WorkpieceSplicePresenter.h"
#include "VrLog.h"
WorkpieceSplicePresenter::WorkpieceSplicePresenter(QObject *parent)
: QObject(parent), m_pStatusCallback(nullptr), m_pConfig(nullptr), m_pMarkReceiver(nullptr)
, m_binocularMarkPort(0), m_bMarkConnected(false), m_pMarkReconnectTimer(new QTimer(this))
{
connect(m_pMarkReconnectTimer, &QTimer::timeout, this, &WorkpieceSplicePresenter::onMarkReconnectTimeout);
}
WorkpieceSplicePresenter::~WorkpieceSplicePresenter()
{
if (m_pMarkReconnectTimer) m_pMarkReconnectTimer->stop();
if (m_pMarkReceiver) { m_pMarkReceiver->Disconnect(); delete m_pMarkReceiver; }
if (m_pConfig) delete m_pConfig;
}
int WorkpieceSplicePresenter::Init()
{
LOG_INFO("WorkpieceSplicePresenter初始化\n");
UpdateWorkStatus(WorkStatus::InitIng);
int ret = InitConfig();
if (ret != SUCCESS) { LOG_ERR("初始化配置失败: %d\n", ret); UpdateWorkStatus(WorkStatus::Error); return ret; }
ret = InitBinocularMarkReceiver();
if (ret != SUCCESS) { LOG_ERR("初始化BinocularMarkReceiver失败: %d\n", ret); m_pMarkReconnectTimer->start(5000); }
UpdateWorkStatus(WorkStatus::Ready);
LOG_INFO("WorkpieceSplicePresenter初始化完成\n");
return SUCCESS;
}
void WorkpieceSplicePresenter::SetStatusCallback(IYWorkpieceSpliceStatus* pStatus)
{
m_pStatusCallback = pStatus;
}
int WorkpieceSplicePresenter::InitConfig()
{
if (!IVrConfig::CreateInstance((IVrConfig**)&m_pConfig)) { LOG_ERR("创建配置管理器失败\n"); return ERR_CODE(APP_ERR_EXEC); }
std::string configPath = "./config/config.xml";
int ret = m_pConfig->LoadConfig(configPath, m_configResult);
if (ret != SUCCESS) { LOG_ERR("加载配置文件失败: %s\n", configPath.c_str()); return -2; }
// 从 binocularMarkConfig 获取 BinocularMark 连接信息
m_binocularMarkIp = m_configResult.binocularMarkConfig.serverIP;
m_binocularMarkPort = m_configResult.binocularMarkConfig.serverPort;
return SUCCESS;
}
int WorkpieceSplicePresenter::InitBinocularMarkReceiver()
{
int ret = IBinocularMarkReceiver::CreateInstance(&m_pMarkReceiver);
if (ret != SUCCESS) return ERR_CODE(APP_ERR_EXEC);
m_pMarkReceiver->SetMarkResultCallback([this](const std::vector<VrMark3D>& marks, int64_t timestamp, int errorCode) {
this->OnMarkResult(marks, timestamp, errorCode);
});
m_pMarkReceiver->SetEventCallback([this](ReceiverEventType eventType, const std::string& errorMsg) {
this->OnMarkConnectionChanged(eventType == ReceiverEventType::CONNECTED);
});
return ConnectToBinocularMark();
}
void WorkpieceSplicePresenter::OnMarkResult(const std::vector<VrMark3D>& marks, qint64 timestamp, int errorCode)
{
LOG_INFO("收到Mark结果数量: %zu, 错误码: %d\n", marks.size(), errorCode);
WorkpieceSpliceResult result;
result.marks = marks;
result.timestamp = timestamp;
result.errorCode = errorCode;
result.success = (errorCode == 0);
if (m_pStatusCallback) m_pStatusCallback->OnMarkResult(result);
}
void WorkpieceSplicePresenter::OnMarkConnectionChanged(bool connected)
{
m_bMarkConnected = connected;
if (m_pStatusCallback) m_pStatusCallback->OnBinocularMarkConnectionChanged(connected);
if (connected) {
m_pMarkReconnectTimer->stop();
UpdateStatusMessage("BinocularMarkApp已连接");
} else {
m_pMarkReconnectTimer->start(5000);
UpdateStatusMessage("BinocularMarkApp连接断开");
}
}
void WorkpieceSplicePresenter::UpdateWorkStatus(WorkStatus status)
{
if (m_pStatusCallback) m_pStatusCallback->OnWorkStatusChanged(status);
}
void WorkpieceSplicePresenter::UpdateStatusMessage(const std::string& message)
{
if (m_pStatusCallback) m_pStatusCallback->OnStatusUpdate(message);
}
int WorkpieceSplicePresenter::ConnectToBinocularMark()
{
LOG_INFO("连接BinocularMarkApp: %s:%d\n", m_binocularMarkIp.c_str(), m_binocularMarkPort);
return m_pMarkReceiver->Connect(m_binocularMarkIp, m_binocularMarkPort);
}
void WorkpieceSplicePresenter::onMarkReconnectTimeout()
{
LOG_INFO("尝试重连BinocularMarkApp\n");
ConnectToBinocularMark();
}