154 lines
5.2 KiB
C++
154 lines
5.2 KiB
C++
#include "ParticleSizePresenter.h"
|
||
#include "VrLog.h"
|
||
#include "VrError.h"
|
||
#include <QDateTime>
|
||
|
||
// 初始化TCP服务器
|
||
int ParticleSizePresenter::InitTCPServer()
|
||
{
|
||
LOG_DEBUG("Start initializing TCP server\n");
|
||
|
||
if (m_pTCPServer) {
|
||
LOG_WARNING("TCP server already initialized\n");
|
||
return 0;
|
||
}
|
||
|
||
// 创建TCP服务器协议实例
|
||
m_pTCPServer = new TCPServerProtocol();
|
||
|
||
// 从配置获取端口,默认7900
|
||
int port = 7900;
|
||
// TODO: 从配置文件获取端口配置
|
||
// ConfigResult configResult = m_pConfigManager->GetConfigResult();
|
||
// port = configResult.tcpPort;
|
||
|
||
// 初始化TCP服务器
|
||
int nRet = m_pTCPServer->Initialize(port);
|
||
if (nRet != 0) {
|
||
LOG_ERROR("Failed to initialize TCP server, return code: %d\n", nRet);
|
||
delete m_pTCPServer;
|
||
m_pTCPServer = nullptr;
|
||
return nRet;
|
||
}
|
||
|
||
// 设置连接状态回调
|
||
m_pTCPServer->SetConnectionCallback([this](bool connected) {
|
||
this->OnTCPConnectionChanged(connected);
|
||
});
|
||
|
||
// 设置检测触发回调
|
||
m_pTCPServer->SetDetectionTriggerCallback([this](bool startWork, int cameraIndex, qint64 timestamp) {
|
||
return this->OnTCPDetectionTrigger(startWork, cameraIndex, timestamp);
|
||
});
|
||
|
||
LOG_INFO("TCP server protocol initialized successfully on port %d\n", port);
|
||
return 0;
|
||
}
|
||
|
||
// TCP连接状态改变回调
|
||
void ParticleSizePresenter::OnTCPConnectionChanged(bool connected)
|
||
{
|
||
LOG_DEBUG("TCP connection status changed: %s\n", connected ? "connected" : "disconnected");
|
||
|
||
m_bTCPConnected = connected;
|
||
|
||
// 通知状态更新
|
||
if (auto pStatus = GetStatusCallback<IYParticleSizeStatus>()) {
|
||
if (connected) {
|
||
pStatus->OnStatusUpdate("TCP客户端已连接");
|
||
} else {
|
||
pStatus->OnStatusUpdate("TCP客户端已断开");
|
||
}
|
||
|
||
// 更新机械臂连接状态
|
||
pStatus->OnRobotConnectionChanged(connected);
|
||
}
|
||
|
||
// 更新工作状态
|
||
CheckAndUpdateWorkStatus();
|
||
}
|
||
|
||
// TCP检测触发回调
|
||
bool ParticleSizePresenter::OnTCPDetectionTrigger(bool startWork, int cameraIndex, qint64 timestamp)
|
||
{
|
||
LOG_DEBUG("TCP detection trigger: startWork=%s, cameraIndex=%d, timestamp=%lld\n",
|
||
startWork ? "true" : "false", cameraIndex, timestamp);
|
||
|
||
if (!startWork) {
|
||
LOG_WARNING("Received stop work signal, ignoring\n");
|
||
return false;
|
||
}
|
||
|
||
// 检查相机连接状态
|
||
if (!m_bCameraConnected) {
|
||
LOG_ERROR("Camera not connected, cannot start detection\n");
|
||
return false;
|
||
}
|
||
|
||
// 启动检测
|
||
int result = StartDetection(cameraIndex, false); // false表示手动触发
|
||
bool success = (result == 0);
|
||
|
||
if (success) {
|
||
LOG_DEBUG("Detection started successfully via TCP trigger\n");
|
||
} else {
|
||
LOG_ERROR("Failed to start detection via TCP trigger, error code: %d\n", result);
|
||
}
|
||
|
||
return success;
|
||
}
|
||
|
||
// 发送检测结果给TCP客户端
|
||
void ParticleSizePresenter::_SendDetectionResultToTCP(const DetectionResult& detectionResult, int cameraIndex)
|
||
{
|
||
if (!m_pTCPServer || !m_bTCPConnected) {
|
||
LOG_DEBUG("TCP server not available, skipping result transmission\n");
|
||
return;
|
||
}
|
||
|
||
LOG_DEBUG("Sending detection result to TCP clients, camera index: %d\n", cameraIndex);
|
||
|
||
// 创建主结果对象
|
||
QJsonObject resultObject;
|
||
resultObject["success"] = true;
|
||
resultObject["cameraIndex"] = cameraIndex;
|
||
resultObject["particleCount"] = detectionResult.particleCount;
|
||
resultObject["maxParticleSize"] = detectionResult.maxParticleSize;
|
||
resultObject["minParticleSize"] = detectionResult.minParticleSize;
|
||
resultObject["avgParticleSize"] = detectionResult.avgParticleSize;
|
||
resultObject["alarmCount"] = detectionResult.alarmCount;
|
||
|
||
try {
|
||
// 构造颗粒信息数组
|
||
QJsonArray particlesArray;
|
||
for (size_t i = 0; i < detectionResult.positions.size(); i++) {
|
||
const auto& particle = detectionResult.positions[i];
|
||
|
||
QJsonObject particleObj;
|
||
particleObj["index"] = particle.index;
|
||
particleObj["x"] = particle.x;
|
||
particleObj["y"] = particle.y;
|
||
particleObj["z"] = particle.z;
|
||
particleObj["width"] = particle.width;
|
||
particleObj["height"] = particle.height;
|
||
particleObj["isAlarm"] = particle.isAlarm;
|
||
|
||
particlesArray.append(particleObj);
|
||
}
|
||
resultObject["particles"] = particlesArray;
|
||
|
||
// 发送结果
|
||
int sendResult = m_pTCPServer->SendDetectionResult(resultObject);
|
||
if (sendResult == 0) {
|
||
LOG_INFO("Detection result sent to TCP clients successfully\n");
|
||
} else {
|
||
LOG_ERROR("Failed to send detection result to TCP clients, error code: %d\n", sendResult);
|
||
}
|
||
} catch (const std::exception& e) {
|
||
LOG_ERROR("Exception while preparing TCP detection result: %s\n", e.what());
|
||
resultObject["success"] = false;
|
||
resultObject["error"] = e.what();
|
||
m_pTCPServer->SendDetectionResult(resultObject);
|
||
}
|
||
}
|