LAPTOP-SNT8I5JK\Boounion
2025-02-11 3cfb3d13a937d5be56abb7c23e9c5d53521fc935
SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -125,6 +125,28 @@
}
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)
{
   // 所有已发送的Action自加1
@@ -238,6 +260,9 @@
      }
      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);
@@ -597,6 +622,55 @@
   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)
{
@@ -605,7 +679,6 @@
   }
   BOOL bCheckData = FALSE;
   ISECS2Item* pBody = pRecv->getBody();
   ISECS2Item* linkItem, *ceidListItem, *rptListItem;
   unsigned int dataId, ceid, rptid;