| | |
| | | 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; |
| | | } |