From 63686244746925d43248ceaf8d9e31f50df68a72 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期一, 01 九月 2025 17:21:43 +0800
Subject: [PATCH] Merge branch 'clh'

---
 SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.cpp |  104 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 104 insertions(+), 0 deletions(-)

diff --git a/SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.cpp b/SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.cpp
new file mode 100644
index 0000000..42b6f63
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.cpp
@@ -0,0 +1,104 @@
+#include "pch.h"
+#include "CCLinkIEControl.h"
+
+CCCLinkIEControl::CCCLinkIEControl() : CPerformanceMelsec(BoardType::CC_LINK_IE_CONTROL) {}
+
+CCCLinkIEControl::~CCCLinkIEControl() = default;
+
+int CCCLinkIEControl::SetBoardModeEx(CCLinkIEControlMode mode) {
+    return SetBoardMode(static_cast<short>(mode));
+}
+
+CCLinkIEControlMode CCCLinkIEControl::GetBoardModeEx() {
+    short nMode = 0;
+    const int nResult = GetBoardMode(nMode);
+    if (nResult != 0) {
+        return CCLinkIEControlMode::UNKNOWN;
+    }
+
+    return ConvertToCCLinkIEControlMode(nMode);
+}
+
+int CCCLinkIEControl::GetBoardStatusEx(BoardStatus& status) {
+    const int nResult = GetBoardStatus(status);
+    if (nResult != 0) {
+        return nResult;
+    }
+
+    return ValidateBoardStatus(status);
+}
+
+int CCCLinkIEControl::ReadLedStatus(LedStatus& outLedStatus) {
+    std::vector<short> vecLedBuffer;
+    const int nRet = ReadBoardLed(vecLedBuffer);
+    if (nRet != 0) {
+        return nRet;
+    }
+
+    if (vecLedBuffer.empty()) {
+        UpdateLastError(ERROR_CODE_INVALID_DATA);
+        return ERROR_CODE_INVALID_DATA;
+    }
+
+    // 解析各位状态
+    const short nBuffer = vecLedBuffer[0];
+    outLedStatus.bExtPw = (nBuffer & (1 << 15)) != 0;
+    outLedStatus.bRd = (nBuffer & (1 << 6)) != 0;
+    outLedStatus.bDLnk = (nBuffer & (1 << 5)) != 0;
+    outLedStatus.bPrm = (nBuffer & (1 << 4)) != 0;
+    outLedStatus.bErr = (nBuffer & (1 << 3)) != 0;
+    outLedStatus.bSd = (nBuffer & (1 << 2)) != 0;
+    outLedStatus.bMode = (nBuffer & (1 << 1)) != 0;
+    outLedStatus.bRun = (nBuffer & (1 << 0)) != 0;
+
+    return 0;
+}
+
+CCLinkIEControlMode CCCLinkIEControl::ConvertToCCLinkIEControlMode(const short nMode) {
+    switch (static_cast<CCLinkIEControlMode>(nMode)) {
+        case CCLinkIEControlMode::ONLINE: return CCLinkIEControlMode::ONLINE;                           // 在线
+        case CCLinkIEControlMode::OFFLINE: return CCLinkIEControlMode::OFFLINE;                         // 离线
+        case CCLinkIEControlMode::INTER_STATION_TEST: return CCLinkIEControlMode::INTER_STATION_TEST;   // 站间测试
+        case CCLinkIEControlMode::LINE_TEST: return CCLinkIEControlMode::LINE_TEST;                     // 线路测试
+        case CCLinkIEControlMode::LOOPBACK_TEST: return CCLinkIEControlMode::LOOPBACK_TEST;             // 自回送测试
+        case CCLinkIEControlMode::HW_TEST: return CCLinkIEControlMode::HW_TEST;                         // H/W测试
+        case CCLinkIEControlMode::BUS_IF_TEST: return CCLinkIEControlMode::BUS_IF_TEST;                 // 总线I/F测试
+        default: return CCLinkIEControlMode::UNKNOWN;
+    }
+}
+
+int CCCLinkIEControl::ValidateBoardStatus(const BoardStatus& status) {
+    if (status.nStationValue < 1 || status.nStationValue > 120) {
+        return ERROR_CODE_STATION_OUT_OF_RANGE; // 站号超出范围
+    }
+    if (status.nGroupValue < 0 || status.nGroupValue > 32) {
+        return ERROR_CODE_GROUP_OUT_OF_RANGE;   // 组超出范围
+    }
+    if (status.nNetworkValue < 1 || status.nNetworkValue > 239) {
+        return ERROR_CODE_NETWORK_OUT_OF_RANGE; // 网络号超出范围
+    }
+    return 0; // 校验通过
+}
+
+int CCCLinkIEControl::ReadDataEx(const StationIdentifier& station, DeviceType enDevType, long devNo, long size, void* pData)
+{
+    // 验证站点参数和数据有效性
+    int nRet = ValidateStationAndSize(station, static_cast<short>(size));
+    if (nRet != 0) {
+        UpdateLastError(nRet);
+        return nRet;
+    }
+
+    // 确保线程安全的最小锁定范围
+    {
+        std::lock_guard<std::mutex> lock(m_mtx);
+        const short nDevType = CalculateDeviceType(station, enDevType);
+        nRet = mdReceiveEx(m_nPath, station.nNetNo, station.nStNo, nDevType, devNo, &size, pData);
+    }
+
+    if (nRet != 0) {
+        UpdateLastError(nRet);
+    }
+
+    return nRet;
+}
\ No newline at end of file

--
Gitblit v1.9.3