From e51c6d1360f9679dd8e4dd3379ce0db1886badbf Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期一, 28 七月 2025 17:36:57 +0800
Subject: [PATCH] Merge branch 'EAPSimulator' into clh
---
SourceCode/Bond/EAPSimulator/CHsmsActive.cpp | 286 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 286 insertions(+), 0 deletions(-)
diff --git a/SourceCode/Bond/EAPSimulator/CHsmsActive.cpp b/SourceCode/Bond/EAPSimulator/CHsmsActive.cpp
new file mode 100644
index 0000000..6d74a5c
--- /dev/null
+++ b/SourceCode/Bond/EAPSimulator/CHsmsActive.cpp
@@ -0,0 +1,286 @@
+#include "pch.h"
+#include "CHsmsActive.h"
+#include "Log.h"
+
+
+CHsmsActive::CHsmsActive()
+{
+ m_listener = {};
+ m_pActive = nullptr;
+ m_nSessionId = 0;
+ m_nSystemByte = 0;
+}
+
+CHsmsActive::~CHsmsActive()
+{
+
+}
+
+void CHsmsActive::setListener(ACTIVEListener listener)
+{
+ m_listener = listener;
+}
+
+int CHsmsActive::init(const char* pszIp, int port)
+{
+ m_strIp = pszIp;
+ m_nPort = port;
+
+ auto onStatusChanged = [&](void* pFrom, ACTIVESTATE state) -> void {
+ if (m_listener.onStateChanged != nullptr) {
+ m_listener.onStateChanged(this, state);
+ }
+
+ if (ACTIVESTATE::NOT_SELECTED == state) {
+ LOGI("Active state changed(NOT_SELECTED).");
+ hsmsSelectRequest();
+ }
+ else if (ACTIVESTATE::SELECTED == state) {
+ LOGI("Active state changed(SELECTED).");
+ hsmsEstablishCommunications();
+ }
+ else if (ACTIVESTATE::NOT_CONNECTED == state) {
+ LOGI("Active state changed(NOT_CONNECTED).");
+ m_pActive->disconnect();
+ }
+ };
+ auto onRecvSysMessage = [&](void* pFrom, IMessage* pMessage) -> void {
+ LOGI("onRecvSysMessage(sessionId:%d, sType:%d).",
+ pMessage->getHeader()->sessionId, pMessage->getHeader()->sType);
+ TRACE("sessionId:%d, sType:%d\n", pMessage->getHeader()->sessionId, pMessage->getHeader()->sType);
+ };
+
+ auto onError = [&](void* pFrom, int error) -> void {
+ TRACE("onError:%d\n", error);
+ };
+
+ auto onRecvRawData = [&](void* pFrom, const char* pszData, int size) {
+ TRACE("onRec ,vRawData:<0x%x, %d>\n", pszData, size);
+ };
+
+ auto onRecvDataMessage = [&](void* pFrom, IMessage* pMessage) -> void {
+ HEADER* pHeader = pMessage->getHeader();
+ int nStream = (pHeader->stream & 0x7F);
+
+ TRACE("收到消息 S%dF%d================\n", pHeader->stream & 0x7F, pHeader->function);
+ TRACE("Body:%s\n", pMessage->toString());
+ LOGI("onRecvDataMessage(%s).", pMessage->toString());
+
+ if (nStream == 5 && pHeader->function == 1) {
+ // S1F1
+ replyAck(5, 2, pMessage->getHeader()->systemBytes, 0, _T("ACK0"));
+ }
+ };
+
+ ActiveListener listener;
+ listener.funStateChanged = onStatusChanged;
+ listener.funRecvRawData = onRecvRawData;
+ listener.funRecvDataMessage = onRecvDataMessage;
+ listener.funRecvSysMessage = onRecvSysMessage;
+ listener.funError = onError;
+ int nRet = HSMS_CreateActive(m_pActive, _T(""), m_strIp.c_str(), m_nPort);
+ if (nRet == 0 && m_pActive != nullptr) {
+ m_pActive->setListener(listener);
+ m_pActive->connect();
+ }
+
+ return 0;
+}
+
+int CHsmsActive::term()
+{
+ if (m_pActive != nullptr) {
+ ::HSMS_DestroyActive(m_pActive);
+ m_pActive = nullptr;
+ }
+
+ return 0;
+}
+
+int CHsmsActive::hsmsSelectRequest()
+{
+ IMessage* pMessage = nullptr;
+ int nRet = HSMS_CreateMessageWithSType(pMessage, MSG_SELECT_REQ, ++m_nSystemByte);
+ m_pActive->sendMessage(pMessage);
+ HSMS_Destroy1Message(pMessage);
+
+ return 0;
+}
+
+int CHsmsActive::hsmsDeselectRequest()
+{
+ IMessage* pMessage = nullptr;
+ int nRet = HSMS_CreateMessageWithSType(pMessage, MSG_DESELECT_REQ, ++m_nSystemByte);
+ m_pActive->sendMessage(pMessage);
+ HSMS_Destroy1Message(pMessage);
+
+ return 0;
+}
+
+int CHsmsActive::hsmsEstablishCommunications()
+{
+ IMessage* pMessage = nullptr;
+ int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 1 | REPLY, 13, ++m_nSystemByte);
+ m_pActive->sendMessage(pMessage);
+ HSMS_Destroy1Message(pMessage);
+
+ return 0;
+}
+
+int CHsmsActive::hsmsAreYouThere()
+{
+ IMessage* pMessage = nullptr;
+ int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 1 | REPLY, 1, ++m_nSystemByte);
+ m_pActive->sendMessage(pMessage);
+ HSMS_Destroy1Message(pMessage);
+
+ return 0;
+}
+
+int CHsmsActive::hsmsDatetimeSync()
+{
+ CTime time = CTime::GetCurrentTime();
+ char szTime[256];
+ sprintf_s(szTime, 256, _T("%4d%02d%02d%02d%02d%02d00"), time.GetYear(),
+ time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond());
+
+ IMessage* pMessage = nullptr;
+ int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 2 | REPLY, 31, ++m_nSystemByte);
+ ISECS2Item* pItem = pMessage->getBody();
+ pItem->setString((const char*)szTime, _T("Date time"));
+ m_pActive->sendMessage(pMessage);
+ HSMS_Destroy1Message(pMessage);
+
+ return 0;
+}
+
+int CHsmsActive::hsmsTerminalDisplay(BYTE tid, const char* pszText)
+{
+ char szTid[1];
+ szTid[0] = tid;
+
+ IMessage* pMessage = nullptr;
+ int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 10 | REPLY, 3, ++m_nSystemByte);
+ ISECS2Item* pItem = pMessage->getBody();
+ pItem->addBinaryItem(szTid, 1, _T("TID"));
+ pItem->addItem(pszText, _T("TEXT"));
+ m_pActive->sendMessage(pMessage);
+ HSMS_Destroy1Message(pMessage);
+
+ return 0;
+}
+
+int CHsmsActive::hsmsEDEventReport(bool bEnable, std::vector<int>& ids)
+{
+ IMessage* pMessage = nullptr;
+ int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 2 | REPLY, 37, ++m_nSystemByte);
+ ISECS2Item* pItem = pMessage->getBody();
+ pItem->addBoolItem(bEnable, "CEED");
+ ISECS2Item* pItem2 = pItem->addItem();
+ for (auto item : ids) {
+ pItem2->addU4Item(item, "CEID");
+ }
+ m_pActive->sendMessage(pMessage);
+ HSMS_Destroy1Message(pMessage);
+
+ return 0;
+}
+
+int CHsmsActive::hsmsEDAlarmReport(bool bEnable, unsigned int id)
+{
+ char szEnable[2] = {128, 0};
+
+ IMessage* pMessage = nullptr;
+ int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 5 | REPLY, 3, ++m_nSystemByte);
+ ISECS2Item* pItem = pMessage->getBody();
+ pItem->addBinaryItem(&szEnable[bEnable ? 0 : 1], 1, "ALED");
+ pItem->addU4Item(id, "ALID");
+ m_pActive->sendMessage(pMessage);
+ HSMS_Destroy1Message(pMessage);
+
+ return 0;
+}
+
+int CHsmsActive::hsmsDefineReports(std::map<unsigned int, std::vector<unsigned int>>& mapReport)
+{
+ IMessage* pMessage = nullptr;
+ int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 2 | REPLY, 33, ++m_nSystemByte);
+ ISECS2Item* pItem = pMessage->getBody();
+ pItem->addU4Item(1, "DATAID");
+ ISECS2Item* pItemReportList = pItem->addItem();
+ for (auto item : mapReport) {
+ ISECS2Item* pItemReport = pItemReportList->addItem();
+ pItemReport->addU4Item(item.first, "RPTID");
+ ISECS2Item* pItemVidList = pItemReport->addItem();
+ for (auto vid : item.second) {
+ pItemVidList->addU4Item(vid, "VID");
+ }
+ }
+ m_pActive->sendMessage(pMessage);
+ HSMS_Destroy1Message(pMessage);
+
+ return 0;
+}
+
+int CHsmsActive::hsmsLinkEventReport(std::map<unsigned int, std::vector<unsigned int>>& mapEvent)
+{
+ if (mapEvent.empty()) return 0;
+
+ IMessage* pMessage = nullptr;
+ int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 2 | REPLY, 35, ++m_nSystemByte);
+ ISECS2Item* pItem = pMessage->getBody();
+ pItem->addU4Item(1, "DATAID");
+ ISECS2Item* pItemEventList = pItem->addItem();
+ for (auto item : mapEvent) {
+ ISECS2Item* pItemEvent = pItemEventList->addItem();
+ pItemEvent->addU4Item(item.first, "CEID");
+ ISECS2Item* pItemRptidList = pItemEvent->addItem();
+ for (auto vid : item.second) {
+ pItemRptidList->addU4Item(vid, "RPTID");
+ }
+ }
+ m_pActive->sendMessage(pMessage);
+ HSMS_Destroy1Message(pMessage);
+
+ return 0;
+}
+
+int CHsmsActive::hsmsConfigureSpooling(std::map<unsigned int, std::set<unsigned int>>& spoolingConfig)
+{
+ IMessage* pMessage = nullptr;
+ int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 2 | REPLY, 43, ++m_nSystemByte);
+ if (spoolingConfig.size() > 0) {
+ for (auto s : spoolingConfig) {
+ ISECS2Item* pItemStreamList = pMessage->getBody()->addItem();
+ pItemStreamList->addU1Item(s.first, "STRID");
+ ISECS2Item* pItemFcnList = pItemStreamList->addItem();
+ for (auto f : s.second) {
+ pItemFcnList->addU1Item(f, "FCNID");
+ }
+ }
+ }
+
+ m_pActive->sendMessage(pMessage);
+ HSMS_Destroy1Message(pMessage);
+
+ return 0;
+}
+
+int CHsmsActive::replyAck0(IMessage* pMessage)
+{
+ return 0;
+}
+
+// 通用的reply ack函数
+void CHsmsActive::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((const char*)&ack, 1, pszAckName);
+ m_pActive->sendMessage(pMessage);
+ LOGI("<HSMS>[SECS Msg SEND]S%dF%d (SysByte=%u)", s, f, systemBytes);
+ HSMS_Destroy1Message(pMessage);
+}
+
--
Gitblit v1.9.3