2025-11-26 22:44:38 +08:00

154 lines
5.2 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 "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);
}
}