#include "WorkpiecePresenter.h" #include "VrLog.h" #include "VrError.h" #include // 初始化TCP服务器 int WorkpiecePresenter::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(); // 从配置获取端口,默认5020 int port = 5020; if (m_vrConfig) { // TODO: 从配置文件获取端口配置 // port = m_vrConfig->GetTCPPort(); } // 初始化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 WorkpiecePresenter::OnTCPConnectionChanged(bool connected) { LOG_DEBUG("TCP connection status changed: %s\n", connected ? "connected" : "disconnected"); m_bTCPConnected = connected; // 通知状态更新 if (m_pStatus) { if (connected) { m_pStatus->OnStatusUpdate("TCP客户端已连接"); } else { m_pStatus->OnStatusUpdate("TCP客户端已断开"); } } // 更新工作状态 CheckAndUpdateWorkStatus(); } // TCP检测触发回调 bool WorkpiecePresenter::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"); if (m_pStatus) { m_pStatus->OnStatusUpdate("TCP触发检测开始"); } } else { LOG_ERROR("Failed to start detection via TCP trigger, error code: %d\n", result); if (m_pStatus) { m_pStatus->OnStatusUpdate("TCP触发检测失败"); } } return success; } // 发送检测结果给TCP客户端 void WorkpiecePresenter::_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); // 构造TCP协议的检测结果数据 TCPServerProtocol::DetectionResultData tcpResult; tcpResult.code = 0; tcpResult.success = true; tcpResult.message = "检测成功"; tcpResult.timestamp = QDateTime::currentMSecsSinceEpoch(); // 转换检测结果为JSON格式的3D坐标点数组 // 工件角点检测:将12个角点(左3、右3、上3、下3)作为一组发送 try { std::vector cornerPoints; // 遍历所有检测到的角点位置 for (const auto& position : detectionResult.positions) { QJsonObject point; point["x"] = position.x; point["y"] = position.y; point["z"] = position.z; point["roll"] = position.roll; point["pitch"] = position.pitch; point["yaw"] = position.yaw; cornerPoints.push_back(point); } if (!cornerPoints.empty()) { tcpResult.result.push_back(cornerPoints); LOG_INFO("Prepared %zu corner points for TCP transmission\n", cornerPoints.size()); } // 发送结果 int sendResult = m_pTCPServer->SendDetectionResult(tcpResult); 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()); // 发送错误响应 tcpResult.code = -1; tcpResult.success = false; tcpResult.message = "检测结果处理异常"; tcpResult.result.clear(); m_pTCPServer->SendDetectionResult(tcpResult); } }