193 lines
6.7 KiB
C++
Raw Normal View History

#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
2025-11-02 16:48:52 +08:00
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客户端已断开");
}
2025-11-02 16:48:52 +08:00
// 更新机械臂连接状态
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);
2025-11-02 16:48:52 +08:00
// 创建主结果对象
QJsonObject resultObject;
// 添加工件类型
resultObject["type"] = detectionResult.workpieceType;
// 构造新的JSON格式type + L/T/R/B分组
try {
2025-11-02 16:48:52 +08:00
// 检查角点数量是否为12个左3、顶3、右3、底3
if (detectionResult.positions.size() != 12) {
LOG_WARNING("Expected 12 corner points, but got %zu points\n", detectionResult.positions.size());
// 如果点数不对,仍然发送,但可能数据不完整
}
2025-11-02 16:48:52 +08:00
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;
}
2025-11-02 16:48:52 +08:00
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;
// 发送结果
2025-11-02 16:48:52 +08:00
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());
2025-11-02 16:48:52 +08:00
m_pTCPServer->SendDetectionResult(resultObject);
}
2025-11-02 16:48:52 +08:00
}