mrDarker
7 天以前 829fe6c6bc33d53fda9c31fd45a37e1df87befff
SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.cpp
@@ -1,4 +1,4 @@
#include "pch.h"
#include "pch.h"
#include "CCLinkIEControl.h"
CCCLinkIEControl::CCCLinkIEControl() : CPerformanceMelsec(BoardType::CC_LINK_IE_CONTROL) {}
@@ -6,99 +6,99 @@
CCCLinkIEControl::~CCCLinkIEControl() = default;
int CCCLinkIEControl::SetBoardModeEx(CCLinkIEControlMode mode) {
    return SetBoardMode(static_cast<short>(mode));
   return SetBoardMode(static_cast<short>(mode));
}
CCLinkIEControlMode CCCLinkIEControl::GetBoardModeEx() {
    short nMode = 0;
    const int nResult = GetBoardMode(nMode);
    if (nResult != 0) {
        return CCLinkIEControlMode::UNKNOWN;
    }
   short nMode = 0;
   const int nResult = GetBoardMode(nMode);
   if (nResult != 0) {
      return CCLinkIEControlMode::UNKNOWN;
   }
    return ConvertToCCLinkIEControlMode(nMode);
   return ConvertToCCLinkIEControlMode(nMode);
}
int CCCLinkIEControl::GetBoardStatusEx(BoardStatus& status) {
    const int nResult = GetBoardStatus(status);
    if (nResult != 0) {
        return nResult;
    }
   const int nResult = GetBoardStatus(status);
   if (nResult != 0) {
      return nResult;
   }
    return ValidateBoardStatus(status);
   return ValidateBoardStatus(status);
}
int CCCLinkIEControl::ReadLedStatus(LedStatus& outLedStatus) {
    std::vector<short> vecLedBuffer;
    const int nRet = ReadBoardLed(vecLedBuffer);
    if (nRet != 0) {
        return nRet;
    }
   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;
    }
   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;
   // 解析各位状态
   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;
   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;
    }
   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; // 校验通过
   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;
    }
   // 验证站点参数和数据有效性
   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);
    }
   // 确保线程安全的最小锁定范围
   {
      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);
    }
   if (nRet != 0) {
      UpdateLastError(nRet);
   }
    return nRet;
   return nRet;
}