From 6e0341c6356cdb6e527fbd89d1dc876f4e47ce46 Mon Sep 17 00:00:00 2001
From: chenluhua1980 <Chenluhua@qq.com>
Date: 星期五, 09 一月 2026 20:37:50 +0800
Subject: [PATCH] 1.Trace Data,ProcessData, SVData等上报

---
 SourceCode/Bond/Servo/HsmsPassive.cpp |  224 +++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 205 insertions(+), 19 deletions(-)

diff --git a/SourceCode/Bond/Servo/HsmsPassive.cpp b/SourceCode/Bond/Servo/HsmsPassive.cpp
index 6208112..d35b5b8 100644
--- a/SourceCode/Bond/Servo/HsmsPassive.cpp
+++ b/SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -20,6 +20,19 @@
 const char* ACK0 = &ACK[0];
 const char* ACK1 = &ACK[1];
 
+// Log SECS-II message briefly to avoid huge strings causing issues.
+static void LogSecsMessageBrief(const char* tag, IMessage* pMessage, size_t maxLen = 1024)
+{
+	if (pMessage == nullptr) return;
+	const char* msgStr = pMessage->toString();
+	if (msgStr == nullptr) return;
+	std::string buf(msgStr);
+	if (buf.size() > maxLen) {
+		buf = buf.substr(0, maxLen) + "...<truncated>";
+	}
+	LOGI("%s%s", tag, buf.c_str());
+}
+
 unsigned __stdcall CimWorkThreadFunction(LPVOID lpParam)
 {
 	CHsmsPassive* pPassive = (CHsmsPassive*)lpParam;
@@ -525,26 +538,37 @@
 
 void CHsmsPassive::setVariableValue(const char* pszName, __int64 value)
 {
-	auto v = getVariable(pszName);
-	if (v != nullptr) {
+	// Protect variable list updates; multiple threads may set SVs.
+	Lock();
+	if (auto v = getVariable(pszName)) {
 		v->setValue(value);
 	}
+	Unlock();
 }
 
 void CHsmsPassive::setVariableValue(const char* pszName, const char* value)
 {
-	auto v = getVariable(pszName);
-	if (v != nullptr) {
+	Lock();
+	if (auto v = getVariable(pszName)) {
 		v->setValue(value);
 	}
+	Unlock();
 }
 
 void CHsmsPassive::setVariableValue(const char* pszName, std::vector<SERVO::CVariable>& vars)
 {
-	auto v = getVariable(pszName);
-	if (v != nullptr) {
+	Lock();
+	if (auto v = getVariable(pszName)) {
 		v->setValue(vars);
 	}
+	Unlock();
+}
+
+void CHsmsPassive::withVariableLock(const std::function<void()>& fn)
+{
+	Lock();
+	if (fn) fn();
+	Unlock();
 }
 
 static bool isValidFormat(const std::string& fmt)
@@ -1287,13 +1311,19 @@
 		HEADER* pHeader = pMessage->getHeader();
 		int nStream = (pHeader->stream & 0x7F);
 
-		LOGI("<HSMS>[Received]%s", pMessage->toString());
+		LogSecsMessageBrief("<HSMS>[Received]", pMessage);
 		if (nStream == 1 && pHeader->function == 1) {
 			// S1F1
 			replyAreYouThere(pMessage);
 		}
 		else if (nStream == 1 && pHeader->function == 3) {
 			replySelectedEquipmentStatusData(pMessage);
+		}
+		else if (nStream == 1 && pHeader->function == 11) {
+			replyStatusVariableNamelistRequest(pMessage);
+		}
+		else if (nStream == 1 && pHeader->function == 23) {
+			replyCollectionEventNamelistRequest(pMessage);
 		}
 		else if (nStream == 1 && pHeader->function == 13) {
 			replyEstablishCommunications(pMessage);
@@ -1621,7 +1651,7 @@
 				ASSERT(pMessage);
 				m_pPassive->sendMessage(pMessage);
 				LOGI("<HSMS>[SEND]SysByte=%u sessionId:%d", pMessage->getHeader()->systemBytes, pMessage->getHeader()->sessionId);
-				LOGI("<HSMS>[SEND]%s", pMessage->toString());
+				LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
 
 				int nRet = WaitForSingleObject(pAction->getEvent(), pAction->getTimeout() * 1000);
 				if (nRet == WAIT_TIMEOUT) {
@@ -1647,7 +1677,7 @@
 				ASSERT(pMessage);
 				m_pPassive->sendMessage(pMessage);
 				LOGI("<HSMS>[SEND]SysByte=%u sessionId:%d", pMessage->getHeader()->systemBytes, pMessage->getHeader()->sessionId);
-				LOGI("<HSMS>[SEND]%s", pMessage->toString());
+				LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
 
 			}
 		}
@@ -1671,7 +1701,7 @@
 	m_pPassive->sendMessage(pMessage);
 	LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
 		pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
-	LOGI("<HSMS>[SEND]%s", pMessage->toString());
+	LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
 	HSMS_Destroy1Message(pMessage);
 }
 
@@ -1714,7 +1744,7 @@
 	m_pPassive->sendMessage(pMessage);
 	LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
 		pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
-	LOGI("<HSMS>[SEND]%s", pMessage->toString());
+	LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
 	HSMS_Destroy1Message(pMessage);
 
 	return 0;
@@ -1777,7 +1807,7 @@
 	m_pPassive->sendMessage(pMessage);
 	LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
 		pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
-	LOGI("<HSMS>[SEND]%s", pMessage->toString());
+	LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
 	HSMS_Destroy1Message(pMessage);
 
 	return 0;
@@ -1824,12 +1854,168 @@
 	m_pPassive->sendMessage(pMessage);
 	LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
 		pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
-	LOGI("<HSMS>[SEND]%s", pMessage->toString());
+	LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
 	HSMS_Destroy1Message(pMessage);
 
 
 
 	return 0;
+}
+
+// S1F11
+int CHsmsPassive::replyStatusVariableNamelistRequest(IMessage* pRecv)
+{
+	if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
+		return ER_NOTSELECT;
+	}
+
+	std::vector<unsigned short> reqIds;
+	ISECS2Item* pBody = pRecv->getBody();
+	if (pBody != nullptr && pBody->getType() == SITYPE::L) {
+		const int sz = pBody->getSubItemSize();
+		for (int i = 0; i < sz; ++i) {
+			unsigned short id = 0;
+			if (pBody->getSubItemU2(i, id)) {
+				reqIds.push_back(id);
+			}
+		}
+	}
+
+	// Build response list items: {L:3 SVID, SVNAME, UNITS}
+	std::vector<unsigned short> svids;
+	std::set<unsigned short> requested(reqIds.begin(), reqIds.end());
+	Lock();
+	if (reqIds.empty()) {
+		for (auto v : m_variabels) {
+			svids.push_back(static_cast<unsigned short>(v->getVarialbleId()));
+		}
+	}
+	else {
+		// include requested IDs (existing + unknown marker)
+		for (auto id : requested) {
+			svids.push_back(id);
+		}
+	}
+	Unlock();
+
+	IMessage* pMessage = NULL;
+	HSMS_Create1Message(pMessage, m_nSessionId, 1, 12, pRecv->getHeader()->systemBytes);
+	ASSERT(pMessage);
+
+	ISECS2Item* pList = pMessage->getBody(); // Body is L[n] of {SVID, SVNAME, UNITS}
+	for (auto id : svids) {
+		ISECS2Item* pEntry = pList->addItem();
+		pEntry->addU2Item(id, "SVID");
+		SERVO::CVariable* v = getVariable((int)id);
+		if (v != nullptr) {
+			pEntry->addItem(v->getName().c_str(), "SVNAME");
+			// Use remark as UNITS if provided; empty string if none.
+			pEntry->addItem(v->getRemark().c_str(), "UNITS");
+		}
+		else {
+			// Unknown SVID: A:0 for name/units
+			pEntry->addItem("", "SVNAME");
+			pEntry->addItem("", "UNITS");
+		}
+	}
+
+	m_pPassive->sendMessage(pMessage);
+	LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
+		pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
+	LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
+	HSMS_Destroy1Message(pMessage);
+
+	return ER_NOERROR;
+}
+
+// S1F23
+int CHsmsPassive::replyCollectionEventNamelistRequest(IMessage* pRecv)
+{
+	if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
+		return ER_NOTSELECT;
+	}
+
+	std::vector<unsigned short> reqIds;
+	ISECS2Item* pBody = pRecv->getBody();
+	if (pBody != nullptr && pBody->getType() == SITYPE::L) {
+		const int sz = pBody->getSubItemSize();
+		for (int i = 0; i < sz; ++i) {
+			unsigned short id = 0;
+			if (pBody->getSubItemU2(i, id)) {
+				reqIds.push_back(id);
+			}
+		}
+	}
+
+	struct CEInfo {
+		unsigned short id{ 0 };
+		std::string name;
+		std::vector<unsigned short> vids;
+	};
+	std::vector<CEInfo> ceInfos;
+	{
+		Lock();
+		if (reqIds.empty()) {
+			for (auto e : m_collectionEvents) {
+				if (e == nullptr) continue;
+				CEInfo info;
+				info.id = static_cast<unsigned short>(e->getEventId());
+				info.name = e->getName();
+				std::set<unsigned short> vidSet;
+				for (auto rpt : e->getReports()) {
+					if (rpt == nullptr) continue;
+					for (auto vid : rpt->getVids()) {
+						vidSet.insert(static_cast<unsigned short>(vid));
+					}
+				}
+				info.vids.assign(vidSet.begin(), vidSet.end());
+				ceInfos.push_back(std::move(info));
+			}
+		}
+		else {
+			for (auto id : reqIds) {
+				CEInfo info;
+				info.id = id;
+				SERVO::CCollectionEvent* e = getEvent(id);
+				if (e != nullptr) {
+					info.name = e->getName();
+					std::set<unsigned short> vidSet;
+					for (auto rpt : e->getReports()) {
+						if (rpt == nullptr) continue;
+						for (auto vid : rpt->getVids()) {
+							vidSet.insert(static_cast<unsigned short>(vid));
+						}
+					}
+					info.vids.assign(vidSet.begin(), vidSet.end());
+				}
+				ceInfos.push_back(std::move(info));
+			}
+		}
+		Unlock();
+	}
+
+	IMessage* pMessage = NULL;
+	HSMS_Create1Message(pMessage, m_nSessionId, 1, 24, pRecv->getHeader()->systemBytes);
+	ASSERT(pMessage);
+
+	ISECS2Item* pList = pMessage->getBody(); // Body is L[n] of {CEID, CENAME, L[VIDs]}
+	for (const auto& info : ceInfos) {
+		ISECS2Item* pEntry = pList->addItem();
+		pEntry->addU2Item(info.id, "CEID");
+		pEntry->addItem(info.name.c_str(), "CENAME"); // empty if unknown
+		ISECS2Item* pVidList = pEntry->addItem();
+		for (auto vid : info.vids) {
+			pVidList->addU2Item(vid, "VID");
+		}
+	}
+
+	m_pPassive->sendMessage(pMessage);
+	LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
+		pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
+	LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
+	HSMS_Destroy1Message(pMessage);
+
+	return ER_NOERROR;
 }
 
 // S2F13
@@ -1875,7 +2061,7 @@
 	m_pPassive->sendMessage(pMessage);
 	LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
 		pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
-	LOGI("<HSMS>[SEND]%s", pMessage->toString());
+	LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
 	HSMS_Destroy1Message(pMessage);
 
 	return 0;
@@ -2276,7 +2462,7 @@
 	m_pPassive->sendMessage(pMessage);
 	LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
 		pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
-	LOGI("<HSMS>[SEND]%s", pMessage->toString());
+	LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
 	HSMS_Destroy1Message(pMessage);
 	
 	return 0;
@@ -2381,7 +2567,7 @@
 	m_pPassive->sendMessage(pMessage);
 	LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
 		pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
-	LOGI("<HSMS>[SEND]%s", pMessage->toString());
+	LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
 	HSMS_Destroy1Message(pMessage);
 
 	return 0;
@@ -2554,7 +2740,7 @@
 	m_pPassive->sendMessage(pReply);
 	LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
 		pReply->getHeader()->sessionId, pReply->getHeader()->sType, pReply->getHeader()->systemBytes);
-	LOGI("<HSMS>[SEND]%s", pReply->toString());
+	LogSecsMessageBrief("<HSMS>[SEND]", pReply);
 	HSMS_Destroy1Message(pReply);
 
 
@@ -2584,7 +2770,7 @@
 		m_pPassive->sendMessage(pMessage);
 		LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
 			pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
-		LOGI("<HSMS>[SEND]%s", pMessage->toString());
+		LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
 		HSMS_Destroy1Message(pMessage);
 		return 0;
 	}
@@ -2671,7 +2857,7 @@
 	m_pPassive->sendMessage(pMessage);
 	LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
 		pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
-	LOGI("<HSMS>[SEND]%s", pMessage->toString());
+	LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
 	HSMS_Destroy1Message(pMessage);
 
 

--
Gitblit v1.9.3