LAPTOP-SNT8I5JK\Boounion
2025-08-11 5edb485d226790306097e40ea954efb2ed90dd21
SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -103,6 +103,31 @@
}
void CHsmsPassive::addVariableValueToItem(ISECS2Item* pParent, SERVO::CVariable* pVariable)
{
   ASSERT(pParent);
   ASSERT(pVariable);
   SERVO::SVFromat format = pVariable->getFormat();
   switch (format)
   {
   case SERVO::SVFromat::U1:
      pParent->addU1Item((unsigned char)pVariable->getIntValue(), "SV");
      break;
   case SERVO::SVFromat::U2:
      pParent->addU2Item((unsigned char)pVariable->getIntValue(), "SV");
      break;
   case SERVO::SVFromat::I2:
      pParent->addI2Item((unsigned char)pVariable->getIntValue(), "SV");
      break;
   case SERVO::SVFromat::A20:
   case SERVO::SVFromat::A50:
      pParent->addItem(pVariable->getValue().c_str(), "SV");
   default:
      break;
   }
}
void CHsmsPassive::linkEventReport(unsigned int CEID, unsigned int RPTID)
{
   SERVO::CCollectionEvent* pEvent = getEvent(CEID);
@@ -256,12 +281,39 @@
   return nullptr;
}
SERVO::CVariable* CHsmsPassive::getVariable(const char* pszName)
{
   for (auto item : m_variabels) {
      if (item->getName().compare(pszName) == 0) {
         return item;
      }
   }
   return nullptr;
}
void CHsmsPassive::clearAllVariabel()
{
   for (auto item : m_variabels) {
      delete item;
   }
   m_variabels.clear();
}
void CHsmsPassive::setVariableValue(const char* pszName, __int64 value)
{
   auto v = getVariable(pszName);
   if (v != nullptr) {
      v->setValue(value);
   }
}
void CHsmsPassive::setVariableValue(const char* pszName, const char* value)
{
   auto v = getVariable(pszName);
   if (v != nullptr) {
      v->setValue(value);
   }
}
int CHsmsPassive::loadReports(const char* pszFilepath)
@@ -509,6 +561,9 @@
         // S1F1
         replyAreYouThere(pMessage);
      }
      else if (nStream == 1 && pHeader->function == 3) {
         replySelectedEquipmentStatusData(pMessage);
      }
      else if (nStream == 1 && pHeader->function == 13) {
         replyEstablishCommunications(pMessage);
      }
@@ -541,6 +596,9 @@
      }
      else if (nStream == 2 && pHeader->function == 43) {
         replyConfigureSpooling(pMessage);
      }
      else if (nStream == 3 && pHeader->function == 17) {
         replyCarrierAction(pMessage);
      }
      else if (nStream == 5 && pHeader->function == 3) {
         replyEanbleDisableAlarmReport(pMessage);
@@ -872,6 +930,45 @@
   return 0;
}
int CHsmsPassive::replySelectedEquipmentStatusData(IMessage* pRecv)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      return ER_NOTSELECT;
   }
   IMessage* pMessage = NULL;
   HSMS_Create1Message(pMessage, m_nSessionId, 1, 4, pRecv->getHeader()->systemBytes);
   ASSERT(pMessage);
   unsigned char SVU1 = 0;
   unsigned int SVID = 0;
   ISECS2Item* pBody = pRecv->getBody();
   if (pBody == nullptr || pBody->getType() != SITYPE::L) {
      pMessage->getBody()->addU1Item(SVU1, "SV");
      goto MYREPLY;
   }
   if (!pBody->getSubItemU4(0, SVID)) {
      pMessage->getBody()->addU1Item(SVU1, "SV");
      goto MYREPLY;
   }
   SERVO::CVariable* pVariable = getVariable(SVID);
   if (pVariable == nullptr) {
      pMessage->getBody()->addU1Item(SVU1, "SV");
      goto MYREPLY;
   }
   addVariableValueToItem(pMessage->getBody(), pVariable);
MYREPLY:
   m_pPassive->sendMessage(pMessage);
   LOGI("<HSMS>[SECS Msg SEND]%s", pMessage->toString());
   HSMS_Destroy1Message(pMessage);
   return 0;
}
// S2F13
int CHsmsPassive::replyEquipmentConstantRequest(IMessage* pRecv)
{
@@ -1092,7 +1189,7 @@
   // 检验结果是否正确
   for (auto item : m_collectionEvents) {
      LOGE("=== ceid:%d, prtid:%d", item->getEventId(), item->getPortID());
      LOGE("=== ceid:%d, prtid:%d", item->getEventId(), item->getFirstPortID());
   }
   
MYREPLY:
@@ -1234,6 +1331,57 @@
   return 0;
}
// S3F17
int CHsmsPassive::replyCarrierAction(IMessage* pRecv)
{
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      return ER_NOTSELECT;
   }
   unsigned char CAACK = CAACK_0;
   unsigned int ERRCODE = 0;
   std::string strError = "no error";
   if (m_listener.onCarrierAction == nullptr) {
      CAACK = 5;
      ERRCODE = CAACK_5;
      strError = "Not supported";
      goto MYREPLY;
   }
   ISECS2Item* pBody = pRecv->getBody();
   if (pBody == nullptr || pBody->getType() != SITYPE::L) ER_PARAM_ERROR;
   unsigned int DATAID;
   unsigned char PTN;
   const char* pszCarrierAction, *pszCarrierId;
   pBody->getSubItemU4(0, DATAID);
   pBody->getSubItemString(1, pszCarrierAction);
   pBody->getSubItemString(2, pszCarrierId);
   pBody->getSubItemU1(3, PTN);
   ERRCODE = m_listener.onCarrierAction(this,
      DATAID,
      pszCarrierAction,
      pszCarrierId,
      PTN,
      strError);
   CAACK = ERRCODE;
   // 回复
MYREPLY:
   IMessage* pMessage = NULL;
   HSMS_Create1Message(pMessage, m_nSessionId, 3, 18, pRecv->getHeader()->systemBytes);
   pMessage->getBody()->addU1Item(CAACK, "CAACK");
   ISECS2Item* pErrItem = pMessage->getBody()->addItem();
   pErrItem->addU4Item(ERRCODE, "ERRCODE");
   pErrItem->addItem(strError.c_str(), "ERRTEXT");
   m_pPassive->sendMessage(pMessage);
   LOGI("<HSMS>[SECS Msg SEND]S3F18 (SysByte=%u)", pMessage->getHeader()->systemBytes);
   HSMS_Destroy1Message(pMessage);
   return 0;
}
// S5F3
int CHsmsPassive::replyEanbleDisableAlarmReport(IMessage* pRecv)
{
@@ -1314,19 +1462,20 @@
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
      return ER_NOTSELECT;
   }
   if (m_listener.onQueryPPIDList == nullptr) {
      return ER_NO_PPID_LIST;
   }
   IMessage* pMessage = NULL;
   HSMS_Create1Message(pMessage, m_nSessionId, 7, 20, pRecv->getHeader()->systemBytes);
   ASSERT(pMessage);
   ISECS2Item* pItem = pMessage->getBody();
   pItem->addItem("banana1", "PPID1");
   pItem->addItem("banana2", "PPID2");
   pItem->addF8Item(-123.45, "PPID2");
   pItem->addF4Item(-568.99f, "PPID2");
   pItem->addF8Item(456.456, "PPID2");
   pItem->addF4Item(123.123f, "PPID2");
   auto ppids = m_listener.onQueryPPIDList(this);
   for (auto item : ppids) {
      pItem->addItem(item.c_str(), "PPID");
   }
   m_pPassive->sendMessage(pMessage);
   LOGI("<HSMS>[SECS Msg SEND]S7F20 (SysByte=%u)", pMessage->getHeader()->systemBytes);
   HSMS_Destroy1Message(pMessage);
@@ -1395,15 +1544,19 @@
}
// S6F11
int CHsmsPassive::requestEventReportSend(unsigned int DATAID, unsigned int CEID, const std::vector<std::string>& values)
static unsigned int DATAID = 1;
int CHsmsPassive::requestEventReportSend(unsigned int CEID)
{
   SERVO::CCollectionEvent* pEvent = getEvent(CEID);
   if (pEvent == nullptr) {
      return ER_NO_EVENT;
   }
   if (pEvent == nullptr) {
   SERVO::CReport* pReport = pEvent->getFirstReport();
   if (pReport == nullptr) {
      return ER_UNLINK_EVENT_REPORT;
   }
   Lock();
   CHsmsAction* pAction = new CHsmsAction(ACTION_EVENT_REPORT, TRUE, m_nActionTimeout);
@@ -1411,14 +1564,16 @@
   HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 11, ++m_nSystemByte);
   ASSERT(pMessage);
   ISECS2Item* pItem = pMessage->getBody();
   pItem->addU4Item(DATAID, "DATAID");
   pItem->addU4Item(++DATAID, "DATAID");
   pItem->addU4Item(CEID, "CEID");
   ISECS2Item* pItemList1 = pItem->addItem();
   ISECS2Item* pItemList2 = pItemList1->addItem();
   pItemList2->addU4Item(pEvent->getPortID(), "RPTID");
   pItemList2->addU4Item(pReport->getReportId(), "RPTID");
   ISECS2Item* pItemList3 = pItemList2->addItem();
   auto values = pReport->getVariables();
   for (auto item : values) {
      pItemList3->addItem(item.c_str(), "V");
      pItemList3->addItem(item->getValue().c_str(), "V");
   }
   pAction->setSendMessage(pMessage);
   if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
@@ -1433,5 +1588,26 @@
   return ER_NOERROR;
}
int CHsmsPassive::requestEventReportSend(const char* pszEventName)
{
   SERVO::CCollectionEvent* pEvent = nullptr;
   for (auto e : m_collectionEvents) {
      if (e->getName().compare(pszEventName) == 0) {
         pEvent = e;
         break;
      }
   }
   if (pEvent == nullptr) {
      return ER_NO_EVENT;
   }
   return requestEventReportSend(pEvent->getEventId());
}
int CHsmsPassive::requestEventReportSend_CarrierID_Readed()
{
   return requestEventReportSend("CarrierID_Readed");
}