From 2be286ac19bf2bb00e27f556e8b2cc292a58bd09 Mon Sep 17 00:00:00 2001
From: chenluhua1980 <Chenluhua@qq.com>
Date: 星期四, 08 一月 2026 18:48:59 +0800
Subject: [PATCH] 1.EAP状态继续实现,已在左侧加入相关按钮
---
SourceCode/Bond/Servo/HsmsPassive.cpp | 261 +++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 226 insertions(+), 35 deletions(-)
diff --git a/SourceCode/Bond/Servo/HsmsPassive.cpp b/SourceCode/Bond/Servo/HsmsPassive.cpp
index e8986ca..93ddb4b 100644
--- a/SourceCode/Bond/Servo/HsmsPassive.cpp
+++ b/SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -110,23 +110,35 @@
ASSERT(pParent);
ASSERT(pVariable);
+ std::string svNote("SV");
+ {
+ SERVO::CVariable* pDef = getVariable((int)pVariable->getVarialbleId());
+ if (pDef == nullptr) {
+ pDef = pVariable;
+ }
+ auto& name = pDef->getName();
+ if (!name.empty()) {
+ svNote += " -> ";
+ svNote += name;
+ }
+ }
ISECS2Item* pItemList;
SERVO::SVFromat format = pVariable->getFormat();
switch (format)
{
case SERVO::SVFromat::U1:
- pParent->addU1Item((unsigned char)pVariable->getIntValue(), "SV");
+ pParent->addU1Item((unsigned char)pVariable->getIntValue(), svNote.c_str());
break;
case SERVO::SVFromat::U2:
- pParent->addU2Item((unsigned char)pVariable->getIntValue(), "SV");
+ pParent->addU2Item((unsigned char)pVariable->getIntValue(), svNote.c_str());
break;
case SERVO::SVFromat::I2:
- pParent->addI2Item((unsigned char)pVariable->getIntValue(), "SV");
+ pParent->addI2Item((unsigned char)pVariable->getIntValue(), svNote.c_str());
break;
case SERVO::SVFromat::A20:
case SERVO::SVFromat::A50:
- pParent->addItem(pVariable->getValue().c_str(), "SV");
+ pParent->addItem(pVariable->getValue().c_str(), svNote.c_str());
break;
case SERVO::SVFromat::L:
pItemList = pParent->addItem();
@@ -161,17 +173,39 @@
}
}
+bool CHsmsPassive::shouldSpool(uint8_t streamId, uint8_t functionId) const
+{
+ // Comment: stream 1 is not spooled
+ if (streamId == 1) return false;
+
+ // Comment: m=0 turns off all streams and fns
+ if (!m_spoolingEnabled) return false;
+
+ // Blacklist semantics: in map => do NOT spool/cache.
+ // Not in map => allow spooling by default.
+ auto it = m_spoolBlacklistByStream.find(streamId);
+ if (it == m_spoolBlacklistByStream.end()) return true;
+
+ // Empty set => all functions in this stream
+ if (it->second.empty()) return true;
+
+ return it->second.find(functionId) == it->second.end();
+}
+
SERVO::CReport* CHsmsPassive::defineReport(unsigned int RPTID, std::vector<unsigned int>& vids)
{
+ LOGI("<CHsmsPassive>defineReport enter");
// 娣诲姞瀹氫箟report
SERVO::CReport* pReport = new SERVO::CReport(RPTID, vids);
for (auto vid : vids) {
SERVO::CVariable* pVariable = getVariable(vid);
if (pVariable != nullptr) {
pReport->addVariable(pVariable);
+ LOGI("<CHsmsPassive>defineReport RPTID=%d", RPTID);
}
}
m_reports.push_back(pReport);
+ writeReportsToFile(m_strReportFilepath);
return pReport;
}
@@ -773,9 +807,12 @@
int CHsmsPassive::deleteReport(int rptid)
{
+ LOGI("<CHsmsPassive>deleteReport enter");
if (!removeReport(rptid)) {
return -1;
}
+ LOGI("<CHsmsPassive>delete Report. rptid=%d", rptid);
+
return writeReportsToFile(m_strReportFilepath);
}
@@ -814,12 +851,16 @@
return -1;
}
-void CHsmsPassive::clearAllReport()
+void CHsmsPassive::clearAllReport(BOOL bSave/* = FALSE*/)
{
+ LOGI("<CHsmsPassive>clearAllReport enter");
for (auto item : m_reports) {
delete item;
}
m_reports.clear();
+
+ if(bSave)
+ writeReportsToFile(m_strReportFilepath);
}
int CHsmsPassive::writeReportsToFile(const std::string& filepath)
@@ -1373,11 +1414,27 @@
int CHsmsPassive::serialize(char* pszBuffer, int nBufferSize)
{
int index = 0;
+ const auto calcSpoolCfgSize = [&]() -> int {
+ // magic(4) + ver(2) + enabled(1) + mapSize(4) + entries...
+ int sz = 0;
+ sz += 4; // 'SPOL'
+ sz += 2; // version
+ sz += 1; // enabled
+ sz += 4; // map size
+ for (const auto& kv : m_spoolBlacklistByStream) {
+ sz += 2; // streamId (U16)
+ sz += 4; // fn count (U32)
+ sz += static_cast<int>(kv.second.size()) * 2; // fn ids (U16 each)
+ }
+ return sz;
+ };
if (pszBuffer == nullptr) {
index += sizeof(int);
for (auto item : m_listActionSpooling) {
index += item->serialize(pszBuffer, nBufferSize);
}
+
+ index += calcSpoolCfgSize();
return index;
}
@@ -1392,6 +1449,33 @@
nRet = item->serialize(&pszBuffer[index], nBufferSize);
if (nRet <= 0) break;
index += nRet;
+ }
+
+ // Append spooling config (backward compatible via magic+version)
+ auto writeU32 = [&](uint32_t v) {
+ memcpy(&pszBuffer[index], &v, sizeof(v));
+ index += sizeof(v);
+ };
+ auto writeU16 = [&](uint16_t v) {
+ memcpy(&pszBuffer[index], &v, sizeof(v));
+ index += sizeof(v);
+ };
+ auto writeU8 = [&](uint8_t v) {
+ memcpy(&pszBuffer[index], &v, sizeof(v));
+ index += sizeof(v);
+ };
+
+ const uint32_t magic = 0x4C4F5053; // 'SPOL' little-endian
+ writeU32(magic);
+ writeU16(1); // version
+ writeU8(m_spoolingEnabled ? 1 : 0);
+ writeU32(static_cast<uint32_t>(m_spoolBlacklistByStream.size()));
+ for (const auto& kv : m_spoolBlacklistByStream) {
+ writeU16(static_cast<uint16_t>(kv.first));
+ writeU32(static_cast<uint32_t>(kv.second.size()));
+ for (const auto& fn : kv.second) {
+ writeU16(static_cast<uint16_t>(fn));
+ }
}
return index;
@@ -1414,7 +1498,53 @@
m_listActionSpooling.push_back(pAction);
}
- return index + nRet;
+ // Parse optional spooling config tail (magic+version). If absent, keep defaults.
+ const auto remaining = nBufferSize - index;
+ if (remaining >= 4) {
+ uint32_t magic = 0;
+ memcpy(&magic, &pszBuffer[index], sizeof(magic));
+ if (magic == 0x4C4F5053) { // 'SPOL'
+ index += 4;
+ if (nBufferSize - index >= 2 + 1 + 4) {
+ uint16_t ver = 0;
+ memcpy(&ver, &pszBuffer[index], sizeof(ver));
+ index += 2;
+ if (ver >= 1) {
+ uint8_t enabled = 1;
+ memcpy(&enabled, &pszBuffer[index], sizeof(enabled));
+ index += 1;
+ m_spoolingEnabled = (enabled != 0);
+
+ uint32_t mapSize = 0;
+ memcpy(&mapSize, &pszBuffer[index], sizeof(mapSize));
+ index += 4;
+
+ m_spoolBlacklistByStream.clear();
+ for (uint32_t mi = 0; mi < mapSize; ++mi) {
+ if (nBufferSize - index < 2 + 4) break;
+ uint16_t streamId = 0;
+ memcpy(&streamId, &pszBuffer[index], sizeof(streamId));
+ index += 2;
+ uint32_t fnCount = 0;
+ memcpy(&fnCount, &pszBuffer[index], sizeof(fnCount));
+ index += 4;
+
+ auto& setRef = m_spoolBlacklistByStream[streamId];
+ setRef.clear();
+ for (uint32_t fi = 0; fi < fnCount; ++fi) {
+ if (nBufferSize - index < 2) break;
+ uint16_t fn = 0;
+ memcpy(&fn, &pszBuffer[index], sizeof(fn));
+ index += 2;
+ setRef.insert(fn);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return index;
}
unsigned CHsmsPassive::OnCimWork()
@@ -1433,15 +1563,34 @@
Unlock();
while (!list.empty()) {
+ CHsmsAction* pAction = nullptr;
Lock();
- CHsmsAction* pAction = list.front();
- if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
- m_listActionSpooling.push_back(pAction);
- Unlock();
- continue;
- }
+ pAction = list.front();
Unlock();
list.pop_front();
+
+ Lock();
+ const bool selected = (m_pPassive != NULL && STATE::SELECTED == m_pPassive->getState());
+ Unlock();
+ if (!selected) {
+ IMessage* pMsg = pAction->getSendMessage();
+ uint8_t streamId = 0;
+ uint8_t functionId = 0;
+ if (pMsg && pMsg->getHeader()) {
+ streamId = static_cast<uint8_t>(pMsg->getHeader()->stream & 0x7F);
+ functionId = static_cast<uint8_t>(pMsg->getHeader()->function & 0xFF);
+ }
+ if (shouldSpool(streamId, functionId)) {
+ Lock();
+ m_listActionSpooling.push_back(pAction);
+ Unlock();
+ }
+ else {
+ LOGI("<HSMS>spooling disabled for S%dF%d, drop action", (int)streamId, (int)functionId);
+ delete pAction;
+ }
+ continue;
+ }
TRACE("OnCimWork 004.\n");
if (pAction->isNeedWaitReply()) {
@@ -1453,7 +1602,8 @@
ASSERT(pMessage);
m_pPassive->sendMessage(pMessage);
- LOGI("<HSMS> [SEND] SysByte=%u sessionId:%d", pMessage->getHeader()->systemBytes, pMessage->getHeader()->sessionId);
+ LOGI("<HSMS>[SEND]SysByte=%u sessionId:%d", pMessage->getHeader()->systemBytes, pMessage->getHeader()->sessionId);
+ LOGI("<HSMS>[SEND]%s", pMessage->toString());
int nRet = WaitForSingleObject(pAction->getEvent(), pAction->getTimeout() * 1000);
if (nRet == WAIT_TIMEOUT) {
@@ -1478,7 +1628,8 @@
ASSERT(pMessage);
m_pPassive->sendMessage(pMessage);
- LOGI("<HSMS> [SEND] SysByte=%u sessionId:%d", pMessage->getHeader()->systemBytes, pMessage->getHeader()->sessionId);
+ LOGI("<HSMS>[SEND]SysByte=%u sessionId:%d", pMessage->getHeader()->systemBytes, pMessage->getHeader()->sessionId);
+ LOGI("<HSMS>[SEND]%s", pMessage->toString());
}
}
@@ -1543,7 +1694,9 @@
pItem->addItem(m_strEquipmentModelType.c_str(), "MDLN");
pItem->addItem(m_strSoftRev.c_str(), "SOFTREV");
m_pPassive->sendMessage(pMessage);
- LOGI("<HSMS>[SECS Msg SEND] %s", pMessage->toString());
+ LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
+ pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
+ LOGI("<HSMS>[SEND]%s", pMessage->toString());
HSMS_Destroy1Message(pMessage);
return 0;
@@ -1631,8 +1784,10 @@
goto MYREPLY;
}
if (!pBody->getSubItemU2(0, SVID)) {
- pMessage->getBody()->addU1Item(SVU1, "SV");
- goto MYREPLY;
+ if (!pBody->getSubItemI2(0, (short&)SVID)) {
+ pMessage->getBody()->addU1Item(SVU1, "SV");
+ goto MYREPLY;
+ }
}
SERVO::CVariable* pVariable = getVariable((int)SVID);
@@ -1800,7 +1955,7 @@
rptListItem = pBody->getSubItem(1);
if (rptListItem == nullptr) goto MYREPLY;
if (rptListItem->getSubItemSize() == 0) {
- clearAllReport();
+ clearAllReport(TRUE);
goto MYREPLY;
}
@@ -1820,8 +1975,10 @@
}
}
- removeReport(rptid);
- if (!vids.empty()) {
+ if (vids.empty()) {
+ deleteReport(rptid);
+ } else {
+ removeReport(rptid);
pReport = defineReport(rptid, vids);
}
@@ -1997,9 +2154,12 @@
// 娓呯┖鎵�鏈�
if (pBody->getSubItemSize() == 0) {
- m_spoolingConfig.clear();
+ LOGI("<CHsmsPassive>turns off all streams and fns");
+ m_spoolBlacklistByStream.clear();
+ m_spoolingEnabled = false;
goto MYREPLY;
}
+ m_spoolingEnabled = true;
// 渚濇閰嶇疆Stream
for (int i = 0; i < pBody->getSubItemSize(); i++) {
@@ -2008,26 +2168,34 @@
unsigned char STRID, FCNID;
pStreamItem->getSubItemU1(0, STRID);
ISECS2Item* pFcnItemList = pStreamItem->getSubItem(1);
- if (pFcnItemList->getSubItemSize() == 0) {
- m_spoolingConfig[STRID].clear();
+ if (pFcnItemList == nullptr || pFcnItemList->getSubItemSize() == 0) {
+ // No functions listed => blacklist the whole stream
+ m_spoolBlacklistByStream[STRID].clear();
}
else {
+ // Update blacklist for this stream
+ m_spoolBlacklistByStream[STRID].clear();
for (int j = 0; j < pFcnItemList->getSubItemSize(); j++) {
pFcnItemList->getSubItemU1(j, FCNID);
- m_spoolingConfig[STRID].insert(FCNID);
+ m_spoolBlacklistByStream[STRID].insert(FCNID);
}
}
}
// 鎵撳嵃楠岃瘉缁撴灉
- for (auto s : m_spoolingConfig) {
- LOGI("====> stream:%d", s.first);
- for (auto f : s.second) {
- LOGI("function:%d", f);
+ for (auto s : m_spoolBlacklistByStream) {
+ LOGI("====> spool blacklist stream:%d", s.first);
+ if (s.second.empty()) {
+ LOGI("blacklist all functions");
+ }
+ else {
+ for (auto f : s.second) {
+ LOGI("blacklist function:%d", f);
+ }
}
}
MYREPLY:
- replyAck(2, 42, pRecv->getHeader()->systemBytes, BYTE(0), "ERACK");
+ replyAck(2, 44, pRecv->getHeader()->systemBytes, BYTE(0), "ERACK");
return 0;
}
@@ -2138,6 +2306,7 @@
// 涓㈠純
if (RSDC == 1) {
+ LOGI("<CHsmsPassive>Purge Spooled Data.");
Lock();
for (auto item : m_listActionSpooling) {
delete item;
@@ -2146,6 +2315,7 @@
Unlock();
}
else {
+ LOGI("<CHsmsPassive>Request Spooled Data.");
Lock();
for (auto item : m_listActionSpooling) {
m_listAction.push_back(item);
@@ -2415,9 +2585,6 @@
pjs.push_back(pj);
}
- ASSERT(m_listener.onPRJobMultiCreate != nullptr);
- int nRet = m_listener.onPRJobMultiCreate(this, pjs);
-
// 鍥炲鎶ユ枃
IMessage* pMessage = NULL;
@@ -2452,6 +2619,10 @@
HSMS_Destroy1Message(pMessage);
+ ASSERT(m_listener.onPRJobMultiCreate != nullptr);
+ int nRet = m_listener.onPRJobMultiCreate(this, pjs);
+
+
// 閲婃斁鏈夐棶棰�(鏈坊鍔犲埌master)鐨勫唴瀛�
for (auto p : pjs) {
if(!p->issues().empty()) delete p;
@@ -2479,7 +2650,13 @@
pItem->addItem(ALTX, "ALTX");
pAction->setSendMessage(pMessage);
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
- m_listActionSpooling.push_back(pAction);
+ if (shouldSpool(5, 1)) {
+ m_listActionSpooling.push_back(pAction);
+ }
+ else {
+ LOGI("<HSMS>spooling disabled for S5F1, drop alarm report");
+ delete pAction;
+ }
}
else {
m_listAction.push_back(pAction);
@@ -2510,7 +2687,15 @@
ISECS2Item* pItem = pMessage->getBody();
// pItem->addU2Item(++DATAID, "DATAID"); // 鏍规嵁鍒殑鏃ュ織鏄剧ずDATAID鎭掍负0锛屾墍浠ユ垜浠厛鐓т娇鐢�0
pItem->addU2Item(0, "DATAID");
- pItem->addU4Item(CEID, "CEID");
+ std::string ceidNote("CEID");
+ if (pEvent != nullptr) {
+ auto& name = pEvent->getName();
+ if (!name.empty()) {
+ ceidNote += " -> ";
+ ceidNote += name;
+ }
+ }
+ pItem->addU4Item(CEID, ceidNote.c_str());
ISECS2Item* pItemList1 = pItem->addItem(); // L[n] reports
if (pReport != nullptr) {
ISECS2Item* pItemList2 = pItemList1->addItem();
@@ -2524,7 +2709,13 @@
}
pAction->setSendMessage(pMessage);
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
- m_listActionSpooling.push_back(pAction);
+ if (shouldSpool(6, 11)) {
+ m_listActionSpooling.push_back(pAction);
+ }
+ else {
+ LOGI("<HSMS>spooling disabled for S6F11, drop event report (CEID=%u)", CEID);
+ delete pAction;
+ }
}
else {
m_listAction.push_back(pAction);
--
Gitblit v1.9.3