From 5edb485d226790306097e40ea954efb2ed90dd21 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期一, 11 八月 2025 16:05:09 +0800
Subject: [PATCH] 1.EAP:查询CJSpace和PJSpace功能模拟,Master对EAP查询机器变量的回复;
---
SourceCode/Bond/Servo/HsmsPassive.cpp | 615 ++++++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 507 insertions(+), 108 deletions(-)
diff --git a/SourceCode/Bond/Servo/HsmsPassive.cpp b/SourceCode/Bond/Servo/HsmsPassive.cpp
index 20334e8..1a18950 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) {
@@ -98,61 +103,61 @@
}
-void CHsmsPassive::addReport(unsigned int id, const char* pszName)
+void CHsmsPassive::addVariableValueToItem(ISECS2Item* pParent, SERVO::CVariable* pVariable)
{
- Lock();
- REPORT report;
- report.id = id;
- strcpy_s(report.szName, REPORT_NAME_MAX, pszName);
- m_mapReport[id] = report;
- Unlock();
+ 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 RPTID, unsigned int CEID)
+void CHsmsPassive::linkEventReport(unsigned int CEID, unsigned int RPTID)
{
- m_mapReportIdToCEID[RPTID] = CEID;
+ SERVO::CCollectionEvent* pEvent = getEvent(CEID);
+ SERVO::CReport* pReport = getReport(RPTID);
+ if (pEvent != nullptr) {
+ pEvent->setReport(pReport);
+ }
}
void CHsmsPassive::unlinkEventReport(unsigned int CEID)
{
- for (auto it = m_mapReportIdToCEID.begin(); it != m_mapReportIdToCEID.end(); ) {
- if (it->second == CEID) {
- m_mapReportIdToCEID.erase(it++); // 鏇存柊杩唬鍣�
- }
- else {
- ++it;
- }
- }
-
-}
-
-unsigned int CHsmsPassive::getCEID(int RPTID)
-{
- auto iter = m_mapReportIdToCEID.find(RPTID);
- if (iter != m_mapReportIdToCEID.end()) return iter->second;
- return 0;
-}
-
-void CHsmsPassive::deleteReport(unsigned int RPTID)
-{
- for (auto it = m_mapValueIdToPRTID.begin(); it != m_mapValueIdToPRTID.end(); ) {
- if (it->second == RPTID) {
- m_mapValueIdToPRTID.erase(it++); // 鏇存柊杩唬鍣�
- }
- else {
- ++it;
- }
+ SERVO::CCollectionEvent* pEvent = getEvent(CEID);
+ if (pEvent != nullptr) {
+ pEvent->setReport(nullptr);
}
}
-void CHsmsPassive::deleteAllReport()
+SERVO::CReport* CHsmsPassive::defineReport(unsigned int RPTID, std::vector<unsigned int>& vids)
{
- m_mapValueIdToPRTID.clear();
-}
+ // 娣诲姞瀹氫箟report
+ SERVO::CReport* pReport = new SERVO::CReport(RPTID, vids);
+ for (auto vid : vids) {
+ SERVO::CVariable* pVariable = getVariable(vid);
+ if (pVariable != nullptr) {
+ pReport->addVariable(pVariable);
+ }
+ }
+ m_reports.push_back(pReport);
-void CHsmsPassive::defineReport(unsigned int VID, unsigned int RPTID)
-{
- m_mapValueIdToPRTID[VID] = RPTID;
+ return pReport;
}
void CHsmsPassive::OnTimer(UINT nTimerid)
@@ -176,11 +181,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;
}
@@ -263,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)
@@ -335,6 +380,19 @@
return nullptr;
}
+bool CHsmsPassive::removeReport(int rptid)
+{
+ for (auto iter = m_reports.begin(); iter != m_reports.end(); ++iter) {
+ if ((*iter)->getReportId() == rptid) {
+ delete (*iter);
+ m_reports.erase(iter);
+ return true;
+ }
+ }
+
+ return false;
+}
+
void CHsmsPassive::clearAllReport()
{
for (auto item : m_reports) {
@@ -393,7 +451,7 @@
if (!events.empty()) {
clearAllCollectionEvent();
for (auto item : events) {
- m_collectionEvent.push_back(item);
+ m_collectionEvents.push_back(item);
}
}
@@ -404,15 +462,26 @@
std::vector<SERVO::CCollectionEvent*>& CHsmsPassive::getCollectionEvents()
{
- return m_collectionEvent;
+ return m_collectionEvents;
}
void CHsmsPassive::clearAllCollectionEvent()
{
- for (auto item : m_collectionEvent) {
+ for (auto item : m_collectionEvents) {
delete item;
}
- m_collectionEvent.clear();
+ m_collectionEvents.clear();
+}
+
+SERVO::CCollectionEvent* CHsmsPassive::getEvent(unsigned short CEID)
+{
+ for (auto item : m_collectionEvents) {
+ if (item->getEventId() == CEID) {
+ return item;
+ }
+ }
+
+ return nullptr;
}
std::vector<unsigned int> CHsmsPassive::parseVidList(CString& strNums)
@@ -461,17 +530,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 {
@@ -491,6 +560,9 @@
if (nStream == 1 && pHeader->function == 1) {
// S1F1
replyAreYouThere(pMessage);
+ }
+ else if (nStream == 1 && pHeader->function == 3) {
+ replySelectedEquipmentStatusData(pMessage);
}
else if (nStream == 1 && pHeader->function == 13) {
replyEstablishCommunications(pMessage);
@@ -522,8 +594,17 @@
else if (nStream == 2 && pHeader->function == 41) {
replyCommand(pMessage);
}
+ 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);
+ }
+ else if (nStream == 6 && pHeader->function == 23) {
+ replyPurgeSpooledData(pMessage);
}
else if (nStream == 7 && pHeader->function == 19) {
replyQueryPPIDList(pMessage);
@@ -552,6 +633,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()
{
// 缁撴潫绾跨▼
@@ -575,6 +692,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) {
@@ -593,17 +757,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");
@@ -614,18 +787,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");
@@ -666,6 +843,7 @@
SetEvent(m_hCimWorkEvent);
Unlock();
+
return ER_NOERROR;
}
@@ -729,6 +907,7 @@
return 0;
}
+// S1F13
int CHsmsPassive::replyEstablishCommunications(IMessage* pRecv)
{
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
@@ -747,6 +926,45 @@
m_pPassive->sendMessage(pMessage);
LOGI("<HSMS>[SECS Msg SEND]%s", pMessage->toString());
HSMS_Destroy1Message(pMessage);
+
+ 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;
}
@@ -889,40 +1107,47 @@
ISECS2Item* pBody = pRecv->getBody();
ISECS2Item* defineItem, *rptListItem, * vidListItem;
unsigned int dataId, rptid, vid;
+
if (!pBody->getSubItemU4(0, dataId)) goto MYREPLY;
rptListItem = pBody->getSubItem(1);
if (rptListItem == nullptr) goto MYREPLY;
if (rptListItem->getSubItemSize() == 0) {
- deleteAllReport();
+ clearAllReport();
goto MYREPLY;
}
+
for (int i = 0; i < rptListItem->getSubItemSize(); i++) {
defineItem = rptListItem->getSubItem(i);
if (defineItem == nullptr) continue;
+
+ std::vector<unsigned int> vids;
+ SERVO::CReport* pReport = nullptr;
vidListItem = defineItem->getSubItem(1);
if (defineItem->getSubItemU4(0, rptid)
&& vidListItem != nullptr) {
- int vidCount = vidListItem->getSubItemSize();
- if (vidCount == 0) {
- deleteReport(rptid);
- }
- else {
- for (int k = 0; k < vidCount; k++) {
- if (vidListItem->getSubItemU4(k, vid)) {
- defineReport(vid, rptid);
- }
+ for (int k = 0; k < vidListItem->getSubItemSize(); k++) {
+ if (vidListItem->getSubItemU4(k, vid)) {
+ vids.push_back(vid);
}
+ }
+ }
+
+ removeReport(rptid);
+ if (!vids.empty()) {
+ pReport = defineReport(rptid, vids);
+ }
+
+ // 妫�楠岀粨鏋滄槸鍚︽纭�
+ if (pReport != nullptr) {
+ auto variables = pReport->getVariables();
+ for (auto item : variables) {
+ LOGE("=== prtid:%d, vid:%d", rptid, item->getVarialbleId());
}
}
}
MYREPLY:
- // 妫�楠岀粨鏋滄槸鍚︽纭�
- for (auto item : m_mapValueIdToPRTID) {
- LOGE("=== vid:%d, prtid:%d", item.first, item.second);
- }
-
replyAck(2, 34, pRecv->getHeader()->systemBytes, BYTE(0), "DRACK");
return 0;
}
@@ -954,7 +1179,7 @@
else {
for (int k = 0; k < prtCount; k++) {
if (rptListItem->getSubItemU4(k, rptid)) {
- linkEventReport(rptid, ceid);
+ linkEventReport(ceid, rptid);
}
}
}
@@ -963,10 +1188,10 @@
// 妫�楠岀粨鏋滄槸鍚︽纭�
- for (auto item : m_mapReportIdToCEID) {
- LOGE("=== prtid:%d, ceid:%d", item.first, item.second);
+ for (auto item : m_collectionEvents) {
+ LOGE("=== ceid:%d, prtid:%d", item->getEventId(), item->getFirstPortID());
}
-
+
MYREPLY:
replyAck(2, 36, pRecv->getHeader()->systemBytes, BYTE(0), "LRACK");
return 0;
@@ -1061,6 +1286,102 @@
return 0;
}
+// S2F43
+int CHsmsPassive::replyConfigureSpooling(IMessage* pRecv)
+{
+ if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
+ return ER_NOTSELECT;
+ }
+ ISECS2Item* pBody = pRecv->getBody();
+ if (pBody == nullptr || pBody->getType() != SITYPE::L) ER_PARAM_ERROR;
+
+ // 娓呯┖鎵�鏈�
+ if (pBody->getSubItemSize() == 0) {
+ m_spoolingConfig.clear();
+ goto MYREPLY;
+ }
+
+ // 渚濇閰嶇疆Stream
+ for (int i = 0; i < pBody->getSubItemSize(); i++) {
+ ISECS2Item* pStreamItem = pBody->getSubItem(i);
+ ASSERT(pStreamItem);
+ unsigned char STRID, FCNID;
+ pStreamItem->getSubItemU1(0, STRID);
+ ISECS2Item* pFcnItemList = pStreamItem->getSubItem(1);
+ if (pFcnItemList->getSubItemSize() == 0) {
+ m_spoolingConfig[STRID].clear();
+ }
+ else {
+ for (int j = 0; j < pFcnItemList->getSubItemSize(); j++) {
+ pFcnItemList->getSubItemU1(j, FCNID);
+ m_spoolingConfig[STRID].insert(FCNID);
+ }
+ }
+ }
+
+ // 鎵撳嵃楠岃瘉缁撴灉
+ for (auto s : m_spoolingConfig) {
+ LOGI("====> stream:%d", s.first);
+ for (auto f : s.second) {
+ LOGI("function:%d", f);
+ }
+ }
+MYREPLY:
+ replyAck(2, 42, pRecv->getHeader()->systemBytes, BYTE(0), "ERACK");
+ 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)
{
@@ -1094,25 +1415,67 @@
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)
{
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);
@@ -1154,16 +1517,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);
@@ -1172,43 +1531,83 @@
pItem->addU4Item(ALID, "ALID");
pItem->addItem(ALTX, "ALTX");
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;
}
// S6F11
-int CHsmsPassive::requestEventReportSend(unsigned int DATAID, unsigned int RPTID, const std::vector<std::string>& values)
+static unsigned int DATAID = 1;
+int CHsmsPassive::requestEventReportSend(unsigned int CEID)
{
- if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
- return ER_NOTSELECT;
+ SERVO::CCollectionEvent* pEvent = getEvent(CEID);
+ if (pEvent == nullptr) {
+ return ER_NO_EVENT;
}
+
+ SERVO::CReport* pReport = pEvent->getFirstReport();
+ if (pReport == nullptr) {
+ return ER_UNLINK_EVENT_REPORT;
+ }
+
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);
ISECS2Item* pItem = pMessage->getBody();
- pItem->addU4Item(DATAID, "DATAID");
- pItem->addU4Item(getCEID(RPTID), "CEID");
+ pItem->addU4Item(++DATAID, "DATAID");
+ pItem->addU4Item(CEID, "CEID");
ISECS2Item* pItemList1 = pItem->addItem();
ISECS2Item* pItemList2 = pItemList1->addItem();
- pItemList2->addU4Item(RPTID, "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);
-
- 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;
}
+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");
+}
+
+
--
Gitblit v1.9.3