LAPTOP-SNT8I5JK\Boounion
2025-01-21 ccbda3e4f7ed430843fbc0190e8ee0d0f0e3a721
SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -64,7 +64,10 @@
void CHsmsPassive::setListener(SECSListener listener)
{
   m_listener.onEQOffLine = listener.onEQOffLine;
   m_listener.onEQOnLine = listener.onEQOnLine;
   m_listener.onEQConstantRequest = listener.onEQConstantRequest;
   m_listener.onEQConstantSend = listener.onEQConstantSend;
}
void CHsmsPassive::setActionTimeout(int nSecond)
@@ -188,8 +191,17 @@
      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);
@@ -362,7 +374,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 +435,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 +444,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,8 +470,8 @@
   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);
@@ -431,6 +481,49 @@
   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;
}
// S2F31
int CHsmsPassive::replyDatetime(IMessage* pRecv)
{