239 lines
8.5 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();
// 从配置获取端口默认7800
int port = 7800;
// 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 WorkpiecePresenter::OnTCPConnectionChanged(bool connected)
{
LOG_DEBUG("TCP connection status changed: %s\n", connected ? "connected" : "disconnected");
m_bTCPConnected = connected;
// 通知状态更新
if (auto pStatus = GetStatusCallback<IYWorkpieceStatus>()) {
if (connected) {
pStatus->OnStatusUpdate("TCP客户端已连接");
} else {
pStatus->OnStatusUpdate("TCP客户端已断开");
}
// 更新机械臂连接状态
pStatus->OnRobotConnectionChanged(connected);
}
// 更新工作状态
CheckAndUpdateWorkStatus();
}
// TCP检测触发回调
bool WorkpiecePresenter::OnTCPDetectionTrigger(bool startWork, int cameraIndex, qint64 timestamp)
{
if (auto pStatus = GetStatusCallback<IYWorkpieceStatus>()) {
pStatus->OnWorkStatusChanged(WorkStatus::Working);
}
LOG_DEBUG("TCP detection trigger: startWork=%s, cameraIndex=%d, timestamp=%lld\n",
startWork ? "true" : "false", cameraIndex, timestamp);
// 通知UI接收到TCP扫描请求
if (auto pStatus = GetStatusCallback<IYWorkpieceStatus>()) {
pStatus->OnStatusUpdate("【TCP协议】接收到扫描请求 (ScanRequest)");
}
if (!startWork) {
LOG_WARNING("Received stop work signal, ignoring\n");
return false;
}
// 检查相机连接状态
if (!m_bCameraConnected) {
LOG_ERROR("Camera not connected, cannot start detection\n");
if (auto pStatus = GetStatusCallback<IYWorkpieceStatus>()) {
pStatus->OnStatusUpdate("【TCP协议】相机未连接无法启动检测");
}
return false;
}
// 通知UI已发送响应
if (auto pStatus = GetStatusCallback<IYWorkpieceStatus>()) {
pStatus->OnStatusUpdate("【TCP协议】已发送扫描响应 (ScanResponse)");
}
// 启动检测
int result = StartDetection(cameraIndex, false); // false表示手动触发
bool success = (result == 0);
if (success) {
LOG_DEBUG("Detection started successfully via TCP trigger\n");
if (auto pStatus = GetStatusCallback<IYWorkpieceStatus>()) {
pStatus->OnStatusUpdate("开始执行扫描检测...");
}
} else {
LOG_ERROR("Failed to start detection via TCP trigger, error code: %d\n", result);
if (auto pStatus = GetStatusCallback<IYWorkpieceStatus>()) {
pStatus->OnStatusUpdate("检测启动失败");
}
}
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["MessageType"] = "ScanResult";
resultObject["Timestamp"] = QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss");
// 创建Data对象
QJsonObject data;
data["WorkpieceType"] = 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. Not sending result.\n", detectionResult.positions.size());
if (auto pStatus = GetStatusCallback<IYWorkpieceStatus>()) {
pStatus->OnStatusUpdate("【TCP协议】角点数量不足未发送结果");
}
return;
}
// 角点索引说明根据DetectPresenter.cpp中的顺序
// 索引 0-2: 边1 - 从下到上
// 索引 3-5: 边2 - 从左到右
// 索引 6-8: 边3 - 从上到下
// 索引 9-11: 边4 - 从右到左
// 构造边1角点
QJsonObject side1;
for (int i = 0; i < 3; i++) {
QJsonArray point;
point.append(detectionResult.positions[i].x);
point.append(detectionResult.positions[i].y);
point.append(detectionResult.positions[i].z);
side1[QString("P%1").arg(i + 1)] = point;
}
data["1"] = side1;
// 构造边2角点
QJsonObject side2;
for (int i = 0; i < 3; i++) {
QJsonArray point;
point.append(detectionResult.positions[i + 3].x);
point.append(detectionResult.positions[i + 3].y);
point.append(detectionResult.positions[i + 3].z);
side2[QString("P%1").arg(i + 1)] = point;
}
data["2"] = side2;
// 构造边3角点
QJsonObject side3;
for (int i = 0; i < 3; i++) {
QJsonArray point;
point.append(detectionResult.positions[i + 6].x);
point.append(detectionResult.positions[i + 6].y);
point.append(detectionResult.positions[i + 6].z);
side3[QString("P%1").arg(i + 1)] = point;
}
data["3"] = side3;
// 构造边4角点
QJsonObject side4;
for (int i = 0; i < 3; i++) {
QJsonArray point;
point.append(detectionResult.positions[i + 9].x);
point.append(detectionResult.positions[i + 9].y);
point.append(detectionResult.positions[i + 9].z);
side4[QString("P%1").arg(i + 1)] = point;
}
data["4"] = side4;
// 添加中心点坐标
QJsonArray centerPoint;
centerPoint.append(detectionResult.center.x);
centerPoint.append(detectionResult.center.y);
centerPoint.append(detectionResult.center.z);
data["Center"] = centerPoint;
// 添加长度信息
QJsonObject lengths;
lengths["len_A1"] = detectionResult.len_A1;
lengths["len_A2"] = detectionResult.len_A2;
lengths["len_B1"] = detectionResult.len_B1;
lengths["len_B2"] = detectionResult.len_B2;
data["Lengths"] = lengths;
// 将Data对象添加到结果中
resultObject["Data"] = data;
// 发送结果
int sendResult = m_pTCPServer->SendDetectionResult(resultObject);
if (sendResult == 0) {
LOG_INFO("Detection result sent to TCP clients successfully\n");
// 通知UI已发送检测结果
if (auto pStatus = GetStatusCallback<IYWorkpieceStatus>()) {
pStatus->OnStatusUpdate("【TCP协议】已发送扫描结果 (ScanResult)");
}
} 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);
}
}