GrabBag/App/ScrewPosition/ScrewPositionApp/Presenter/Src/ScrewPositionTCPProtocol.cpp

102 lines
3.6 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 "ScrewPositionTCPProtocol.h"
#include "VrLog.h"
#include <QDateTime>
ScrewPositionTCPProtocol::ScrewPositionTCPProtocol()
{
}
ScrewPositionTCPProtocol::~ScrewPositionTCPProtocol()
{
}
void ScrewPositionTCPProtocol::SetDetectionTriggerWithTypeCallback(const DetectionTriggerWithTypeCallback& callback)
{
m_detectionTypeCallback = callback;
}
void ScrewPositionTCPProtocol::ParseJSONCommand(const TCPClient* pClient, const QJsonObject& jsonData)
{
QString messageType = jsonData["MessageType"].toString();
qint64 timestamp = jsonData["Timestamp"].toVariant().toLongLong();
LOG_DEBUG("Received MessageType: %s, Timestamp: %lld\n", messageType.toStdString().c_str(), timestamp);
if (messageType == "ScrewRequest") {
HandleScrewDetectCommand(pClient, timestamp);
} else if (messageType == "ToolRequest") {
HandleToolDiskDetectCommand(pClient, timestamp);
} else if (messageType == "ScanRequest") {
// 兼容旧协议,映射为螺杆检测
HandleScrewDetectCommand(pClient, timestamp);
} else {
LOG_WARNING("Unknown MessageType: %s\n", messageType.toStdString().c_str());
QJsonObject errResponse;
errResponse["MessageType"] = "Error";
errResponse["Timestamp"] = timestamp;
QJsonObject errData;
errData["ErrorCode"] = -3;
errData["ErrorMessage"] = QString("未知消息类型: %1").arg(messageType);
errResponse["Data"] = errData;
SendDetectionResult(errResponse, pClient);
}
}
void ScrewPositionTCPProtocol::HandleScrewDetectCommand(const TCPClient* pClient, qint64 timestamp)
{
LOG_DEBUG("Handling ScrewRequest, timestamp: %lld\n", timestamp);
TriggerDetection(pClient, timestamp, DETECTION_TYPE_SCREW, "ScrewResponse", "螺杆检测启动失败");
}
void ScrewPositionTCPProtocol::HandleToolDiskDetectCommand(const TCPClient* pClient, qint64 timestamp)
{
LOG_DEBUG("Handling ToolRequest, timestamp: %lld\n", timestamp);
TriggerDetection(pClient, timestamp, DETECTION_TYPE_TOOL_DISK, "ToolResponse", "工具盘检测启动失败");
}
bool ScrewPositionTCPProtocol::TriggerDetection(const TCPClient* pClient, qint64 timestamp,
DetectionType type, const QString& responseType,
const QString& errorDesc)
{
// 发送确认响应回传请求的timestamp
QJsonObject response;
response["MessageType"] = responseType;
response["Timestamp"] = timestamp;
QJsonObject data;
data["Status"] = "Accepted";
response["Data"] = data;
SendDetectionResult(response, pClient);
if (!m_detectionTypeCallback) {
LOG_WARNING("Detection trigger callback not set\n");
QJsonObject errResp;
errResp["MessageType"] = "Error";
errResp["Timestamp"] = timestamp;
QJsonObject errData;
errData["ErrorCode"] = -4;
errData["ErrorMessage"] = "检测服务未准备就绪";
errResp["Data"] = errData;
SendDetectionResult(errResp, pClient);
return false;
}
int cameraIndex = -1;
bool success = m_detectionTypeCallback(true, cameraIndex, timestamp, type);
if (!success) {
LOG_ERROR("Failed to trigger detection, type: %d\n", type);
QJsonObject errResp;
errResp["MessageType"] = "Error";
errResp["Timestamp"] = timestamp;
QJsonObject errData;
errData["ErrorCode"] = -5;
errData["ErrorMessage"] = errorDesc;
errResp["Data"] = errData;
SendDetectionResult(errResp, pClient);
return false;
}
LOG_DEBUG("Detection triggered successfully, type: %d\n", type);
return true;
}