darker
2025-02-11 9b2d1e962bf802f75c44c1f5372fc4cf029e3f4e
SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -38,7 +38,11 @@
   m_bCimWorking = FALSE;
   m_hCimWorkEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
   m_nSessionId = 1;
   m_listener.onEQOffLine = nullptr;
   m_listener.onEQOnLine = nullptr;
   m_listener.onCommand = nullptr;
   m_listener.onEQConstantRequest = nullptr;
   m_listener.onEQConstantSend = nullptr;
   InitializeCriticalSection(&m_criticalSection);
}
@@ -64,7 +68,11 @@
void CHsmsPassive::setListener(SECSListener listener)
{
   m_listener.onEQOffLine = listener.onEQOffLine;
   m_listener.onEQOnLine = listener.onEQOnLine;
   m_listener.onCommand = listener.onCommand;
   m_listener.onEQConstantRequest = listener.onEQConstantRequest;
   m_listener.onEQConstantSend = listener.onEQConstantSend;
}
void CHsmsPassive::setActionTimeout(int nSecond)
@@ -188,14 +196,26 @@
      else if (nStream == 1 && pHeader->function == 13) {
         replyEstablishCommunications(pMessage);
      }
      else if (nStream == 1 && pHeader->function == 15) {
         replyOffLine(pMessage);
      }
      else if (nStream == 1 && pHeader->function == 17) {
         replyOnLine(pMessage);
      }
      else if (nStream == 2 && pHeader->function == 13) {
         replyEquipmentConstant(pMessage);
         replyEquipmentConstantRequest(pMessage);
      }
      else if (nStream == 2 && pHeader->function == 15) {
         replyEquipmentConstantSend(pMessage);
      }
      else if (nStream == 2 && pHeader->function == 31) {
         replyDatetime(pMessage);
      }
      else if (nStream == 2 && pHeader->function == 37) {
         replyEanbleDisableEventReport(pMessage);
      }
      else if (nStream == 2 && pHeader->function == 41) {
         replyCommand(pMessage);
      }
      else if (nStream == 5 && pHeader->function == 3) {
         replyEanbleDisableAlarmReport(pMessage);
@@ -362,7 +382,44 @@
   return 0;
}
// S1F14
// S1F15
int CHsmsPassive::replyOffLine(IMessage* pRecv)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      return ER_NOTSELECT;
   }
   // 交由上层应用来获取机器常量值
   if (m_listener.onEQOffLine != nullptr) {
      m_listener.onEQOffLine(this);
   }
   // 回复
   replyAck(1, 16, pRecv->getHeader()->systemBytes, BYTE(0), "OFLACK");
   return 0;
}
// S1F17
int CHsmsPassive::replyOnLine(IMessage* pRecv)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      return ER_NOTSELECT;
   }
   // 交由上层应用来获取机器常量值
   if (m_listener.onEQOnLine != nullptr) {
      m_listener.onEQOnLine(this);
   }
   // 回复
   replyAck(1, 18, pRecv->getHeader()->systemBytes, BYTE(0), "ONLACK");
   return 0;
}
int CHsmsPassive::replyEstablishCommunications(IMessage* pRecv)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
@@ -386,7 +443,7 @@
}
// S2F13
int CHsmsPassive::replyEquipmentConstant(IMessage* pRecv)
int CHsmsPassive::replyEquipmentConstantRequest(IMessage* pRecv)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      return ER_NOTSELECT;
@@ -395,23 +452,24 @@
   // 要获取的常量表表
   BOOL bCheckData = FALSE;
   std::vector<unsigned int> ecids;
   std::vector<EQConstant> eqcs;
   {
      ISECS2Item* pItem = pRecv->getBody();
      int ecidSize = pItem->getSubItemSize();
      for (int i = 0; i < ecidSize; i++) {
         EQConstant eqc;
         unsigned short id;
         if (pItem->getSubItemU2(i, id)) {
            ecids.push_back((int)id);
            eqc.id = id;
            eqcs.push_back(eqc);
         }
      }
   }
   // 交由上层应用来获取机器常量值
   std::vector<unsigned int> ecvs;
   if (m_listener.onEQConstantRequest != nullptr) {
      m_listener.onEQConstantRequest(this, ecids, ecvs);
      m_listener.onEQConstantRequest(this, eqcs);
   }
@@ -420,14 +478,57 @@
   HSMS_Create1Message(pMessage, m_nSessionId, 1, 14, pRecv->getHeader()->systemBytes);
   ASSERT(pMessage);
   ISECS2Item* pItem = pMessage->getBody();
   for (auto item : ecvs) {
      pItem->addU2Item(item, "ECV");
   for (auto& item : eqcs) {
      pItem->addItem(item.szValue, "ECV");
   }
   m_pPassive->sendMessage(pMessage);
   LOGI("<HSMS>[SECS Msg SEND]S2F14 (SysByte=%u)", pMessage->getHeader()->systemBytes);
   HSMS_Destroy1Message(pMessage);
   return 0;
}
// S2F15
int CHsmsPassive::replyEquipmentConstantSend(IMessage* pRecv)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      return ER_NOTSELECT;
   }
   // 要设置的常量表表
   BOOL bCheckData = FALSE;
   std::vector<EQConstant> eqcs;
   {
      ISECS2Item* pItem = pRecv->getBody();
      int ecidSize = pItem->getSubItemSize();
      for (int i = 0; i < ecidSize; i++) {
         ISECS2Item* pItemEqc = pItem->getSubItem(i);
         if (pItemEqc != nullptr) {
            EQConstant eqc;
            unsigned short eqcid;
            const char* pszValue;
            if (pItemEqc->getSubItemU2(0, eqcid)
               && pItemEqc->getSubItemString(1, pszValue)) {
               eqc.id = eqcid;
               strcpy_s(eqc.szValue, 256, pszValue);
               eqcs.push_back(eqc);
            }
         }
      }
   }
   // 交由上层应用来保存和设置机器常量值
   std::vector<unsigned int> ecvs;
   if (m_listener.onEQConstantSend != nullptr) {
      m_listener.onEQConstantSend(this, eqcs);
   }
   // 回复
   replyAck(2, 16, pRecv->getHeader()->systemBytes, BYTE(0), "EACK");
   return 0;
}
@@ -505,6 +606,55 @@
   return 0;
}
// S2F41
int CHsmsPassive::replyCommand(IMessage* pRecv)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      return ER_NOTSELECT;
   }
   ISECS2Item* pBody = pRecv->getBody();
   if (pBody == nullptr || pBody->getType() != SITYPE::A) ER_PARAM_ERROR;
   BOOL bCheckData = FALSE;
   const char* pszCmdName;
   std::vector<CommandParameter> params;
   {
      ISECS2Item* pItemParams, *pItemParam;
      ISECS2Item* pItem = pRecv->getBody();
      if (pItem->getSubItemSize() < 2) goto MYREPLY;
      if (!pItem->getSubItemString(0, pszCmdName)) goto MYREPLY;
      pItemParams = pItem->getSubItem(1);
      if (pItemParams == nullptr || pItemParams->getType() != SITYPE::L) goto MYREPLY;
      for (int i = 0; i < pItemParams->getSubItemSize(); i++) {
         const char* pszParamName, * pszParamValue;
         pItemParam = pItemParams->getSubItem(i);
         if (pItemParam != nullptr
            && pItemParam->getSubItemString(0, pszParamName)
            && pItemParam->getSubItemString(1, pszParamValue)) {
            CommandParameter cp;
            strcpy_s(cp.szName, 256, pszParamName);
            strcpy_s(cp.szValue, 256, pszParamValue);
            params.push_back(cp);
         }
      }
      bCheckData = TRUE;
   }
   // 回调到应用层
   if (bCheckData) {
      if (m_listener.onCommand != nullptr) {
         m_listener.onCommand(this, pszCmdName, params);
      }
   }
MYREPLY:
   replyAck(2, 42, pRecv->getHeader()->systemBytes, BYTE(0), "ERACK");
   return 0;
}
// S5F3
int CHsmsPassive::replyEanbleDisableAlarmReport(IMessage* pRecv)
{