| | |
| | | |
| | | CEquipment::CEquipment() : m_nID(0), m_strName(""), m_strDescription(""), m_station(0, 255) |
| | | { |
| | | m_listener = { nullptr, nullptr, nullptr, nullptr, nullptr }; |
| | | m_listener = { }; |
| | | m_alive = { FALSE, 0, FALSE }; |
| | | m_bCimState = FALSE; |
| | | m_bUpstreamInline = FALSE; |
| | |
| | | |
| | | CEquipment::~CEquipment() |
| | | { |
| | | for (auto item : m_glassList) { |
| | | item->release(); |
| | | for (int i = 0; i < SLOT_MAX; i++) { |
| | | CContext* pContext = m_slot[i].getContext(); |
| | | if (pContext != nullptr) { |
| | | pContext->release(); |
| | | m_slot[i].setContext(nullptr); |
| | | } |
| | | } |
| | | m_glassList.clear(); |
| | | |
| | | for (auto item : m_mapStep) { |
| | | delete item.second; |
| | |
| | | |
| | | void CEquipment::setListener(EquipmentListener listener) |
| | | { |
| | | m_listener.onAlive = listener.onAlive; |
| | | m_listener.onCimStateChanged = listener.onCimStateChanged; |
| | | m_listener.onAlarm = listener.onAlarm; |
| | | m_listener.onDataChanged = listener.onDataChanged; |
| | | m_listener.onVcrEventReport = listener.onVcrEventReport; |
| | | m_listener = listener; |
| | | } |
| | | |
| | | void CEquipment::setCcLink(CCCLinkIEControl* pCcLink) |
| | |
| | | { |
| | | initPins(); |
| | | initSteps(); |
| | | initSlots(); |
| | | for (auto item : m_mapStep) { |
| | | item.second->init(); |
| | | } |
| | |
| | | std::to_string((int)item->getType()).c_str(), "", weight++)); |
| | | } |
| | | |
| | | for (auto item : m_glassList) { |
| | | attrubutes.addAttribute(new CAttribute("Glass", |
| | | item->getID().c_str(), "", weight++)); |
| | | for (int i = 0; i < SLOT_MAX; i++) { |
| | | if (!m_slot[i].isEnable()) continue; |
| | | |
| | | CGlass* pGlass = (CGlass*)m_slot[i].getContext(); |
| | | if (pGlass == nullptr) { |
| | | attrubutes.addAttribute(new CAttribute(m_slot[i].getName().c_str(), |
| | | "", "", weight++)); |
| | | } |
| | | else { |
| | | attrubutes.addAttribute(new CAttribute(m_slot[i].getName().c_str(), |
| | | pGlass->getID().c_str(), "", weight++)); |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | |
| | | { |
| | | if (ar.IsStoring()) { |
| | | Lock(); |
| | | int count = (int)m_glassList.size(); |
| | | ar << count; |
| | | for (auto item : m_glassList) { |
| | | item->serialize(ar); |
| | | for (int i = 0; i < SLOT_MAX; i++) { |
| | | m_slot[i].serialize(ar); |
| | | if (m_slot[i].getContext() != nullptr) { |
| | | ((CGlass*)m_slot[i].getContext())->serialize(ar); |
| | | } |
| | | } |
| | | Unlock(); |
| | | } |
| | | else { |
| | | // addGlassToList前不需要上锁,因其内部有锁 |
| | | int count; |
| | | ar >> count; |
| | | for (int i = 0; i < count; i++) { |
| | | CGlass* pGlass = theApp.m_model.m_glassPool.allocaGlass(); |
| | | pGlass->serialize(ar); |
| | | addGlassToList(pGlass); |
| | | for (int i = 0; i < SLOT_MAX; i++) { |
| | | m_slot[i].serialize(ar); |
| | | if (m_slot[i].getContext() != nullptr) { |
| | | CGlass* pGlass = theApp.m_model.m_glassPool.allocaGlass(); |
| | | pGlass->serialize(ar); |
| | | m_slot[i].setContext(pGlass); |
| | | } |
| | | } |
| | | |
| | | // 梳理各玻璃之间的绑定关系 |
| | | /* |
| | | Lock(); |
| | | std::list<CGlass*> list = m_glassList; |
| | | for (auto item : list) { |
| | |
| | | } |
| | | } |
| | | Unlock(); |
| | | */ |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | |
| | | // CEqCassetteTranserStateStep |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT1_CASSETTIE_EMPTY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT1_CASSETTIE_LOAD_READY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT1_CASSETTIE_LOADED, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT1_CASSETTIE_INUSE, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT1_CASSETTIE_UNLOAD_READY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT1_CASSETTIE_BLOCKED, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT2_CASSETTIE_EMPTY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT2_CASSETTIE_LOAD_READY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT2_CASSETTIE_LOADED, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT2_CASSETTIE_INUSE, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT2_CASSETTIE_UNLOAD_READY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT2_CASSETTIE_BLOCKED, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT3_CASSETTIE_EMPTY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT3_CASSETTIE_LOAD_READY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT3_CASSETTIE_LOADED, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT3_CASSETTIE_INUSE, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT3_CASSETTIE_UNLOAD_READY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT3_CASSETTIE_BLOCKED, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT4_CASSETTIE_EMPTY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT4_CASSETTIE_LOAD_READY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT4_CASSETTIE_LOADED, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT4_CASSETTIE_INUSE, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT4_CASSETTIE_UNLOAD_READY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT4_CASSETTIE_BLOCKED, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT1_EMPTY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT1_LOAD_READY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT1_LOADED, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT1_INUSE, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT1_UNLOAD_READY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT1_BLOCKED, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT2_EMPTY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT2_LOAD_READY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT2_LOADED, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT2_INUSE, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT2_UNLOAD_READY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT2_BLOCKED, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT3_EMPTY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT3_LOAD_READY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT3_LOADED, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT3_INUSE, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT3_UNLOAD_READY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT3_BLOCKED, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT4_EMPTY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT4_LOAD_READY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT4_LOADED, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT4_INUSE, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT4_UNLOAD_READY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PORT4_BLOCKED, pszData, size); |
| | | } |
| | | |
| | | BOOL CEquipment::isBitOn(const char* pszData, size_t size, int index) |
| | |
| | | // 测试 |
| | | if (code == FLOW_TEST) { |
| | | AfxMessageBox(pIntent->getMsg()); |
| | | return FLOW_ACCEPT; |
| | | } |
| | | |
| | | |
| | | // 信号 |
| | | if (code == FLOW_SIGNAL) { |
| | | return FLOW_ACCEPT; |
| | | } |
| | | |
| | | |
| | | // 数据 |
| | | if (code == FLOW_SIGNAL) { |
| | | return FLOW_ACCEPT; |
| | | } |
| | | |
| | | |
| | | // 物料 |
| | | if (code == FLOW_MOVE_MATERIAL) { |
| | | CGlass* pGlass = (CGlass*)pIntent->getContext(); |
| | | ASSERT(pGlass); |
| | | if (!glassWillArrive(pGlass)) { |
| | | return FLOW_REJECT; |
| | | } |
| | | return glassArrived(pGlass); |
| | | } |
| | | |
| | | |
| | | |
| | | return FLOW_ACCEPT; |
| | | } |
| | | |
| | | int CEquipment::outputGlass(int port) |
| | | { |
| | | CPin* pOutPin = nullptr; |
| | | if (port == 0) { |
| | | pOutPin = getPin("Out"); |
| | | if (pOutPin == nullptr) { |
| | | pOutPin = getPin("Out1"); |
| | | } |
| | | } |
| | | else if (port == 1) { |
| | | pOutPin = getPin("Out2"); |
| | | } |
| | | if (pOutPin == nullptr) { |
| | | return -1; |
| | | } |
| | | |
| | | |
| | | // 模拟取出第一张Panel,传送到下一环节 |
| | | ULONGLONG time = CToolUnits::getTimestamp(); |
| | | Lock(); |
| | | if (m_glassList.empty()) { |
| | | Unlock(); |
| | | return -2; |
| | | } |
| | | CGlass* pContext = m_glassList.front(); |
| | | pContext->addRef(); |
| | | |
| | | CIntent intent(FLOW_MOVE_MATERIAL, "", pContext); |
| | | int nRet = pOutPin->sendIntent(&intent); |
| | | if (nRet == FLOW_REJECT) { |
| | | LOGE("<CEquipment>对方拒绝接收Intent."); |
| | | } |
| | | else if (nRet == FLOW_ACCEPT) { |
| | | CPath* pPath = pContext->getPathWithSiteID(m_nID); |
| | | if (pPath != nullptr) { |
| | | pPath->setOutTime(time); |
| | | } |
| | | m_glassList.pop_front(); |
| | | pContext->release(); // 添加到列队时addRef, 取出时release |
| | | if (m_listener.onDataChanged != nullptr) { |
| | | m_listener.onDataChanged(this, 0); |
| | | } |
| | | } |
| | | |
| | | pContext->release(); |
| | | Unlock(); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | BOOL CEquipment::glassWillArrive(CGlass* pGlass) |
| | | { |
| | | return TRUE; |
| | | } |
| | | |
| | | int CEquipment::glassArrived(CGlass* pGlass) |
| | | { |
| | | Lock(); |
| | | pGlass->addPath(m_nID); |
| | | pGlass->addRef(); |
| | | m_glassList.push_back(pGlass); |
| | | Unlock(); |
| | | |
| | | if (m_listener.onDataChanged != nullptr) { |
| | | m_listener.onDataChanged(this, 0); |
| | | } |
| | | |
| | | return FLOW_ACCEPT; |
| | | } |
| | | |
| | | void CEquipment::addGlassToList(CGlass* pGlass) |
| | | { |
| | | ASSERT(pGlass); |
| | | |
| | | Lock(); |
| | | pGlass->addRef(); |
| | | m_glassList.push_back(pGlass); |
| | | Unlock(); |
| | | |
| | | if (m_listener.onDataChanged != nullptr) { |
| | | m_listener.onDataChanged(this, 0); |
| | | } |
| | | } |
| | | |
| | | CGlass* CEquipment::getGlassFromList(const char* pszId) |
| | | { |
| | | CGlass* pGlass = nullptr; |
| | | Lock(); |
| | | for (auto item : m_glassList) { |
| | | if (item->getID().compare(pszId) == 0) { |
| | | pGlass = item; |
| | | break; |
| | | } |
| | | } |
| | | Unlock(); |
| | | |
| | | return pGlass; |
| | | } |
| | | |
| | | BOOL CEquipment::removeClass(CGlass* pGlass) |
| | | { |
| | | Lock(); |
| | | bool bExist = std::find(m_glassList.begin(), m_glassList.end(), pGlass) != m_glassList.end(); |
| | | if (bExist) { |
| | | pGlass->addPath(EQ_ID_OPERATOR_REMOVE); |
| | | pGlass->release(); |
| | | m_glassList.remove(pGlass); |
| | | } |
| | | Unlock(); |
| | | |
| | | if (bExist && m_listener.onDataChanged != nullptr) { |
| | | m_listener.onDataChanged(this, 0); |
| | | } |
| | | |
| | | return bExist; |
| | | } |
| | | |
| | | void CEquipment::getGlassList(std::list<CGlass*>& list) |
| | | { |
| | | Lock(); |
| | | for (auto item : m_glassList) { |
| | | item->addRef(); |
| | | list.push_back(item); |
| | | } |
| | | Unlock(); |
| | | } |
| | | |
| | | CGlass* CEquipment::getFrontGlass() |
| | | { |
| | | CGlass* pGlass = nullptr; |
| | | |
| | | Lock(); |
| | | if (!m_glassList.empty()) { |
| | | pGlass = m_glassList.front(); |
| | | } |
| | | Unlock(); |
| | | |
| | | return pGlass; |
| | | } |
| | | |
| | | int CEquipment::fetchedOutJob(CJobDataB* pJobDataB) |
| | |
| | | |
| | | // 找到指定的glass id, |
| | | Lock(); |
| | | if (m_glassList.empty()) { |
| | | Unlock(); |
| | | return -2; |
| | | } |
| | | |
| | | CGlass* pContext = nullptr; |
| | | for (auto iter = m_glassList.begin(); iter != m_glassList.end(); iter++) { |
| | | if ((*iter)->getID().compare(pJobDataB->getGlassId()) == 0) { |
| | | pContext = (*iter); |
| | | m_glassList.erase(iter); |
| | | for (int i = 0; i < SLOT_MAX; i++) { |
| | | CGlass* pGlass = (CGlass*)m_slot[i].getContext(); |
| | | if (pGlass != nullptr && compareJobDataB(pJobDataB, pGlass->getJobDataB())) { |
| | | pContext = pGlass; |
| | | m_slot[i].setContext(nullptr); |
| | | break; |
| | | } |
| | | } |
| | |
| | | // 如果此玻璃已经贴合,贴合的玻璃也要从列表中移除 |
| | | CGlass* pBuddy = pContext->getBuddy(); |
| | | if (pBuddy != nullptr) { |
| | | for (auto iter = m_glassList.begin(); iter != m_glassList.end(); iter++) { |
| | | if ((*iter)->getID().compare(pBuddy->getID()) == 0) { |
| | | (*iter)->release(); |
| | | m_glassList.erase(iter); |
| | | for (int i = 0; i < SLOT_MAX; i++) { |
| | | CGlass* pGlass = (CGlass*)m_slot[i].getContext(); |
| | | if (pGlass != nullptr && compareJobDataB(pBuddy->getJobDataB(), pGlass->getJobDataB())) { |
| | | pContext->release(); |
| | | m_slot[i].setContext(nullptr); |
| | | break; |
| | | } |
| | | } |
| | |
| | | Unlock(); |
| | | |
| | | if (m_listener.onDataChanged != nullptr) { |
| | | m_listener.onDataChanged(this, 0); |
| | | m_listener.onDataChanged(this, EDCC_FETCHOUT_JOB); |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | int CEquipment::storedJob(CJobDataB* pJobDataB) |
| | | int CEquipment::storedJob(CJobDataB* pJobDataB, short& putSlot) |
| | | { |
| | | if (m_pArm == nullptr) { |
| | | return -1; |
| | |
| | | ASSERT(pGlass); |
| | | Lock(); |
| | | pGlass->addPath(m_nID); |
| | | pGlass->addRef(); // 加入list,addRef |
| | | m_glassList.push_back(pGlass); |
| | | m_slot[putSlot - 1].setContext(pGlass); |
| | | pGlass->release(); // tempFetchOut需要调用一次release |
| | | Unlock(); |
| | | |
| | | |
| | | // 如果此玻璃已经贴合,贴合的玻璃也要从加入到列表中 |
| | | /* |
| | | CGlass* pBuddy = pGlass->getBuddy(); |
| | | if (pBuddy != nullptr) { |
| | | Lock(); |
| | |
| | | m_glassList.push_back(pBuddy); |
| | | Unlock(); |
| | | } |
| | | |
| | | */ |
| | | |
| | | if (m_listener.onDataChanged != nullptr) { |
| | | m_listener.onDataChanged(this, 0); |
| | | m_listener.onDataChanged(this, EDCC_STORED_JOB); |
| | | } |
| | | |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | BOOL CEquipment::isGlassListEmpty() |
| | | BOOL CEquipment::hasGlass() |
| | | { |
| | | return m_glassList.empty(); |
| | | for (int i = 0; i < SLOT_MAX; i++) { |
| | | if (m_slot[i].isEnable() && !m_slot[i].isEmpty()) { |
| | | return TRUE; |
| | | } |
| | | } |
| | | |
| | | return FALSE; |
| | | } |
| | | |
| | | bool CEquipment::isAlarmStep(SERVO::CStep* pStep) |
| | |
| | | return -1; |
| | | } |
| | | |
| | | unsigned short operationMode = (unsigned short)(mode + getIndexerOperationModeBaseValue()); |
| | | unsigned short operationMode = (unsigned short)((unsigned short)mode + getIndexerOperationModeBaseValue()); |
| | | LOGI("<CEquipment-%s>准备设置indexerOperationMode<%d>", m_strName.c_str(), (int)mode); |
| | | if (onWritedBlock != nullptr) { |
| | | pStep->writeShort(operationMode, onWritedBlock); |
| | |
| | | return 0; |
| | | }); |
| | | return 0; |
| | | } |
| | | |
| | | CSlot* CEquipment::getAvailableSlot() |
| | | { |
| | | for (int i = 0; i < SLOT_MAX; i++) { |
| | | if (!m_slot[i].isEnable()) continue; |
| | | if (m_slot[i].isLock()) continue; |
| | | if (!m_slot[i].isEmpty()) continue; |
| | | |
| | | return &m_slot[i]; |
| | | } |
| | | |
| | | return nullptr; |
| | | } |
| | | |
| | | CSlot* CEquipment::getAvailableSlotForGlass(MaterialsType type) |
| | | { |
| | | for (int i = 0; i < SLOT_MAX; i++) { |
| | | if (!m_slot[i].isEnable()) continue; |
| | | if (m_slot[i].isLock()) continue; |
| | | if (!m_slot[i].isEmpty()) continue; |
| | | |
| | | MaterialsType slotType = m_slot[i].getType(); |
| | | if (type == MaterialsType::G1 && slotType == MaterialsType::G2) continue; |
| | | if (type == MaterialsType::G2 && slotType == MaterialsType::G1) continue; |
| | | |
| | | return &m_slot[i]; |
| | | } |
| | | |
| | | return nullptr; |
| | | } |
| | | |
| | | CSlot* CEquipment::getNonEmptySlot(MaterialsType putSlotType) |
| | | { |
| | | for (int i = 0; i < SLOT_MAX; i++) { |
| | | if (!m_slot[i].isEnable()) continue; |
| | | if (m_slot[i].isLock()) continue; |
| | | CGlass* pGlass = (CGlass*)m_slot[i].getContext(); |
| | | if (pGlass == nullptr) continue; |
| | | |
| | | MaterialsType glassType = pGlass->getType(); |
| | | if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue; |
| | | if (glassType == MaterialsType::G2 && putSlotType == MaterialsType::G1) continue; |
| | | |
| | | return &m_slot[i]; |
| | | } |
| | | |
| | | return nullptr; |
| | | } |
| | | |
| | | CGlass* CEquipment::getGlassFromSlot(int slotNo) |
| | | { |
| | | CSlot* pSlot = nullptr; |
| | | for (int i = 0; i < SLOT_MAX; i++) { |
| | | if (!m_slot[i].isEnable()) continue; |
| | | if (m_slot[i].getNo() != slotNo) continue; |
| | | pSlot = &m_slot[i]; |
| | | break; |
| | | } |
| | | |
| | | if (pSlot != nullptr) { |
| | | return (CGlass*)pSlot->getContext(); |
| | | } |
| | | |
| | | return nullptr; |
| | | } |
| | | |
| | | CGlass* CEquipment::getAnyGlass() |
| | | { |
| | | CSlot* pSlot = nullptr; |
| | | for (int i = 0; i < SLOT_MAX; i++) { |
| | | if (!m_slot[i].isEnable()) continue; |
| | | CGlass* pGlass = (CGlass*)m_slot[i].getContext(); |
| | | if (pGlass == nullptr) continue; |
| | | return pGlass; |
| | | } |
| | | |
| | | return nullptr; |
| | | } |
| | | |
| | | BOOL CEquipment::canPlaceGlassInSlot(const short slotIndex) |
| | | { |
| | | if (slotIndex >= SLOT_MAX) return FALSE; |
| | | if (!m_slot[slotIndex].isEnable()) return FALSE; |
| | | if (m_slot[slotIndex].getContext() != nullptr) return FALSE; |
| | | |
| | | return TRUE; |
| | | } |
| | | |
| | | short CEquipment::decodeRecipeListReport(const char* pszData, size_t size) |
| | |
| | | return index; |
| | | } |
| | | |
| | | int CEquipment::onPreFetchedOutJob(int port, CJobDataB* pJobDataB) |
| | | BOOL CEquipment::onPreFetchedOutJob(int port, CJobDataB* pJobDataB) |
| | | { |
| | | LOGI("<CEquipment-%s>onPreFetchedOutJob:port:%d|GlassId:%s", |
| | | m_strName.c_str(), port, pJobDataB->getGlassId().c_str()); |
| | | if (m_listener.onPreFethedOutJob != nullptr) { |
| | | return m_listener.onPreFethedOutJob(this, pJobDataB); |
| | | } |
| | | |
| | | return TRUE; |
| | | } |
| | | |
| | |
| | | return 0; |
| | | } |
| | | |
| | | int CEquipment::onPreStoredJob(int port, CJobDataB* pJobDataB) |
| | | int CEquipment::onPreStoredJob(int port, CJobDataB* pJobDataB, short& putSlot) |
| | | { |
| | | LOGI("<CEquipment-%s>onPreStoredJob:port:%d|GlassId:%s", |
| | | m_strName.c_str(), port, pJobDataB->getGlassId().c_str()); |
| | | |
| | | CJobDataS* pJobDataS = getJobDataS(pJobDataB->getCassetteSequenceNo(), pJobDataB->getJobSequenceNo()); |
| | | if (pJobDataS == nullptr) { |
| | | LOGE("<CFliper-%s>onPreFetchedOutJob,找不到对应的JobDataS(CassetteSequenceNo:%d, JobSequenceNo:%d), 注意排查风险!", m_strName.c_str(), |
| | | pJobDataB->getCassetteSequenceNo(), pJobDataB->getJobSequenceNo()); |
| | | return FALSE; |
| | | } |
| | | |
| | | // 如果没有可用位置,报错 |
| | | Lock(); |
| | | CSlot* pSlot = getAvailableSlotForGlass((MaterialsType)pJobDataS->getMaterialsType()); |
| | | if (pSlot == nullptr) { |
| | | Unlock(); |
| | | LOGE("<CFliper-%s>onPreFetchedOutJob,找不到匹配的Slot,不能进料,请注意风险!", m_strName.c_str()); |
| | | return FALSE; |
| | | } |
| | | Unlock(); |
| | | |
| | | |
| | | if (m_listener.onPreStoredJob != nullptr) { |
| | | if (!m_listener.onPreStoredJob(this, pJobDataB, putSlot)) { |
| | | return FALSE; |
| | | } |
| | | |
| | | if(!canPlaceGlassInSlot(putSlot - 1)) { |
| | | return FALSE; |
| | | } |
| | | } |
| | | |
| | | return TRUE; |
| | | } |
| | | |
| | |
| | | LOGI("<CEquipment-%s>onStore:port:%d|GlassId:%s", |
| | | m_strName.c_str(), port, pJobDataB->getGlassId().c_str()); |
| | | |
| | | BOOL bCheck = onPreStoredJob(port, pJobDataB); |
| | | short putSlot = 0; |
| | | BOOL bCheck = onPreStoredJob(port, pJobDataB, putSlot); |
| | | if (bCheck) { |
| | | addJobDataB(pJobDataB); |
| | | return storedJob(pJobDataB); |
| | | return storedJob(pJobDataB, putSlot); |
| | | } |
| | | |
| | | // 数据异常,处理或显示 |
| | |
| | | |
| | | return nullptr; |
| | | } |
| | | |
| | | BOOL CEquipment::compareJobDataB(CJobDataB* pJobDataB1, CJobDataB* pJobDataB2) |
| | | { |
| | | ASSERT(pJobDataB1); |
| | | ASSERT(pJobDataB2); |
| | | |
| | | if (pJobDataB1->getCassetteSequenceNo() != pJobDataB2->getCassetteSequenceNo()) |
| | | return FALSE; |
| | | if (pJobDataB1->getJobSequenceNo() != pJobDataB2->getJobSequenceNo()) |
| | | return FALSE; |
| | | |
| | | return TRUE; |
| | | } |
| | | } |