| | |
| | | maxId = item->getVarialbleId(); |
| | | } |
| | | } |
| | | for (auto item : m_dataVariabels) { |
| | | if (item && item->getVarialbleId() > maxId) { |
| | | maxId = item->getVarialbleId(); |
| | | } |
| | | } |
| | | return maxId; |
| | | } |
| | | |
| | | unsigned int CHsmsPassive::getMaxDataVariableId() const |
| | | { |
| | | unsigned int maxId = 0; |
| | | for (auto item : m_variabels) { |
| | | if (item && item->getVarialbleId() > maxId) { |
| | | maxId = item->getVarialbleId(); |
| | | } |
| | | } |
| | | for (auto item : m_dataVariabels) { |
| | | if (item && item->getVarialbleId() > maxId) { |
| | | maxId = item->getVarialbleId(); |
| | | } |
| | | } |
| | | return maxId; |
| | | } |
| | | |
| | |
| | | |
| | | if (filepath.empty()) return -3; |
| | | return writeVariablesToFile(filepath); |
| | | } |
| | | |
| | | int CHsmsPassive::deleteDataVariable(int dvid) |
| | | { |
| | | Lock(); |
| | | auto it = std::find_if(m_dataVariabels.begin(), m_dataVariabels.end(), [=](SERVO::CDataVariable* v) { |
| | | return v != nullptr && v->getVarialbleId() == (unsigned int)dvid; |
| | | }); |
| | | if (it == m_dataVariabels.end()) { |
| | | Unlock(); |
| | | return -1; |
| | | } |
| | | delete *it; |
| | | m_dataVariabels.erase(it); |
| | | auto filepath = m_strDataVariableFilepath; |
| | | Unlock(); |
| | | |
| | | if (filepath.empty()) return -2; |
| | | return writeDataVariablesToFile(filepath); |
| | | } |
| | | |
| | | int CHsmsPassive::addDataVariable(const char* pszName, const char* pszFormat, const char* pszRemark, int& outId) |
| | | { |
| | | if (pszName == nullptr || pszFormat == nullptr) return -1; |
| | | std::string fmt = pszFormat; |
| | | std::transform(fmt.begin(), fmt.end(), fmt.begin(), ::toupper); |
| | | if (!isValidFormat(fmt)) return -2; |
| | | |
| | | Lock(); |
| | | int maxId = 0; |
| | | for (auto v : m_dataVariabels) { |
| | | if (v != nullptr && static_cast<int>(v->getVarialbleId()) > maxId) { |
| | | maxId = static_cast<int>(v->getVarialbleId()); |
| | | } |
| | | } |
| | | outId = maxId + 1; |
| | | |
| | | SERVO::CDataVariable* pNew = new SERVO::CDataVariable(std::to_string(outId).c_str(), pszName, fmt.c_str(), pszRemark ? pszRemark : ""); |
| | | m_dataVariabels.push_back(pNew); |
| | | auto filepath = m_strDataVariableFilepath; |
| | | Unlock(); |
| | | |
| | | if (filepath.empty()) return -3; |
| | | return writeDataVariablesToFile(filepath); |
| | | } |
| | | |
| | | int CHsmsPassive::updateDataVariable(int dvid, const char* pszName, const char* pszFormat, const char* pszRemark) |
| | | { |
| | | if (pszName == nullptr || pszFormat == nullptr) return -1; |
| | | std::string fmt = pszFormat; |
| | | std::transform(fmt.begin(), fmt.end(), fmt.begin(), ::toupper); |
| | | if (!isValidFormat(fmt)) return -2; |
| | | |
| | | Lock(); |
| | | auto it = std::find_if(m_dataVariabels.begin(), m_dataVariabels.end(), [=](SERVO::CDataVariable* v) { |
| | | return v != nullptr && v->getVarialbleId() == (unsigned int)dvid; |
| | | }); |
| | | if (it == m_dataVariabels.end()) { |
| | | Unlock(); |
| | | return -4; |
| | | } |
| | | (*it)->setName(pszName); |
| | | (*it)->setFormat(fmt.c_str()); |
| | | (*it)->setRemark(pszRemark ? pszRemark : ""); |
| | | auto filepath = m_strDataVariableFilepath; |
| | | Unlock(); |
| | | |
| | | if (filepath.empty()) return -3; |
| | | return writeDataVariablesToFile(filepath); |
| | | } |
| | | |
| | | int CHsmsPassive::writeVariablesToFile(const std::string& filepath) |
| | |
| | | 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; |
| | |
| | | } |
| | | |
| | | |
| | | // 回复报文 |
| | | ASSERT(m_listener.onPRJobMultiCreate != nullptr); |
| | | int nRet = m_listener.onPRJobMultiCreate(this, pjs); |
| | | |
| | | |
| | | // 回复报文(在校验/落库后再回复,以便带上真实的 issues) |
| | | IMessage* pMessage = NULL; |
| | | HSMS_Create1Message(pMessage, m_nSessionId, 16, 16, ++m_nSystemByte); |
| | | ASSERT(pMessage); |
| | |
| | | } |
| | | } |
| | | } |
| | | else { |
| | | pItemErrors->addBoolItem(true, "ACKA"); |
| | | pItemErrors->addItem(); // 空列表 |
| | | } |
| | | 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); |
| | | |
| | | |
| | | ASSERT(m_listener.onPRJobMultiCreate != nullptr); |
| | | int nRet = m_listener.onPRJobMultiCreate(this, pjs); |
| | | |
| | | |
| | | // 释放有问题(未添加到master)的内存 |
| | |
| | | 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() |