| | |
| | | #include <set> |
| | | #include <regex> |
| | | |
| | | // ControlState values (keep in sync with Model::ControlState / VariableList.txt) |
| | | static constexpr uint8_t kControlStateOnlineRemote = 5; |
| | | |
| | | |
| | | const char ACK[2] = {0, 1}; |
| | | const char* ACK0 = &ACK[0]; |
| | |
| | | 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(); |
| | |
| | | } |
| | | } |
| | | |
| | | 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; |
| | | } |
| | |
| | | return nullptr; |
| | | } |
| | | |
| | | int CHsmsPassive::getCurrentControlState() |
| | | { |
| | | auto v = getVariable("CurrentControlState"); |
| | | if (v != nullptr) { |
| | | return static_cast<int>(v->getIntValue()); |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | bool CHsmsPassive::isHostCommandAllowed() |
| | | { |
| | | // Only allow host control commands in OnlineRemote. |
| | | return getCurrentControlState() == kControlStateOnlineRemote; |
| | | } |
| | | |
| | | void CHsmsPassive::clearAllVariabel() |
| | | { |
| | | for (auto item : m_variabels) { |
| | |
| | | |
| | | 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) |
| | |
| | | |
| | | 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); |
| | | } |
| | | |
| | |
| | | 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) |
| | |
| | | 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; |
| | | } |
| | |
| | | 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; |
| | |
| | | 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() |
| | |
| | | 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()) { |
| | |
| | | |
| | | 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) { |
| | |
| | | |
| | | 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()); |
| | | |
| | | } |
| | | } |
| | |
| | | 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; |
| | |
| | | goto MYREPLY; |
| | | } |
| | | if (!pBody->getSubItemU2(0, SVID)) { |
| | | pMessage->getBody()->addU1Item(SVU1, "SV"); |
| | | goto MYREPLY; |
| | | // also accept I2 or U4 to be tolerant with host implementations |
| | | if (!pBody->getSubItemI2(0, (short&)SVID)) { |
| | | unsigned int svidU4 = 0; |
| | | if (!pBody->getSubItemU4(0, svidU4)) { |
| | | pMessage->getBody()->addU1Item(SVU1, "SV"); |
| | | goto MYREPLY; |
| | | } |
| | | SVID = static_cast<unsigned short>(svidU4); |
| | | } |
| | | } |
| | | |
| | | SERVO::CVariable* pVariable = getVariable((int)SVID); |
| | |
| | | rptListItem = pBody->getSubItem(1); |
| | | if (rptListItem == nullptr) goto MYREPLY; |
| | | if (rptListItem->getSubItemSize() == 0) { |
| | | clearAllReport(); |
| | | clearAllReport(TRUE); |
| | | goto MYREPLY; |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | removeReport(rptid); |
| | | if (!vids.empty()) { |
| | | if (vids.empty()) { |
| | | deleteReport(rptid); |
| | | } else { |
| | | removeReport(rptid); |
| | | pReport = defineReport(rptid, vids); |
| | | } |
| | | |
| | |
| | | |
| | | // 清空所有 |
| | | 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++) { |
| | |
| | | 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; |
| | | } |
| | | |
| | |
| | | CAACK = 5; |
| | | ERRCODE = CAACK_5; |
| | | strError = "Not supported"; |
| | | goto MYREPLY; |
| | | } |
| | | |
| | | if (!isHostCommandAllowed()) { |
| | | CAACK = CAACK_5; |
| | | ERRCODE = CAACK_5; |
| | | strError = "rejected - ControlState not OnlineRemote"; |
| | | goto MYREPLY; |
| | | } |
| | | |
| | |
| | | |
| | | // 丢弃 |
| | | if (RSDC == 1) { |
| | | LOGI("<CHsmsPassive>Purge Spooled Data."); |
| | | Lock(); |
| | | for (auto item : m_listActionSpooling) { |
| | | delete item; |
| | |
| | | Unlock(); |
| | | } |
| | | else { |
| | | LOGI("<CHsmsPassive>Request Spooled Data."); |
| | | Lock(); |
| | | for (auto item : m_listActionSpooling) { |
| | | m_listAction.push_back(item); |
| | |
| | | ISECS2Item* pReplyItemAcks = pReply->getBody()->addItem(); |
| | | ISECS2Item* pReplyItemAck = pReplyItemAcks->addU1Item(0, "OBJACK"); |
| | | ISECS2Item* pReplyItemErrs = pReplyItemAcks->addItem(); |
| | | |
| | | if (!isHostCommandAllowed()) { |
| | | ISECS2Item* pItemError = pReplyItemErrs->addItem(); |
| | | pItemError->addU4Item(2001, "ERRCODE"); |
| | | pItemError->addItem("rejected - ControlState not OnlineRemote", "ERRTEXT"); |
| | | goto MYREPLY; |
| | | } |
| | | |
| | | // 当前只处理类各为ControlJob |
| | | if (_strcmpi(pszObjType, "ControlJob") == 0) { |
| | |
| | | ISECS2Item* pBody = pRecv->getBody(); |
| | | if (pBody == nullptr || pBody->getType() != SITYPE::L) ER_PARAM_ERROR; |
| | | |
| | | if (!isHostCommandAllowed()) { |
| | | IMessage* pMessage = NULL; |
| | | HSMS_Create1Message(pMessage, m_nSessionId, 16, 16, ++m_nSystemByte); |
| | | ASSERT(pMessage); |
| | | ISECS2Item* pItemPrjobIds = pMessage->getBody()->addItem(); |
| | | ISECS2Item* pItemErrors = pMessage->getBody()->addItem(); |
| | | pItemErrors->addBoolItem(false, "ACKA"); |
| | | ISECS2Item* pItemErrors2 = pItemErrors->addItem(); |
| | | auto err = pItemErrors2->addItem(); |
| | | err->addU4Item(2001, "ERRCODE"); |
| | | err->addItem("rejected - ControlState not OnlineRemote", "ERRTEXT"); |
| | | 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()); |
| | | HSMS_Destroy1Message(pMessage); |
| | | return 0; |
| | | } |
| | | |
| | | |
| | | // 解释数据,得到CProcessJob |
| | | ISECS2Item* pItemPjs, * pItemPj,* pItemCarriers, * pItemCarrier, *pItemSlots, *pItemRecipes; |
| | |
| | | pjs.push_back(pj); |
| | | } |
| | | |
| | | ASSERT(m_listener.onPRJobMultiCreate != nullptr); |
| | | int nRet = m_listener.onPRJobMultiCreate(this, pjs); |
| | | |
| | | |
| | | // 回复报文 |
| | | IMessage* pMessage = NULL; |
| | |
| | | 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; |
| | |
| | | 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); |
| | |
| | | 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(); |
| | |
| | | } |
| | | 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); |