LAPTOP-SNT8I5JK\Boounion
2025-05-27 e42e8364112e97d89eeaecd13f043dff42179949
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,6 +68,9 @@
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;
}
@@ -88,6 +95,63 @@
      m_strSoftRev = m_strSoftRev.substr(0, 20);
   }
}
void CHsmsPassive::addReport(unsigned int id, const char* pszName)
{
   Lock();
   REPORT report;
   report.id = id;
   strcpy_s(report.szName, REPORT_NAME_MAX, pszName);
   m_mapReport[id] = report;
   Unlock();
}
void CHsmsPassive::linkEventReport(unsigned int RPTID, unsigned int CEID)
{
   m_mapReportIdToCEID[RPTID] = CEID;
}
void CHsmsPassive::unlinkEventReport(unsigned int CEID)
{
   for (auto it = m_mapReportIdToCEID.begin(); it != m_mapReportIdToCEID.end(); ) {
      if (it->second == CEID) {
         m_mapReportIdToCEID.erase(it++);  // 更新迭代器
      }
      else {
         ++it;
      }
   }
}
unsigned int CHsmsPassive::getCEID(int RPTID)
{
   auto iter = m_mapReportIdToCEID.find(RPTID);
   if (iter != m_mapReportIdToCEID.end()) return iter->second;
   return 0;
}
void CHsmsPassive::deleteReport(unsigned int RPTID)
{
   for (auto it = m_mapValueIdToPRTID.begin(); it != m_mapValueIdToPRTID.end(); ) {
      if (it->second == RPTID) {
         m_mapValueIdToPRTID.erase(it++);  // 更新迭代器
      }
      else {
         ++it;
      }
   }
}
void CHsmsPassive::deleteAllReport()
{
   m_mapValueIdToPRTID.clear();
}
void CHsmsPassive::defineReport(unsigned int VID, unsigned int RPTID)
{
   m_mapValueIdToPRTID[VID] = RPTID;
}
void CHsmsPassive::OnTimer(UINT nTimerid)
@@ -189,6 +253,12 @@
      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) {
         replyEquipmentConstantRequest(pMessage);
      }
@@ -198,8 +268,17 @@
      else if (nStream == 2 && pHeader->function == 31) {
         replyDatetime(pMessage);
      }
      else if (nStream == 2 && pHeader->function == 33) {
         replyDefineReport(pMessage);
      }
      else if (nStream == 2 && pHeader->function == 35) {
         replyLinkEventReport(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);
@@ -366,7 +445,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()) {
@@ -459,7 +575,7 @@
            if (pItemEqc->getSubItemU2(0, eqcid)
               && pItemEqc->getSubItemString(1, pszValue)) {
               eqc.id = eqcid;
               strcpy_s(eqc.szValue, 256, pszValue);
               strcpy_s(eqc.szValue, EQCONSTANT_VALUE_MAX, pszValue);
               eqcs.push_back(eqc);
            }
         }
@@ -513,6 +629,100 @@
   return 0;
}
// S2F33
int CHsmsPassive::replyDefineReport(IMessage* pRecv)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      return ER_NOTSELECT;
   }
   ISECS2Item* pBody = pRecv->getBody();
   ISECS2Item* defineItem, *rptListItem, * vidListItem;
   unsigned int dataId, rptid, vid;
   if (!pBody->getSubItemU4(0, dataId)) goto MYREPLY;
   rptListItem = pBody->getSubItem(1);
   if (rptListItem == nullptr) goto MYREPLY;
   if (rptListItem->getSubItemSize() == 0) {
      deleteAllReport();
      goto MYREPLY;
   }
   for (int i = 0; i < rptListItem->getSubItemSize(); i++) {
      defineItem = rptListItem->getSubItem(i);
      if (defineItem == nullptr) continue;
      vidListItem = defineItem->getSubItem(1);
      if (defineItem->getSubItemU4(0, rptid)
         && vidListItem != nullptr) {
         int vidCount = vidListItem->getSubItemSize();
         if (vidCount == 0) {
            deleteReport(rptid);
         }
         else {
            for (int k = 0; k < vidCount; k++) {
               if (vidListItem->getSubItemU4(k, vid)) {
                  defineReport(vid, rptid);
               }
            }
         }
      }
   }
MYREPLY:
   // 检验结果是否正确
   for (auto item : m_mapValueIdToPRTID) {
      LOGE("=== vid:%d, prtid:%d", item.first, item.second);
   }
   replyAck(2, 34, pRecv->getHeader()->systemBytes, BYTE(0), "DRACK");
   return 0;
}
// S2F35
int CHsmsPassive::replyLinkEventReport(IMessage* pRecv)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      return ER_NOTSELECT;
   }
   ISECS2Item* pBody = pRecv->getBody();
   ISECS2Item* linkItem, *ceidListItem, *rptListItem;
   unsigned int dataId, ceid, rptid;
   if (!pBody->getSubItemU4(0, dataId)) goto MYREPLY;
   ceidListItem = pBody->getSubItem(1);
   if (ceidListItem == nullptr) goto MYREPLY;
   for (int i = 0; i < ceidListItem->getSubItemSize(); i++) {
      linkItem = ceidListItem->getSubItem(i);
      if (linkItem == nullptr) continue;
      rptListItem = linkItem->getSubItem(1);
      if (linkItem->getSubItemU4(0, ceid)
         && rptListItem != nullptr) {
         int prtCount = rptListItem->getSubItemSize();
         if (prtCount == 0) {
            unlinkEventReport(ceid);
         }
         else {
            for (int k = 0; k < prtCount; k++) {
               if (rptListItem->getSubItemU4(k, rptid)) {
                  linkEventReport(rptid, ceid);
               }
            }
         }
      }
   }
   // 检验结果是否正确
   for (auto item : m_mapReportIdToCEID) {
      LOGE("=== prtid:%d, ceid:%d", item.first, item.second);
   }
MYREPLY:
   replyAck(2, 36, pRecv->getHeader()->systemBytes, BYTE(0), "LRACK");
   return 0;
}
// S2F37
int CHsmsPassive::replyEanbleDisableEventReport(IMessage* pRecv)
{
@@ -550,6 +760,55 @@
MYREPLY:
   replyAck(2, 38, pRecv->getHeader()->systemBytes, BYTE(0), "ERACK");
   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, COMMAND_NAME_MAX, pszParamName);
            strcpy_s(cp.szValue, COMMAND_VALUE_MAX, 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;
}
@@ -695,4 +954,36 @@
   return ER_NOERROR;
}
// S6F11
int CHsmsPassive::requestEventReportSend(unsigned int DATAID, unsigned int RPTID, const std::vector<std::string>& values)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      return ER_NOTSELECT;
   }
   Lock();
   CHsmsAction* pAction = new CHsmsAction(ACTION_EVENT_REPORT, TRUE, m_nActionTimeout);
   m_listAction.push_back(pAction);
   IMessage* pMessage = NULL;
   HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 11, ++m_nSystemByte);
   ASSERT(pMessage);
   ISECS2Item* pItem = pMessage->getBody();
   pItem->addU4Item(DATAID, "DATAID");
   pItem->addU4Item(getCEID(RPTID), "CEID");
   ISECS2Item* pItemList1 = pItem->addItem();
   ISECS2Item* pItemList2 = pItemList1->addItem();
   pItemList2->addU4Item(RPTID, "RPTID");
   ISECS2Item* pItemList3 = pItemList2->addItem();
   for (auto item : values) {
      pItemList3->addItem(item.c_str(), "V");
   }
   pAction->setSendMessage(pMessage);
   SetEvent(m_hCimWorkEvent);
   Unlock();
   return ER_NOERROR;
}