| | |
| | | m_listener.onCommand = nullptr; |
| | | m_listener.onEQConstantRequest = nullptr; |
| | | m_listener.onEQConstantSend = nullptr; |
| | | m_pActiveAction = nullptr; |
| | | InitializeCriticalSection(&m_criticalSection); |
| | | } |
| | | |
| | |
| | | delete item; |
| | | } |
| | | m_listActionSent.clear(); |
| | | for (auto item : m_listActionSpooling) { |
| | | delete item; |
| | | } |
| | | m_listActionSpooling.clear(); |
| | | Unlock(); |
| | | |
| | | if (m_hCimWorkEvent != NULL) { |
| | |
| | | { |
| | | 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; |
| | | } |
| | |
| | | }; |
| | | 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 { |
| | |
| | | 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); |
| | | } |
| | |
| | | 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() |
| | | { |
| | | // 结束线程 |
| | |
| | | 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) { |
| | |
| | | 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"); |
| | |
| | | //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"); |
| | |
| | | return 0; |
| | | } |
| | | |
| | | // S1F13 |
| | | int CHsmsPassive::replyEstablishCommunications(IMessage* pRecv) |
| | | { |
| | | if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) { |
| | |
| | | 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) |
| | | { |
| | |
| | | // 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); |
| | |
| | | pItem->addU4Item(ALID, "ALID"); |
| | | pItem->addItem(ALTX, "ALTX"); |
| | | pAction->setSendMessage(pMessage); |
| | | |
| | | SetEvent(m_hCimWorkEvent); |
| | | Unlock(); |
| | | |
| | | int size = pAction->serialize(nullptr, 0);; |
| | | if (size > 0) { |
| | | char* pszBuffer = new char[size]; |
| | | pAction->serialize(pszBuffer, size); |
| | | AfxMessageBox("abc"); |
| | | |
| | | CHsmsAction* pAction2 = new CHsmsAction(); |
| | | pAction2->unserialize(pszBuffer, size); |
| | | AfxMessageBox("def"); |
| | | m_pPassive->sendMessage(pAction2->getSendMessage()); |
| | | 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 CEID, const std::vector<std::string>& values) |
| | | { |
| | | if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) { |
| | | return ER_NOTSELECT; |
| | | } |
| | | |
| | | SERVO::CCollectionEvent* pEvent = getEvent(CEID); |
| | | if (pEvent == nullptr) { |
| | | return ER_NO_EVENT; |
| | |
| | | |
| | | 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); |
| | |
| | | pItemList3->addItem(item.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; |