SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -177,10 +177,10 @@
      LOGI("<HSMS>收到消息 S%dF%d", nStream, pHeader->function);
      if (nStream == 1 && pHeader->function == 1) {
         // S1F1
         replyAreYouThere(pHeader->systemBytes);
         replyAreYouThere(pMessage);
      }
      else if (nStream == 1 && pHeader->function == 13) {
         replyEstablishCommunications(pHeader->systemBytes);
         replyEstablishCommunications(pMessage);
      }
      else if (nStream == 2 && pHeader->function == 31) {
         replyDatetime(pMessage);
@@ -190,6 +190,12 @@
      }
      else if (nStream == 5 && pHeader->function == 3) {
         replyEanbleDisableAlarmReport(pMessage);
      }
      else if (nStream == 7 && pHeader->function == 19) {
         replyQueryPPIDList(pMessage);
      }
      else if (nStream == 10 && pHeader->function == 3) {
         replyTerminalDisplay(pMessage);
      }
   };
@@ -292,6 +298,19 @@
   return 0;
}
// 通用的reply ack函数
void CHsmsPassive::replyAck(int s, int f, unsigned int systemBytes, BYTE ack, const char* pszAckName)
{
   IMessage* pMessage = NULL;
   HSMS_Create1Message(pMessage, m_nSessionId, s, f, systemBytes);
   ASSERT(pMessage);
   ISECS2Item* pItem = pMessage->getBody();
   pItem->setBinary(ack, pszAckName);
   m_pPassive->sendMessage(pMessage);
   LOGI("<HSMS>[SECS Msg SEND]S%dF%d (SysByte=%u)", s, f, systemBytes);
   HSMS_Destroy1Message(pMessage);
}
// S1F1
int CHsmsPassive::requestAreYouThere()
{
@@ -314,14 +333,14 @@
}
// S1F2
int CHsmsPassive::replyAreYouThere(unsigned int systemBytes)
int CHsmsPassive::replyAreYouThere(IMessage* pRecv)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      return ER_NOTSELECT;
   }
   IMessage* pMessage = NULL;
   HSMS_Create1Message(pMessage, m_nSessionId, 1, 2, systemBytes);
   HSMS_Create1Message(pMessage, m_nSessionId, 1, 2, pRecv->getHeader()->systemBytes);
   ASSERT(pMessage);
   ISECS2Item* pItem = pMessage->getBody();
@@ -335,14 +354,14 @@
}
// S1F14
int CHsmsPassive::replyEstablishCommunications(unsigned int systemBytes)
int CHsmsPassive::replyEstablishCommunications(IMessage* pRecv)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      return ER_NOTSELECT;
   }
   IMessage* pMessage = NULL;
   HSMS_Create1Message(pMessage, m_nSessionId, 1, 14, systemBytes);
   HSMS_Create1Message(pMessage, m_nSessionId, 1, 14, pRecv->getHeader()->systemBytes);
   ASSERT(pMessage);
   ISECS2Item* pItem = pMessage->getBody();
@@ -387,17 +406,7 @@
      SetLocalTime(&time);
   }
   IMessage* pMessage = NULL;
   HSMS_Create1Message(pMessage, m_nSessionId, 2, 32, pRecv->getHeader()->systemBytes);
   ASSERT(pMessage);
   ISECS2Item* pItem = pMessage->getBody();
   pItem->setBinary(BYTE(0), "TIACK");
   m_pPassive->sendMessage(pMessage);
   LOGI("<HSMS>[SECS Msg SEND]S2F32 (SysByte=%u)", pRecv->getHeader()->systemBytes);
   HSMS_Destroy1Message(pMessage);
   replyAck(2, 32, pRecv->getHeader()->systemBytes, BYTE(0), "TIACK");
   return 0;
}
@@ -437,18 +446,7 @@
MYREPLY:
   int s = 2;
   int f = 38;
   IMessage* pMessage = NULL;
   HSMS_Create1Message(pMessage, m_nSessionId, s, f, pRecv->getHeader()->systemBytes);
   ASSERT(pMessage);
   ISECS2Item* pItem = pMessage->getBody();
   pItem->setBinary(BYTE(0), "ERACK");
   m_pPassive->sendMessage(pMessage);
   LOGI("<HSMS>[SECS Msg SEND]S%dF%d (SysByte=%u)", s, f, pRecv->getHeader()->systemBytes);
   HSMS_Destroy1Message(pMessage);
   replyAck(2, 38, pRecv->getHeader()->systemBytes, BYTE(0), "ERACK");
   return 0;
}
@@ -477,18 +475,59 @@
MYREPLY:
   int s = 5;
   int f = 4;
   replyAck(5, 4, pRecv->getHeader()->systemBytes, BYTE(0), "ACKC5");
   return 0;
}
// S7F19
int CHsmsPassive::replyQueryPPIDList(IMessage* pRecv)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      return ER_NOTSELECT;
   }
   IMessage* pMessage = NULL;
   HSMS_Create1Message(pMessage, m_nSessionId, s, f, pRecv->getHeader()->systemBytes);
   HSMS_Create1Message(pMessage, m_nSessionId, 7, 20, pRecv->getHeader()->systemBytes);
   ASSERT(pMessage);
   ISECS2Item* pItem = pMessage->getBody();
   pItem->setBinary(BYTE(0), "ACKC5");
   pItem->addItem("banana1", "PPID1");
   pItem->addItem("banana2", "PPID2");
   m_pPassive->sendMessage(pMessage);
   LOGI("<HSMS>[SECS Msg SEND]S%dF%d (SysByte=%u)", s, f, pRecv->getHeader()->systemBytes);
   LOGI("<HSMS>[SECS Msg SEND]S7F20 (SysByte=%u)", pMessage->getHeader()->systemBytes);
   HSMS_Destroy1Message(pMessage);
   return 0;
}
// S10F3
int CHsmsPassive::replyTerminalDisplay(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;
   BYTE tid;
   char* pszText = nullptr;;
   {
      ISECS2Item* pItem = pRecv->getBody();
      if (pItem->getSubItemSize() < 2) goto MYREPLY;
      if (!pItem->getSubItemBinary(0, tid)) goto MYREPLY;
      if (!pItem->getSubItemString(1, pszText)) goto MYREPLY;
      bCheckData = TRUE;
      LOGI("TerminalDisplay tid:%d, pszText:%s", tid, pszText);
      m_pModel->notifyText(RX_HSMS_TERMINAL_TEXT, pszText);
   }
MYREPLY:
   replyAck(10, 4, pRecv->getHeader()->systemBytes, BYTE(0), "ACKC10");
   return 0;
}