| | |
| | | if (pszBuffer == nullptr) { |
| | | index += sizeof(int); |
| | | for (auto item : m_listActionSpooling) { |
| | | index += item->serialize(pszBuffer, nBufferSize); |
| | | if (item == nullptr || item->getSendMessage() == nullptr) { |
| | | LOGE("<HSMS>skip spooling item: null send message"); |
| | | continue; |
| | | } |
| | | int nRet = item->serialize(nullptr, 0); |
| | | if (nRet <= 0) { |
| | | LOGE("<HSMS>skip spooling item: serialize failed"); |
| | | continue; |
| | | } |
| | | index += nRet; |
| | | } |
| | | |
| | | index += calcSpoolCfgSize(); |
| | |
| | | return index; |
| | | } |
| | | else { |
| | | int nTemp, nRet; |
| | | int nTemp = 0; |
| | | int nRet = 0; |
| | | |
| | | nTemp = (int)m_listActionSpooling.size(); |
| | | for (auto item : m_listActionSpooling) { |
| | | if (item == nullptr || item->getSendMessage() == nullptr) { |
| | | continue; |
| | | } |
| | | if (item->serialize(nullptr, 0) > 0) { |
| | | ++nTemp; |
| | | } |
| | | } |
| | | |
| | | memcpy(&pszBuffer[index], &nTemp, sizeof(int)); |
| | | index += sizeof(int); |
| | | |
| | | for (auto item : m_listActionSpooling) { |
| | | if (item == nullptr || item->getSendMessage() == nullptr) { |
| | | LOGE("<HSMS>skip spooling item: null send message"); |
| | | continue; |
| | | } |
| | | nRet = item->serialize(&pszBuffer[index], nBufferSize); |
| | | if (nRet <= 0) break; |
| | | if (nRet <= 0) { |
| | | LOGE("<HSMS>skip spooling item: serialize failed"); |
| | | continue; |
| | | } |
| | | index += nRet; |
| | | } |
| | | |
| | |
| | | for (int i = 0; i < nTemp; i++) { |
| | | CHsmsAction* pAction = new CHsmsAction(); |
| | | nRet = pAction->unserialize(&pszBuffer[index], nBufferSize - index); |
| | | if (nRet <= 0) break; |
| | | if (nRet <= 0 || pAction->getSendMessage() == nullptr) { |
| | | delete pAction; |
| | | break; |
| | | } |
| | | index += nRet; |
| | | m_listActionSpooling.push_back(pAction); |
| | | } |
| | |
| | | Unlock(); |
| | | if (!selected) { |
| | | IMessage* pMsg = pAction->getSendMessage(); |
| | | if (pMsg == NULL) { |
| | | LOGE("<HSMS>spooling drop: null send message"); |
| | | delete pAction; |
| | | continue; |
| | | } |
| | | uint8_t streamId = 0; |
| | | uint8_t functionId = 0; |
| | | if (pMsg && pMsg->getHeader()) { |
| | |
| | | |
| | | if (pAction->isNeedWaitReply()) { |
| | | // 如果需要等待回复 |
| | | IMessage* pMessage = pAction->getSendMessage(); |
| | | if (pMessage == NULL) { |
| | | LOGE("<HSMS>drop action: null send message"); |
| | | delete pAction; |
| | | continue; |
| | | } |
| | | Lock(); |
| | | m_pActiveAction = pAction; |
| | | IMessage* pMessage = pAction->getSendMessage(); |
| | | Unlock(); |
| | | |
| | | ASSERT(pMessage); |
| | |
| | | Unlock(); |
| | | } |
| | | else { |
| | | IMessage* pMessage = pAction->getSendMessage(); |
| | | if (pMessage == NULL) { |
| | | LOGE("<HSMS>drop action: null send message"); |
| | | delete pAction; |
| | | continue; |
| | | } |
| | | Lock(); |
| | | m_listActionSent.push_back(pAction); |
| | | IMessage* pMessage = pAction->getSendMessage(); |
| | | Unlock(); |
| | | |
| | | ASSERT(pMessage); |
| | |
| | | |
| | | Lock(); |
| | | CHsmsAction* pAction = new CHsmsAction(ACTION_HELLO, FALSE, m_nActionTimeout); |
| | | m_listAction.push_back(pAction); |
| | | IMessage* pMessage = NULL; |
| | | HSMS_Create1Message(pMessage, m_nSessionId, 1 | REPLY, 1, ++m_nSystemByte); |
| | | ASSERT(pMessage); |
| | | if (HSMS_Create1Message(pMessage, m_nSessionId, 1 | REPLY, 1, ++m_nSystemByte) != 0 || pMessage == NULL) { |
| | | LOGE("<HSMS>S1F1 create message failed"); |
| | | delete pAction; |
| | | Unlock(); |
| | | return ER_CREATED_MESSAGE; |
| | | } |
| | | pAction->setSendMessage(pMessage); |
| | | m_listAction.push_back(pAction); |
| | | |
| | | SetEvent(m_hCimWorkEvent); |
| | | Unlock(); |
| | |
| | | |
| | | |
| | | // 解释数据,得到CProcessJob |
| | | // 容量前置检查:当前实现仅支持单批 PJ 集合,如果已有 PJ/CJ,直接返回 ACKA=false |
| | | if (m_pModel != nullptr && !m_pModel->getMaster().isProcessJobsEmpty()) { |
| | | IMessage* pMessage = NULL; |
| | | HSMS_Create1Message(pMessage, m_nSessionId, 16, 16, ++m_nSystemByte); |
| | | ASSERT(pMessage); |
| | | pMessage->getBody()->addItem(); // PRJOBID list 为空 |
| | | ISECS2Item* pItemErrors = pMessage->getBody()->addItem(); |
| | | pItemErrors->addBoolItem(false, "ACKA"); |
| | | ISECS2Item* pItemErrors2 = pItemErrors->addItem(); |
| | | auto err = pItemErrors2->addItem(); |
| | | err->addU4Item(1000, "ERRCODE"); |
| | | err->addItem("PJobSpace=0 (existing ProcessJob/ControlJob)", "ERRTEXT"); |
| | | m_pPassive->sendMessage(pMessage); |
| | | LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d", |
| | | pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes); |
| | | LogSecsMessageBrief("<HSMS>[SEND]", pMessage); |
| | | HSMS_Destroy1Message(pMessage); |
| | | return 0; |
| | | } |
| | | |
| | | ISECS2Item* pItemPjs, * pItemPj,* pItemCarriers, * pItemCarrier, *pItemSlots, *pItemRecipes; |
| | | unsigned short DATAID; |
| | | const char* pszPrjobid, *pszMF, *pszCarrierId, *pszRecipeName; |
| | |
| | | CHsmsAction* pAction = new CHsmsAction(ACTION_ALARM_REPORT, TRUE, m_nActionTimeout); |
| | | |
| | | IMessage* pMessage = NULL; |
| | | HSMS_Create1Message(pMessage, m_nSessionId, 5 | REPLY, 1, ++m_nSystemByte); |
| | | ASSERT(pMessage); |
| | | if (HSMS_Create1Message(pMessage, m_nSessionId, 5 | REPLY, 1, ++m_nSystemByte) != 0 || pMessage == NULL) { |
| | | LOGE("<HSMS>S5F1 create message failed"); |
| | | delete pAction; |
| | | Unlock(); |
| | | return ER_CREATED_MESSAGE; |
| | | } |
| | | ISECS2Item* pItem = pMessage->getBody(); |
| | | pItem->addBinaryItem(szALCD, 1, "ALCD"); |
| | | pItem->addU4Item(ALID, "ALID"); |
| | |
| | | if (pEvent == nullptr) { |
| | | return ER_NO_EVENT; |
| | | } |
| | | // 触发 PauseEvent 检测桩(由 Master 负责实际策略) |
| | | if (m_pModel != nullptr) { |
| | | m_pModel->getMaster().handleCollectionEvent(CEID); |
| | | } |
| | | |
| | | SERVO::CReport* pReport = pEvent->getFirstReport(); |
| | | |
| | |
| | | Lock(); |
| | | CHsmsAction* pAction = new CHsmsAction(ACTION_EVENT_REPORT, TRUE, m_nActionTimeout); |
| | | IMessage* pMessage = NULL; |
| | | HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 11, ++m_nSystemByte); |
| | | ASSERT(pMessage); |
| | | if (HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 11, ++m_nSystemByte) != 0 || pMessage == NULL) { |
| | | LOGE("<HSMS>S6F11 create message failed"); |
| | | delete pAction; |
| | | Unlock(); |
| | | return ER_CREATED_MESSAGE; |
| | | } |
| | | ISECS2Item* pItem = pMessage->getBody(); |
| | | // pItem->addU2Item(++DATAID, "DATAID"); // 根据别的日志显示DATAID恒为0,所以我们先照使用0 |
| | | pItem->addU2Item(0, "DATAID"); |
| | |
| | | |
| | | int CHsmsPassive::requestEventReportSend_OCR_PanelID_Read_OK() |
| | | { |
| | | return requestEventReportSend("OCR_PanelID_Read_OK"); |
| | | return requestEventReportSend_OCR_PanelID_Read(1); |
| | | } |
| | | |
| | | int CHsmsPassive::requestEventReportSend_OCR_PanelID_Read(short vcrResult) |
| | | { |
| | | const char* eventName = "OCR_PanelID_Read_OK"; |
| | | switch (vcrResult) { |
| | | case 1: // OK & Match |
| | | eventName = "OCR_PanelID_Read_OK"; |
| | | break; |
| | | case 2: // OK & Mismatch |
| | | eventName = "OCR_PanelID_Read_Mismatch"; |
| | | break; |
| | | case 3: // Fail & KeyIn Match |
| | | eventName = "OCR_PanelID_Read_NG"; |
| | | break; |
| | | case 4: // Fail & KeyIn Mismatch |
| | | eventName = "OCR_PanelID_Read_NG_Mismatch"; |
| | | break; |
| | | default: |
| | | LOGE("<CHsmsPassive>Unknown VCR result=%d, fallback to OCR_PanelID_Read_OK", vcrResult); |
| | | eventName = "OCR_PanelID_Read_OK"; |
| | | break; |
| | | } |
| | | |
| | | return requestEventReportSend(eventName); |
| | | } |
| | | |
| | | int CHsmsPassive::requestEventReportSend_LoadPortNotAssoc() |