LAPTOP-SNT8I5JK\Boounion
2025-08-01 cf354448c631302367af8152d4a3fd0ba20afcb6
SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -48,6 +48,7 @@
   m_listener.onCommand = nullptr;
   m_listener.onEQConstantRequest = nullptr;
   m_listener.onEQConstantSend = nullptr;
   m_pActiveAction = nullptr;
   InitializeCriticalSection(&m_criticalSection);
}
@@ -62,6 +63,10 @@
      delete item;
   }
   m_listActionSent.clear();
   for (auto item : m_listActionSpooling) {
      delete item;
   }
   m_listActionSpooling.clear();
   Unlock();
   if (m_hCimWorkEvent != NULL) {
@@ -151,11 +156,24 @@
{
   LOGI("onRecvMsg:%s", pMessage->toString());
   Lock();
   if (m_pActiveAction != nullptr &&
      (m_pActiveAction->getSendMessage()->getHeader()->systemBytes == pMessage->getHeader()->systemBytes)) {
      SetEvent(m_pActiveAction->getEvent());
      LOGI("CHsmsPassive::当前等待有回复");
      TRACE("CHsmsPassive::当前等待有回复\n");
      Unlock();
      return 0;
   }
   Unlock();
   Lock();
   CHsmsAction* pAction = nullptr;
   for (auto iter = m_listActionSent.begin(); iter != m_listActionSent.end(); iter++) {
      if ((*iter)->getSendMessage()->getHeader()->systemBytes == pMessage->getHeader()->systemBytes) {
         LOGI("CHsmsPassive::找到");
         pAction = (*iter);
         SetEvent(pAction->getEvent());
         m_listActionSent.erase(iter);
         break;
      }
@@ -460,17 +478,17 @@
   };
   auto onRecvSysMessage = [&](void* pFrom, IMessage* pMessage) -> void {
      LOGI("<HSMS>onRecvSysMessage:sessionId:%d, sType:%d systemBytes:%d",
         pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
      pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
      onRecvMsg(pMessage);
      if (MSG_LINKTEST_REQ == pMessage->getHeader()->sType) {
         /*
         Sleep(10);
         if (!m_bAreYouThereRequest) {
            m_bAreYouThereRequest = TRUE;
            requestYouThere();
         }
         */
      /*
      Sleep(10);
      if (!m_bAreYouThereRequest) {
         m_bAreYouThereRequest = TRUE;
         requestYouThere();
      }
      */
}
   };
   auto onError = [&](void* pFrom, int error) -> void {
@@ -527,6 +545,9 @@
      else if (nStream == 5 && pHeader->function == 3) {
         replyEanbleDisableAlarmReport(pMessage);
      }
      else if (nStream == 6 && pHeader->function == 23) {
         replyPurgeSpooledData(pMessage);
      }
      else if (nStream == 7 && pHeader->function == 19) {
         replyQueryPPIDList(pMessage);
      }
@@ -554,6 +575,42 @@
   return 0;
}
int CHsmsPassive::loadCacheFromFile(const char* pszFilepath)
{
   m_strCacheFilepath = pszFilepath;
   CFile file;
   if (!file.Open(m_strCacheFilepath.c_str(), CFile::modeRead) ) {
      return -1;
   }
   int nBufSize = file.GetLength();
   char* pszBuffer = new char[nBufSize];
   file.Read(pszBuffer, nBufSize);
   file.Close();
   int nRet = unserialize(pszBuffer, nBufSize);
   delete[] pszBuffer;
   return nRet;
}
int CHsmsPassive::saveCache()
{
   CFile file;
   if (!file.Open(m_strCacheFilepath.c_str(), CFile::modeWrite | CFile::modeCreate)) {
      return -1;
   }
   int nSize = serialize(nullptr, 0);
   char* pszBuffer = new char[nSize];
   int nRet = serialize(pszBuffer, nSize);
   file.Write(pszBuffer, nSize);
   file.Close();
   delete[] pszBuffer;
   return nRet;
}
int CHsmsPassive::term()
{
   // 结束线程
@@ -577,6 +634,53 @@
   return 0;
}
int CHsmsPassive::serialize(char* pszBuffer, int nBufferSize)
{
   int index = 0;
   if (pszBuffer == nullptr) {
      index += sizeof(int);
      for (auto item : m_listActionSpooling) {
         index += item->serialize(pszBuffer, nBufferSize);
      }
      return index;
   }
   else {
      int nTemp, nRet;
      nTemp = (int)m_listActionSpooling.size();
      memcpy(&pszBuffer[index], &nTemp, sizeof(int));
      index += sizeof(int);
      for (auto item : m_listActionSpooling) {
         nRet = item->serialize(&pszBuffer[index], nBufferSize);
         if (nRet <= 0) break;
         index += nRet;
      }
      return index;
   }
}
int CHsmsPassive::unserialize(const char* pszBuffer, int nBufferSize)
{
   int index = 0, nTemp, nRet = 0;
   if (index + sizeof(int) > nBufferSize) return -1;
   memcpy(&nTemp, &pszBuffer[index], sizeof(int));
   index += sizeof(int);
   for (int i = 0; i < nTemp; i++) {
      CHsmsAction* pAction = new CHsmsAction();
      nRet = pAction->unserialize(&pszBuffer[index], nBufferSize - index);
      if (nRet <= 0) break;
      index += nRet;
      m_listActionSpooling.push_back(pAction);
   }
   return index + nRet;
}
unsigned CHsmsPassive::OnCimWork()
{
   while (m_bCimWorking) {
@@ -595,17 +699,26 @@
      while (!list.empty()) {
         Lock();
         CHsmsAction* pAction = list.front();
         if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
            m_listActionSpooling.push_back(pAction);
            Unlock();
            continue;
         }
         Unlock();
         list.pop_front();
         TRACE("OnCimWork 004.\n");
         IMessage* pMessage = pAction->getSendMessage();
         ASSERT(pMessage);
         m_pPassive->sendMessage(pMessage);
         LOGI("<HSMS> [SEND] SysByte=%u sessionId:%d", pMessage->getHeader()->systemBytes, pMessage->getHeader()->sessionId);
         if (pAction->isNeedWaitReply()) {
            // 如果需要等待回复
            Lock();
            m_pActiveAction = pAction;
            IMessage* pMessage = pAction->getSendMessage();
            Unlock();
            ASSERT(pMessage);
            m_pPassive->sendMessage(pMessage);
            LOGI("<HSMS> [SEND] SysByte=%u sessionId:%d", pMessage->getHeader()->systemBytes, pMessage->getHeader()->sessionId);
            int nRet = WaitForSingleObject(pAction->getEvent(), pAction->getTimeout() * 1000);
            if (nRet == WAIT_TIMEOUT) {
               TRACE("Timeout...\n");
@@ -616,18 +729,22 @@
                  //pContext->setEvent();
               }
            }
            delete pAction;
            pAction = NULL;
            TRACE("delete m_pCurrentAction, next...\n");
            Lock();
            delete m_pActiveAction;
            m_pActiveAction = nullptr;
            Unlock();
         }
         else {
            Lock();
            m_listActionSent.push_back(pAction);
            IMessage* pMessage = pAction->getSendMessage();
            Unlock();
            ASSERT(pMessage);
            m_pPassive->sendMessage(pMessage);
            LOGI("<HSMS> [SEND] SysByte=%u sessionId:%d", pMessage->getHeader()->systemBytes, pMessage->getHeader()->sessionId);
         }
      }
      TRACE("OnCimWork \n");
@@ -732,6 +849,7 @@
   return 0;
}
// S1F13
int CHsmsPassive::replyEstablishCommunications(IMessage* pRecv)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
@@ -1149,6 +1267,47 @@
   return 0;
}
// S6F23
int CHsmsPassive::replyPurgeSpooledData(IMessage* pRecv)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      return ER_NOTSELECT;
   }
   ISECS2Item* pBody = pRecv->getBody();
   if (pBody == nullptr || pBody->getType() != SITYPE::U1) ER_PARAM_ERROR;
   unsigned char RSDC;      // 0 - transmit; 1 - purge;
   pBody->getU1(RSDC);
   if (RSDC != 0 && RSDC != 1) ER_PARAM_ERROR;
   BYTE ACK = 0;      // 0 - ok;   1 - retryable busy;   2 - no spool data;
   if (m_listActionSpooling.empty()) {
      ACK = 2;
   }
   replyAck(6, 24, pRecv->getHeader()->systemBytes, ACK, "RSDA");
   // 丢弃
   if (RSDC == 1) {
      Lock();
      for (auto item : m_listActionSpooling) {
         delete item;
      }
      m_listActionSpooling.clear();
      Unlock();
   }
   else {
      Lock();
      for (auto item : m_listActionSpooling) {
         m_listAction.push_back(item);
      }
      m_listActionSpooling.clear();
      Unlock();
      SetEvent(m_hCimWorkEvent);
   }
   return 0;
}
// S7F19
int CHsmsPassive::replyQueryPPIDList(IMessage* pRecv)
{
@@ -1209,16 +1368,12 @@
// S5F1
int CHsmsPassive::requestAlarmReport(int ALCD, int ALID, const char* ALTX)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      return ER_NOTSELECT;
   }
   char szALCD[1];
   szALCD[0] = ALCD & 0xff;
   Lock();
   CHsmsAction* pAction = new CHsmsAction(ACTION_ALARM_REPORT, TRUE, m_nActionTimeout);
   m_listAction.push_back(pAction);
   IMessage* pMessage = NULL;
   HSMS_Create1Message(pMessage, m_nSessionId, 5 | REPLY, 1, ++m_nSystemByte);
   ASSERT(pMessage);
@@ -1227,21 +1382,14 @@
   pItem->addU4Item(ALID, "ALID");
   pItem->addItem(ALTX, "ALTX");
   pAction->setSendMessage(pMessage);
   SetEvent(m_hCimWorkEvent);
   Unlock();
   int size = pAction->serialize(nullptr, 0);;
   if (size > 0) {
      char* pszBuffer = new char[size];
      pAction->serialize(pszBuffer, size);
      AfxMessageBox("abc");
      CHsmsAction* pAction2 = new CHsmsAction();
      pAction2->unserialize(pszBuffer, size);
      AfxMessageBox("def");
      m_pPassive->sendMessage(pAction2->getSendMessage());
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      m_listActionSpooling.push_back(pAction);
   }
   else {
      m_listAction.push_back(pAction);
      SetEvent(m_hCimWorkEvent);
   }
   Unlock();
   return ER_NOERROR;
}
@@ -1249,10 +1397,6 @@
// S6F11
int CHsmsPassive::requestEventReportSend(unsigned int DATAID, unsigned int CEID, const std::vector<std::string>& values)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      return ER_NOTSELECT;
   }
   SERVO::CCollectionEvent* pEvent = getEvent(CEID);
   if (pEvent == nullptr) {
      return ER_NO_EVENT;
@@ -1263,7 +1407,6 @@
   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);
@@ -1278,8 +1421,13 @@
      pItemList3->addItem(item.c_str(), "V");
   }
   pAction->setSendMessage(pMessage);
   SetEvent(m_hCimWorkEvent);
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      m_listActionSpooling.push_back(pAction);
   }
   else {
      m_listAction.push_back(pAction);
      SetEvent(m_hCimWorkEvent);
   }
   Unlock();
   
   return ER_NOERROR;