2025-12-10 00:01:32 +08:00
|
|
|
|
#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);
|
|
|
|
|
|
|
2025-12-18 21:36:41 +08:00
|
|
|
|
m_pMarkReceiver->SetMarkResultCallback([this](const std::vector<VrMark3D>& marks, int64_t timestamp, int errorCode) {
|
2025-12-10 00:01:32 +08:00
|
|
|
|
this->OnMarkResult(marks, timestamp, errorCode);
|
|
|
|
|
|
});
|
2025-12-18 21:36:41 +08:00
|
|
|
|
m_pMarkReceiver->SetEventCallback([this](ReceiverEventType eventType, const std::string& errorMsg) {
|
|
|
|
|
|
this->OnMarkConnectionChanged(eventType == ReceiverEventType::CONNECTED);
|
|
|
|
|
|
});
|
2025-12-10 00:01:32 +08:00
|
|
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
|
}
|