2025-11-02 16:48:52 +08:00

193 lines
6.7 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 "WorkpiecePresenter.h"
#include "VrLog.h"
#include "VrError.h"
#include <QDateTime>
// 初始化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 = 7800;
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客户端已断开");
}
// 更新机械臂连接状态
m_pStatus->OnRobotConnectionChanged(connected);
}
// 更新工作状态
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);
// 创建主结果对象
QJsonObject resultObject;
// 添加工件类型
resultObject["type"] = detectionResult.workpieceType;
// 构造新的JSON格式type + L/T/R/B分组
try {
// 检查角点数量是否为12个左3、顶3、右3、底3
if (detectionResult.positions.size() != 12) {
LOG_WARNING("Expected 12 corner points, but got %zu points\n", detectionResult.positions.size());
// 如果点数不对,仍然发送,但可能数据不完整
}
resultObject["success"] = true;
// 角点索引说明根据DetectPresenter.cpp中的顺序
// 索引 0-2: 左侧 (L) - 从下到上
// 索引 3-5: 顶部 (T) - 从左到右
// 索引 6-8: 右侧 (R) - 从上到下
// 索引 9-11: 底部 (B) - 从右到左
// 构造左侧角点 (L)
QJsonObject L;
for (int i = 0; i < 3 && i < (int)detectionResult.positions.size(); i++) {
QJsonArray point;
point.append(detectionResult.positions[i].x);
point.append(detectionResult.positions[i].y);
point.append(detectionResult.positions[i].z);
L[QString("P%1").arg(i + 1)] = point;
}
resultObject["L"] = L;
// 构造顶部角点 (T)
QJsonObject T;
for (int i = 0; i < 3 && (i + 3) < (int)detectionResult.positions.size(); i++) {
QJsonArray point;
point.append(detectionResult.positions[i + 3].x);
point.append(detectionResult.positions[i + 3].y);
point.append(detectionResult.positions[i + 3].z);
T[QString("P%1").arg(i + 1)] = point;
}
resultObject["T"] = T;
// 构造右侧角点 (R)
QJsonObject R;
for (int i = 0; i < 3 && (i + 6) < (int)detectionResult.positions.size(); i++) {
QJsonArray point;
point.append(detectionResult.positions[i + 6].x);
point.append(detectionResult.positions[i + 6].y);
point.append(detectionResult.positions[i + 6].z);
R[QString("P%1").arg(i + 1)] = point;
}
resultObject["R"] = R;
// 构造底部角点 (B)
QJsonObject B;
for (int i = 0; i < 3 && (i + 9) < (int)detectionResult.positions.size(); i++) {
QJsonArray point;
point.append(detectionResult.positions[i + 9].x);
point.append(detectionResult.positions[i + 9].y);
point.append(detectionResult.positions[i + 9].z);
B[QString("P%1").arg(i + 1)] = point;
}
resultObject["B"] = B;
// 发送结果
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());
m_pTCPServer->SendDetectionResult(resultObject);
}
}