From cf354448c631302367af8152d4a3fd0ba20afcb6 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期五, 01 八月 2025 11:32:28 +0800
Subject: [PATCH] 1.Spooled Data功能实现; 2.Request spooled data消息响应,EAP模拟测试;

---
 SourceCode/Bond/Servo/CPageGraph2.cpp            |    5 
 SourceCode/Bond/EAPSimulator/CHsmsActive.cpp     |   25 ++++
 SourceCode/Bond/EAPSimulator/Resource.h          |    2 
 SourceCode/Bond/HSMSSDK/Include/ISECS2Item.h     |    1 
 SourceCode/Bond/Servo/HsmsPassive.h              |    8 +
 SourceCode/Bond/EAPSimulator/EAPSimulatorDlg.cpp |   14 ++
 SourceCode/Bond/EAPSimulator/CHsmsActive.h       |    4 
 SourceCode/Bond/EAPSimulator/EAPSimulatorDlg.h   |    2 
 SourceCode/Bond/Servo/HsmsPassive.cpp            |  238 ++++++++++++++++++++++++++++++++-------
 SourceCode/Bond/EAPSimulator/EAPSimulator.rc     |    0 
 SourceCode/Bond/Servo/Model.cpp                  |    3 
 SourceCode/Bond/Servo/HsmsAction.cpp             |    2 
 12 files changed, 256 insertions(+), 48 deletions(-)

diff --git a/SourceCode/Bond/EAPSimulator/CHsmsActive.cpp b/SourceCode/Bond/EAPSimulator/CHsmsActive.cpp
index 6d74a5c..96ed8dd 100644
--- a/SourceCode/Bond/EAPSimulator/CHsmsActive.cpp
+++ b/SourceCode/Bond/EAPSimulator/CHsmsActive.cpp
@@ -67,7 +67,7 @@
 		LOGI("onRecvDataMessage(%s).", pMessage->toString());
 
 		if (nStream == 5 && pHeader->function == 1) {
-			// S1F1
+			// S5F1
 			replyAck(5, 2, pMessage->getHeader()->systemBytes, 0, _T("ACK0"));
 		}
 	};
@@ -266,6 +266,29 @@
 	return 0;
 }
 
+int CHsmsActive::hsmsTransmitSpooledData()
+{
+	IMessage* pMessage = nullptr;
+	int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 23, ++m_nSystemByte);
+	pMessage->getBody()->setU1(0, "RSDC");
+	m_pActive->sendMessage(pMessage);
+	HSMS_Destroy1Message(pMessage);
+
+	return 0;
+}
+
+int CHsmsActive::hsmsPurgeSpooledData()
+{
+	IMessage* pMessage = nullptr;
+	int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 23, ++m_nSystemByte);
+
+	pMessage->getBody()->setU1(1, "RSDC");
+	m_pActive->sendMessage(pMessage);
+	HSMS_Destroy1Message(pMessage);
+
+	return 0;
+}
+
 int CHsmsActive::replyAck0(IMessage* pMessage)
 {
 	return 0;
diff --git a/SourceCode/Bond/EAPSimulator/CHsmsActive.h b/SourceCode/Bond/EAPSimulator/CHsmsActive.h
index e171c75..7a93948 100644
--- a/SourceCode/Bond/EAPSimulator/CHsmsActive.h
+++ b/SourceCode/Bond/EAPSimulator/CHsmsActive.h
@@ -57,6 +57,10 @@
 	// Configure Spooling
 	int hsmsConfigureSpooling(std::map<unsigned int, std::set<unsigned int>>& spoolingConfig);
 
+	// 发送或清空缓存的消息
+	int hsmsTransmitSpooledData();
+	int hsmsPurgeSpooledData();
+
 	// 通过的reply函数
 	void replyAck(int s, int f, unsigned int systemBytes, BYTE ack, const char* pszAckName);
 
diff --git a/SourceCode/Bond/EAPSimulator/EAPSimulator.rc b/SourceCode/Bond/EAPSimulator/EAPSimulator.rc
index e90e25a..b126259 100644
--- a/SourceCode/Bond/EAPSimulator/EAPSimulator.rc
+++ b/SourceCode/Bond/EAPSimulator/EAPSimulator.rc
Binary files differ
diff --git a/SourceCode/Bond/EAPSimulator/EAPSimulatorDlg.cpp b/SourceCode/Bond/EAPSimulator/EAPSimulatorDlg.cpp
index 430a1ae..c3c4fb7 100644
--- a/SourceCode/Bond/EAPSimulator/EAPSimulatorDlg.cpp
+++ b/SourceCode/Bond/EAPSimulator/EAPSimulatorDlg.cpp
@@ -85,6 +85,8 @@
 	ON_BN_CLICKED(IDC_BUTTON_DEFINE_REPORT, &CEAPSimulatorDlg::OnBnClickedButtonDefineReport)
 	ON_BN_CLICKED(IDC_BUTTON_LINE_REPORT, &CEAPSimulatorDlg::OnBnClickedButtonLineReport)
 	ON_BN_CLICKED(IDC_BUTTON_CONFIGURE_SPOOLING, &CEAPSimulatorDlg::OnBnClickedButtonConfigureSpooling)
+	ON_BN_CLICKED(IDC_BUTTON_TRANSMIT_SPOOLED_DATA, &CEAPSimulatorDlg::OnBnClickedButtonTransmitSpooledData)
+	ON_BN_CLICKED(IDC_BUTTON_PURGE_SPOOLED_DATA, &CEAPSimulatorDlg::OnBnClickedButtonPurgeSpooledData)
 END_MESSAGE_MAP()
 
 
@@ -269,6 +271,8 @@
 	GetDlgItem(IDC_BUTTON_DEFINE_REPORT)->EnableWindow(enabled);
 	GetDlgItem(IDC_BUTTON_LINE_REPORT)->EnableWindow(enabled);	
 	GetDlgItem(IDC_BUTTON_CONFIGURE_SPOOLING)->EnableWindow(enabled);	
+	GetDlgItem(IDC_BUTTON_TRANSMIT_SPOOLED_DATA)->EnableWindow(enabled);
+	GetDlgItem(IDC_BUTTON_PURGE_SPOOLED_DATA)->EnableWindow(enabled);
 }
 
 void CEAPSimulatorDlg::OnBnClickedButtonConnect()
@@ -355,3 +359,13 @@
 	spoolingConfig[5].insert(66);
 	theApp.m_model.m_pHsmsActive->hsmsConfigureSpooling(spoolingConfig);
 }
+
+void CEAPSimulatorDlg::OnBnClickedButtonTransmitSpooledData()
+{
+	theApp.m_model.m_pHsmsActive->hsmsTransmitSpooledData();
+}
+
+void CEAPSimulatorDlg::OnBnClickedButtonPurgeSpooledData()
+{
+	theApp.m_model.m_pHsmsActive->hsmsPurgeSpooledData();
+}
diff --git a/SourceCode/Bond/EAPSimulator/EAPSimulatorDlg.h b/SourceCode/Bond/EAPSimulator/EAPSimulatorDlg.h
index dd2de49..adc1a71 100644
--- a/SourceCode/Bond/EAPSimulator/EAPSimulatorDlg.h
+++ b/SourceCode/Bond/EAPSimulator/EAPSimulatorDlg.h
@@ -54,4 +54,6 @@
 	afx_msg void OnBnClickedButtonDefineReport();
 	afx_msg void OnBnClickedButtonLineReport();
 	afx_msg void OnBnClickedButtonConfigureSpooling();
+	afx_msg void OnBnClickedButtonTransmitSpooledData();
+	afx_msg void OnBnClickedButtonPurgeSpooledData();
 };
diff --git a/SourceCode/Bond/EAPSimulator/Resource.h b/SourceCode/Bond/EAPSimulator/Resource.h
index fda0a5c..f8b9864 100644
--- a/SourceCode/Bond/EAPSimulator/Resource.h
+++ b/SourceCode/Bond/EAPSimulator/Resource.h
@@ -32,7 +32,9 @@
 #define IDC_BUTTON_LINE_REPORT2         1012
 #define IDC_BUTTON_CONFIGURE_SPOOLING   1012
 #define IDC_RADIO_DISABLE               1013
+#define IDC_BUTTON_TRANSMIT_SPOOLED_DATA 1013
 #define IDC_EDIT_CEID                   1014
+#define IDC_BUTTON_PURGE_SPOOLED_DATA   1014
 #define IDC_LIST1                       1015
 #define IDC_EDIT_CE_NAME                1015
 #define IDC_LIST2                       1016
diff --git a/SourceCode/Bond/HSMSSDK/Include/ISECS2Item.h b/SourceCode/Bond/HSMSSDK/Include/ISECS2Item.h
index ba3f21d..b3bfa28 100644
--- a/SourceCode/Bond/HSMSSDK/Include/ISECS2Item.h
+++ b/SourceCode/Bond/HSMSSDK/Include/ISECS2Item.h
@@ -69,5 +69,6 @@
 	virtual ISECS2Item* addU1Item(unsigned char value, const char* pszNote) = 0;
 	virtual void setBinary(const char* pszData, unsigned int len, const char* pszNote) = 0;
 	virtual void setString(const char* pszText, const char* pszNote) = 0;
+	virtual void setU1(unsigned char value, const char* pszNote) = 0;
 	virtual ISECS2Item* addItem() = 0;
 };
diff --git a/SourceCode/Bond/Servo/CPageGraph2.cpp b/SourceCode/Bond/Servo/CPageGraph2.cpp
index a248cf4..cb4d449 100644
--- a/SourceCode/Bond/Servo/CPageGraph2.cpp
+++ b/SourceCode/Bond/Servo/CPageGraph2.cpp
@@ -284,7 +284,10 @@
 			}
 			*/
 
-			theApp.m_model.m_hsmsPassive.requestAlarmReport(1, 2, "abc");
+			static int i = 0;
+			i++;
+			static char* pszText[] = {"123", "456", "789", "abc", "def"};
+			theApp.m_model.m_hsmsPassive.requestAlarmReport(i%3, i, pszText[i%5]);
 		}
 
 
diff --git a/SourceCode/Bond/Servo/HsmsAction.cpp b/SourceCode/Bond/Servo/HsmsAction.cpp
index 0792df5..1c0d71c 100644
--- a/SourceCode/Bond/Servo/HsmsAction.cpp
+++ b/SourceCode/Bond/Servo/HsmsAction.cpp
@@ -104,7 +104,7 @@
 BOOL CHsmsAction::incrementAndCheckTimeout()
 {
 	unsigned int nResponseTime = InterlockedIncrement(&m_nResponseTime);
-	return nResponseTime >= m_nTimeout;
+	return nResponseTime >= m_nTimeout + 1;
 }
 
 int CHsmsAction::serialize(char* pszBuffer, int nBufferSize)
diff --git a/SourceCode/Bond/Servo/HsmsPassive.cpp b/SourceCode/Bond/Servo/HsmsPassive.cpp
index 902f236..d3534c3 100644
--- a/SourceCode/Bond/Servo/HsmsPassive.cpp
+++ b/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;
diff --git a/SourceCode/Bond/Servo/HsmsPassive.h b/SourceCode/Bond/Servo/HsmsPassive.h
index 84644a5..3fa3b73 100644
--- a/SourceCode/Bond/Servo/HsmsPassive.h
+++ b/SourceCode/Bond/Servo/HsmsPassive.h
@@ -142,7 +142,11 @@
 	void OnTimer(UINT nTimerid);
 	void setActionTimeout(int nSecond);
 	int init(CModel* pModel, const char* pszName, unsigned int port);
+	int loadCacheFromFile(const char* pszFilepath);
+	int saveCache();
 	int term();
+	int serialize(char* pszBuffer, int nBufferSize);
+	int unserialize(const char* pszBuffer, int nBufferSize);
 
 public:
 	/* request开头的函数为主动发送数据的函数 */
@@ -167,6 +171,7 @@
 	int replyCommand(IMessage* pRecv);
 	int replyConfigureSpooling(IMessage* pRecv);
 	int replyEanbleDisableAlarmReport(IMessage* pRecv);
+	int replyPurgeSpooledData(IMessage* pRecv);
 	int replyQueryPPIDList(IMessage* pRecv);
 	int replyTerminalDisplay(IMessage* pRecv);
 
@@ -189,6 +194,7 @@
 	CRITICAL_SECTION m_criticalSection;
 	std::list<CHsmsAction*> m_listAction;
 	std::list<CHsmsAction*> m_listActionSent;
+	std::list<CHsmsAction*> m_listActionSpooling;
 
 private:
 	SECSListener m_listener;
@@ -196,6 +202,8 @@
 	HANDLE m_hCimWorkEvent;
 	HANDLE m_hCimWorkThreadHandle;
 	unsigned m_nCimWorkThrdaddr;
+	std::string m_strCacheFilepath;
+	CHsmsAction* m_pActiveAction;
 
 private:
 	// CVariable vector
diff --git a/SourceCode/Bond/Servo/Model.cpp b/SourceCode/Bond/Servo/Model.cpp
index 3427f45..ace0bd4 100644
--- a/SourceCode/Bond/Servo/Model.cpp
+++ b/SourceCode/Bond/Servo/Model.cpp
@@ -148,6 +148,8 @@
 	m_hsmsPassive.loadReports((LPTSTR)(LPCTSTR)strVarialbleFile);
 	strVarialbleFile.Format(_T("%s\\CollectionEventList.txt"), (LPTSTR)(LPCTSTR)m_strWorkDir);
 	m_hsmsPassive.loadCollectionEvents((LPTSTR)(LPCTSTR)strVarialbleFile);
+	strVarialbleFile.Format(_T("%s\\HsmsPassive.cache"), (LPTSTR)(LPCTSTR)m_strWorkDir);
+	m_hsmsPassive.loadCacheFromFile(strVarialbleFile);
 
 
 	SERVO::MasterListener masterListener;
@@ -337,6 +339,7 @@
 
 int CModel::term()
 {
+	m_hsmsPassive.saveCache();
 	m_hsmsPassive.term();
 	CLog::GetLog()->SetOnLogCallback(nullptr);
 	m_master.term();

--
Gitblit v1.9.3