| | |
| | | |
| | | void CHsmsPassive::unlinkEventReport(unsigned int CEID) |
| | | { |
| | | LOGI("<CHsmsPassive>unlinkEventReport enter"); |
| | | SERVO::CCollectionEvent* pEvent = getEvent(CEID); |
| | | if (pEvent != nullptr) { |
| | | pEvent->setReport(nullptr); |
| | | LOGI("<CHsmsPassive>unlink Event Report.CEID=%d", CEID); |
| | | } |
| | | } |
| | | |
| | | 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; |
| | | } |
| | |
| | | |
| | | int CHsmsPassive::onRecvMsg(IMessage* pMessage) |
| | | { |
| | | LOGI("onRecvMsg:%s", pMessage->toString()); |
| | | // LOGI("onRecvMsg:%s", pMessage->toString()); |
| | | Lock(); |
| | | if (m_pActiveAction != nullptr && |
| | | (m_pActiveAction->getSendMessage()->getHeader()->systemBytes == pMessage->getHeader()->systemBytes)) { |
| | |
| | | |
| | | 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::loadCollectionEvents(const char* pszFilepath) |
| | | { |
| | | m_strCollectionEventFilepath = pszFilepath; |
| | | m_bCollectionUtf8 = false; |
| | | m_bCollectionUtf8Bom = false; |
| | | CFile file; |
| | | if (!file.Open(pszFilepath, CFile::modeRead | CFile::shareDenyNone)) { |
| | | return -1; |
| | |
| | | // UTF-8 BOM |
| | | if (nLen >= 3 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) { |
| | | offset = 3; |
| | | m_bCollectionUtf8 = true; |
| | | m_bCollectionUtf8Bom = true; |
| | | } |
| | | |
| | | // UTF-16 LE BOM |
| | |
| | | MultiByteToWideChar(CP_UTF8, 0, buffer.data() + off, |
| | | static_cast<int>(buffer.size() - off), temp.data(), need); |
| | | content = temp.c_str(); |
| | | m_bCollectionUtf8 = true; |
| | | return true; |
| | | }; |
| | | |
| | |
| | | return -1; |
| | | } |
| | | |
| | | std::wregex pattern(L"^\\d+,[^,]*,[^,]*,\\(\\d+(,\\d+)*\\).*"); // 匹配以数字+逗号开头的字符串 |
| | | // 允许 Attached RPTID 为空:() |
| | | std::wregex pattern(L"^\\d+,[^,]*,[^,]*,\\(\\d*(,\\d+)*\\).*"); // 匹配以数字+逗号开头的字符串 |
| | | std::vector<SERVO::CCollectionEvent*> events; |
| | | int index, last; |
| | | CStringW strLine, strRPTIDs; |
| | |
| | | return m_collectionEvents; |
| | | } |
| | | |
| | | unsigned int CHsmsPassive::getMaxCollectionEventId() const |
| | | { |
| | | unsigned int maxId = 0; |
| | | for (auto item : m_collectionEvents) { |
| | | if (item && item->getEventId() > maxId) { |
| | | maxId = item->getEventId(); |
| | | } |
| | | } |
| | | return maxId; |
| | | } |
| | | |
| | | int CHsmsPassive::deleteCollectionEvent(unsigned short CEID) |
| | | { |
| | | for (auto iter = m_collectionEvents.begin(); iter != m_collectionEvents.end(); ++iter) { |
| | | if ((*iter)->getEventId() == CEID) { |
| | | delete (*iter); |
| | | m_collectionEvents.erase(iter); |
| | | return writeCollectionEventsToFile(m_strCollectionEventFilepath); |
| | | } |
| | | } |
| | | return -1; |
| | | } |
| | | |
| | | int CHsmsPassive::addCollectionEvent(unsigned int CEID, const char* name, const char* desc, const std::vector<unsigned int>& rptids) |
| | | { |
| | | if (getEvent((unsigned short)CEID) != nullptr) { |
| | | return -1; |
| | | } |
| | | auto* pEvent = new SERVO::CCollectionEvent(CEID, name, desc, const_cast<std::vector<unsigned int>&>(rptids)); |
| | | for (auto rptid : rptids) { |
| | | SERVO::CReport* pReport = getReport((int)rptid); |
| | | if (pReport != nullptr) { |
| | | pEvent->addReport(pReport); |
| | | } |
| | | } |
| | | m_collectionEvents.push_back(pEvent); |
| | | return writeCollectionEventsToFile(m_strCollectionEventFilepath); |
| | | } |
| | | |
| | | int CHsmsPassive::updateCollectionEvent(unsigned int CEID, const char* name, const char* desc, const std::vector<unsigned int>& rptids) |
| | | { |
| | | for (auto iter = m_collectionEvents.begin(); iter != m_collectionEvents.end(); ++iter) { |
| | | if ((*iter)->getEventId() == CEID) { |
| | | delete (*iter); |
| | | auto* pEvent = new SERVO::CCollectionEvent(CEID, name, desc, const_cast<std::vector<unsigned int>&>(rptids)); |
| | | for (auto rptid : rptids) { |
| | | SERVO::CReport* pReport = getReport((int)rptid); |
| | | if (pReport != nullptr) { |
| | | pEvent->addReport(pReport); |
| | | } |
| | | } |
| | | *iter = pEvent; |
| | | return writeCollectionEventsToFile(m_strCollectionEventFilepath); |
| | | } |
| | | } |
| | | return -1; |
| | | } |
| | | |
| | | void CHsmsPassive::clearAllCollectionEvent() |
| | | { |
| | | for (auto item : m_collectionEvents) { |
| | |
| | | return result; |
| | | } |
| | | |
| | | int CHsmsPassive::writeCollectionEventsToFile(const std::string& filepath) |
| | | { |
| | | if (filepath.empty()) return -1; |
| | | |
| | | CFile file; |
| | | if (!file.Open(filepath.c_str(), CFile::modeCreate | CFile::modeWrite)) { |
| | | return -1; |
| | | } |
| | | |
| | | if (m_bCollectionUtf8 && m_bCollectionUtf8Bom) { |
| | | const BYTE bom[3] = { 0xEF, 0xBB, 0xBF }; |
| | | file.Write(bom, 3); |
| | | } |
| | | |
| | | const std::string headerAnsi = "CEID,CE Name,Descriptions,Attached RPTID\r\n"; |
| | | if (m_bCollectionUtf8) { |
| | | CStringA header = AnsiToUtf8(headerAnsi); |
| | | file.Write(header.GetString(), header.GetLength()); |
| | | } |
| | | else { |
| | | file.Write(headerAnsi.data(), (UINT)headerAnsi.size()); |
| | | } |
| | | |
| | | for (auto ev : m_collectionEvents) { |
| | | if (ev == nullptr) continue; |
| | | std::string line; |
| | | line.reserve(128); |
| | | line += std::to_string(ev->getEventId()); |
| | | line.push_back(','); |
| | | line += ev->getName(); |
| | | line.push_back(','); |
| | | line += ev->getDescription(); |
| | | line.push_back(','); |
| | | line.push_back('('); |
| | | auto rptIds = ev->getReportIds(); |
| | | for (size_t i = 0; i < rptIds.size(); ++i) { |
| | | line += std::to_string(rptIds[i]); |
| | | if (i + 1 < rptIds.size()) { |
| | | line.push_back(','); |
| | | } |
| | | } |
| | | line += ")\r\n"; |
| | | |
| | | if (m_bCollectionUtf8) { |
| | | CStringA out = AnsiToUtf8(line); |
| | | file.Write(out.GetString(), out.GetLength()); |
| | | } |
| | | else { |
| | | file.Write(line.data(), (UINT)line.size()); |
| | | } |
| | | } |
| | | |
| | | file.Close(); |
| | | return 0; |
| | | } |
| | | |
| | | int CHsmsPassive::init(CModel* pModel, const char* pszName, unsigned int port) |
| | | { |
| | | m_pModel = pModel; |
| | |
| | | */ |
| | | }; |
| | | auto onRecvSysMessage = [&](void* pFrom, IMessage* pMessage) -> void { |
| | | LOGI("<HSMS>onRecvSysMessage:sessionId:%d, sType:%d systemBytes:%d", |
| | | LOGI("<HSMS>[Received]sessionId:%d, sType:%d systemBytes:%d", |
| | | pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes); |
| | | onRecvMsg(pMessage); |
| | | if (MSG_LINKTEST_REQ == pMessage->getHeader()->sType) { |
| | |
| | | HEADER* pHeader = pMessage->getHeader(); |
| | | int nStream = (pHeader->stream & 0x7F); |
| | | |
| | | LOGI("<HSMS>收到消息 S%dF%d", nStream, pHeader->function); |
| | | LOGI("<HSMS>[Received]%s", pMessage->toString()); |
| | | if (nStream == 1 && pHeader->function == 1) { |
| | | // S1F1 |
| | | replyAreYouThere(pMessage); |
| | |
| | | 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()) { |
| | |
| | | ISECS2Item* pItem = pMessage->getBody(); |
| | | pItem->setBinary((const char*)&ack, 1, pszAckName); |
| | | m_pPassive->sendMessage(pMessage); |
| | | LOGI("<HSMS>[SECS Msg SEND]S%dF%d (SysByte=%u)", s, f, systemBytes); |
| | | 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); |
| | | } |
| | | |
| | |
| | | pItem->addItem(m_strEquipmentModelType.c_str(), "MDLN"); |
| | | pItem->addItem(m_strSoftRev.c_str(), "SOFTREV"); |
| | | m_pPassive->sendMessage(pMessage); |
| | | LOGI("<HSMS>[SECS Msg SEND]S1F2 (SysByte=%u)", pMessage->getHeader()->systemBytes); |
| | | 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; |
| | |
| | | pList->addItem(m_strEquipmentModelType.c_str(), "MDLN"); |
| | | pList->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; |
| | |
| | | ASSERT(pMessage); |
| | | |
| | | unsigned char SVU1 = 0; |
| | | unsigned int SVID = 0; |
| | | unsigned short 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)) { |
| | | if (!pBody->getSubItemU2(0, SVID)) { |
| | | pMessage->getBody()->addU1Item(SVU1, "SV"); |
| | | goto MYREPLY; |
| | | } |
| | | |
| | | SERVO::CVariable* pVariable = getVariable(SVID); |
| | | SERVO::CVariable* pVariable = getVariable((int)SVID); |
| | | if (pVariable == nullptr) { |
| | | pMessage->getBody()->addU1Item(SVU1, "SV"); |
| | | goto MYREPLY; |
| | |
| | | |
| | | MYREPLY: |
| | | 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); |
| | | |
| | | |
| | |
| | | } |
| | | |
| | | m_pPassive->sendMessage(pMessage); |
| | | LOGI("<HSMS>[SECS Msg SEND]S2F14 (SysByte=%u)", pMessage->getHeader()->systemBytes); |
| | | 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; |
| | |
| | | |
| | | ISECS2Item* pBody = pRecv->getBody(); |
| | | ISECS2Item* defineItem, *rptListItem, * vidListItem; |
| | | unsigned int dataId, rptid, vid; |
| | | unsigned short dataId; |
| | | unsigned int rptid, vid; |
| | | |
| | | if (!pBody->getSubItemU4(0, dataId)) goto MYREPLY; |
| | | if (!pBody->getSubItemU2(0, dataId)) goto MYREPLY; |
| | | 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); |
| | | } |
| | | |
| | |
| | | |
| | | ISECS2Item* pBody = pRecv->getBody(); |
| | | ISECS2Item* linkItem, *ceidListItem, *rptListItem; |
| | | unsigned int dataId, ceid, rptid; |
| | | if (!pBody->getSubItemU4(0, dataId)) goto MYREPLY; |
| | | unsigned short dataId; |
| | | unsigned int ceid, rptid; |
| | | bool bChanged = false; |
| | | if (!pBody->getSubItemU2(0, dataId)) goto MYREPLY; |
| | | ceidListItem = pBody->getSubItem(1); |
| | | if (ceidListItem == nullptr) goto MYREPLY; |
| | | for (int i = 0; i < ceidListItem->getSubItemSize(); i++) { |
| | |
| | | int prtCount = rptListItem->getSubItemSize(); |
| | | if (prtCount == 0) { |
| | | unlinkEventReport(ceid); |
| | | bChanged = true; |
| | | } |
| | | else { |
| | | for (int k = 0; k < prtCount; k++) { |
| | | if (rptListItem->getSubItemU4(k, rptid)) { |
| | | linkEventReport(ceid, rptid); |
| | | bChanged = true; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 持久化到 CollectionEventList.txt(便于下次启动仍保持 Link/Unlink 结果) |
| | | if (bChanged && !m_strCollectionEventFilepath.empty()) { |
| | | writeCollectionEventsToFile(m_strCollectionEventFilepath); |
| | | } |
| | | |
| | | // 检验结果是否正确 |
| | | for (auto item : m_collectionEvents) { |
| | | LOGE("=== ceid:%d, prtid:%d", item->getEventId(), item->getFirstPortID()); |
| | | unsigned int reportId = item->getFirstReportID(); |
| | | if(reportId != 0) |
| | | LOGI("=== ceid:%d, prtid:%d", item->getEventId(), reportId); |
| | | else |
| | | LOGI("=== ceid:%d, prtid:--", item->getEventId()); |
| | | } |
| | | |
| | | MYREPLY: |
| | |
| | | |
| | | // 清空所有 |
| | | 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; |
| | | } |
| | | |
| | |
| | | ISECS2Item* pBody = pRecv->getBody(); |
| | | if (pBody == nullptr || pBody->getType() != SITYPE::L) ER_PARAM_ERROR; |
| | | |
| | | unsigned int DATAID; |
| | | unsigned short DATAID; |
| | | unsigned char PTN; |
| | | const char* pszCarrierAction, *pszCarrierId; |
| | | pBody->getSubItemU4(0, DATAID); |
| | | pBody->getSubItemU2(0, DATAID); |
| | | pBody->getSubItemString(1, pszCarrierAction); |
| | | pBody->getSubItemString(2, pszCarrierId); |
| | | pBody->getSubItemU1(3, PTN); |
| | |
| | | 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); |
| | | 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; |
| | |
| | | |
| | | // 丢弃 |
| | | 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); |
| | |
| | | } |
| | | |
| | | m_pPassive->sendMessage(pMessage); |
| | | LOGI("<HSMS>[SECS Msg SEND]S7F20 (SysByte=%u)", pMessage->getHeader()->systemBytes); |
| | | 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; |
| | |
| | | MYREPLY: |
| | | pReplyItemAck->setU1(bCreateOk ? 0 : 1, "OBJACK"); |
| | | m_pPassive->sendMessage(pReply); |
| | | LOGI("<HSMS>[SECS Msg SEND]S14F10 (SysByte=%u)", pReply->getHeader()->systemBytes); |
| | | LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d", |
| | | pReply->getHeader()->sessionId, pReply->getHeader()->sType, pReply->getHeader()->systemBytes); |
| | | LOGI("<HSMS>[SEND]%s", pReply->toString()); |
| | | HSMS_Destroy1Message(pReply); |
| | | |
| | | |
| | |
| | | |
| | | // 解释数据,得到CProcessJob |
| | | ISECS2Item* pItemPjs, * pItemPj,* pItemCarriers, * pItemCarrier, *pItemSlots, *pItemRecipes; |
| | | unsigned int DATAID; |
| | | unsigned short DATAID; |
| | | const char* pszPrjobid, *pszMF, *pszCarrierId, *pszRecipeName; |
| | | std::string strCarrierId; |
| | | unsigned int len; |
| | |
| | | std::vector<unsigned char> slots; |
| | | std::vector<SERVO::CProcessJob*> pjs; |
| | | |
| | | if (!pBody->getSubItemU4(0, DATAID)) return ER_PARAM_ERROR; |
| | | if (!pBody->getSubItemU2(0, DATAID)) return ER_PARAM_ERROR; |
| | | pItemPjs = pBody->getSubItem(1); |
| | | if (pItemPjs == nullptr) return ER_PARAM_ERROR; |
| | | for (int i = 0; i < pItemPjs->getSubItemSize(); i++) { |
| | |
| | | } |
| | | } |
| | | m_pPassive->sendMessage(pMessage); |
| | | LOGI("<HSMS>[SECS Msg SEND]S16F16 (SysByte=%u)", pMessage->getHeader()->systemBytes); |
| | | 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); |
| | | |
| | | |
| | |
| | | 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); |
| | |
| | | } |
| | | |
| | | // S6F11 |
| | | static unsigned int DATAID = 1; |
| | | static unsigned short DATAID = 0; |
| | | int CHsmsPassive::requestEventReportSend(unsigned int CEID) |
| | | { |
| | | SERVO::CCollectionEvent* pEvent = getEvent(CEID); |
| | |
| | | } |
| | | |
| | | SERVO::CReport* pReport = pEvent->getFirstReport(); |
| | | if (pReport == nullptr) { |
| | | return ER_UNLINK_EVENT_REPORT; |
| | | } |
| | | |
| | | |
| | | Lock(); |
| | |
| | | HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 11, ++m_nSystemByte); |
| | | ASSERT(pMessage); |
| | | ISECS2Item* pItem = pMessage->getBody(); |
| | | pItem->addU4Item(++DATAID, "DATAID"); |
| | | // pItem->addU2Item(++DATAID, "DATAID"); // 根据别的日志显示DATAID恒为0,所以我们先照使用0 |
| | | pItem->addU2Item(0, "DATAID"); |
| | | pItem->addU4Item(CEID, "CEID"); |
| | | ISECS2Item* pItemList1 = pItem->addItem(); |
| | | ISECS2Item* pItemList2 = pItemList1->addItem(); |
| | | pItemList2->addU4Item(pReport->getReportId(), "RPTID"); |
| | | ISECS2Item* pItemList3 = pItemList2->addItem(); |
| | | ISECS2Item* pItemList1 = pItem->addItem(); // L[n] reports |
| | | if (pReport != nullptr) { |
| | | ISECS2Item* pItemList2 = pItemList1->addItem(); |
| | | pItemList2->addU4Item(pReport->getReportId(), "RPTID"); |
| | | ISECS2Item* pItemList3 = pItemList2->addItem(); |
| | | |
| | | auto vars = pReport->getVariables(); |
| | | for (auto var : vars) { |
| | | addVariableValueToItem(pItemList3, var); |
| | | auto vars = pReport->getVariables(); |
| | | for (auto var : vars) { |
| | | addVariableValueToItem(pItemList3, var); |
| | | } |
| | | } |
| | | 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); |
| | |
| | | return requestEventReportSend("CarrierID_Readed"); |
| | | } |
| | | |
| | | int CHsmsPassive::requestEventReportSend_CheckSlotMap() |
| | | { |
| | | return requestEventReportSend("CheckSlotMap"); |
| | | } |
| | | |
| | | int CHsmsPassive::requestEventReportSend_SlotMapVerificationOK() |
| | | { |
| | | return requestEventReportSend("SlotMapVerificationOK"); |
| | | } |
| | | |
| | | int CHsmsPassive::requestEventReportSend_SlotMapVerificationNG() |
| | | { |
| | | return requestEventReportSend("SlotMapVerificationNG"); |
| | | } |
| | | |
| | | int CHsmsPassive::requestEventReportSend_Port_Unload_Ready() |
| | | { |
| | | return requestEventReportSend("Port_Unload_Ready"); |
| | |
| | | int CHsmsPassive::requestEventReportSend_Port_Load_Ready() |
| | | { |
| | | return requestEventReportSend("Port_Load_Ready"); |
| | | } |
| | | |
| | | int CHsmsPassive::requestEventReportSend_Port_Ready_To_Release() |
| | | { |
| | | return requestEventReportSend("Port_Ready_To_Release"); |
| | | } |
| | | |
| | | int CHsmsPassive::requestEventReportSend_Port_Blocked() |
| | |
| | | return requestEventReportSend("OCR_PanelID_Read_OK"); |
| | | } |
| | | |
| | | int CHsmsPassive::requestEventReportSend_LoadPortNotAssoc() |
| | | { |
| | | return requestEventReportSend("LoadPortNotAssoc"); |
| | | } |
| | | |
| | | int CHsmsPassive::requestEventReportSend_ProcessDataReport() |
| | | { |
| | | return requestEventReportSend("ProcessDataReport"); |
| | | } |
| | | |
| | | int CHsmsPassive::requestEventReportSend_SubEqpStart() |
| | | { |
| | | return requestEventReportSend("SubEqpStart"); |
| | | } |
| | | |
| | | int CHsmsPassive::requestEventReportSend_SubEqpEnd() |
| | | { |
| | | return requestEventReportSend("SubEqpEnd"); |
| | | } |
| | | |
| | | |