| | |
| | | m_bBatch = false; |
| | | m_nContinuousTransferCount = 0; |
| | | m_nContinuousTransferStep = CTStep_Unknow; |
| | | m_nContinuousWorkingPort = 0; |
| | | m_nContinuousWorkingSlot = 0; |
| | | m_pControlJob = nullptr; |
| | | m_nTestFlag = 0; |
| | | InitializeCriticalSection(&m_criticalSection); |
| | |
| | | } |
| | | |
| | | // Measurement -> LoadPort |
| | | for (int s = 0; s < 4; s++) { |
| | | PortType pt = pLoadPorts[s]->getPortType(); |
| | | for (int p = 0; p < 4; p++) { |
| | | if (p != m_nContinuousWorkingPort) continue; |
| | | PortType pt = pLoadPorts[p]->getPortType(); |
| | | if ((m_nContinuousTransferStep == CTStep_Unknow || m_nContinuousTransferStep == CTStep_BakeCooling_Measurement) |
| | | && !rmd.armState[0] && pLoadPorts[s]->isEnable() |
| | | && !rmd.armState[0] && pLoadPorts[p]->isEnable() |
| | | && (pt == PortType::Unloading || pt == PortType::Both) |
| | | && pLoadPorts[s]->getPortStatus() == PORT_INUSE) { |
| | | && pLoadPorts[p]->getPortStatus() == PORT_INUSE) { |
| | | for (int slot = 0; slot < SLOT_MAX; slot++) { |
| | | if (slot != m_nContinuousWorkingSlot) continue; |
| | | m_pActiveRobotTask = createTransferTask_continuous_transfer(pMeasurement, |
| | | 0, pLoadPorts[s], slot); |
| | | 0, pLoadPorts[p], slot); |
| | | if (m_pActiveRobotTask != nullptr) { |
| | | m_nContinuousTransferStep = CTStep_Measurement_LoadPort; |
| | | m_nContinuousTransferStep = CTStep_end; |
| | |
| | | } |
| | | |
| | | // LoadPort -> Aligner |
| | | for (int s = 0; s < 4; s++) { |
| | | PortType pt = pLoadPorts[s]->getPortType(); |
| | | for (int p = 0; p < 4; p++) { |
| | | PortType pt = pLoadPorts[p]->getPortType(); |
| | | if ((m_nContinuousTransferStep == CTStep_Unknow || m_nContinuousTransferStep == CTStep_end) |
| | | && !rmd.armState[0] && pLoadPorts[s]->isEnable() |
| | | && !rmd.armState[0] && pLoadPorts[p]->isEnable() |
| | | && (pt == PortType::Loading || pt == PortType::Both) |
| | | && pLoadPorts[s]->getPortStatus() == PORT_INUSE) { |
| | | && pLoadPorts[p]->getPortStatus() == PORT_INUSE) { |
| | | for (int slot = 0; slot < SLOT_MAX; slot++) { |
| | | m_pActiveRobotTask = createTransferTask_continuous_transfer(pLoadPorts[s], |
| | | m_pActiveRobotTask = createTransferTask_continuous_transfer(pLoadPorts[p], |
| | | slot, pAligner, 0); |
| | | if (m_pActiveRobotTask != nullptr) { |
| | | m_nContinuousTransferStep = CTStep_LoadPort_Aligner; |
| | | m_nContinuousWorkingPort = p; |
| | | m_nContinuousWorkingSlot = slot; |
| | | LOGI("<ContinuousTransfer>千传测试,开始搬送任务(LoadPort -> Aligner)..."); |
| | | pEFEM->setContext(m_pActiveRobotTask->getContext()); |
| | | goto CT_PORT_GET; |
| | |
| | | pTarSlot = pTarEq->getAvailableSlotForGlass(primaryType); |
| | | pSrcSlot = pSrcEq->getProcessedSlot(primaryType, bJobMode); |
| | | if (m_nTestFlag == 1) LOGD("createTransferTask 003 %x, %x", pTarSlot, pSrcSlot); |
| | | if (pSrcSlot == nullptr || nullptr == pTarSlot && secondaryType != SERVO::MaterialsType::G0) { |
| | | if ((pSrcSlot == nullptr || nullptr == pTarSlot) && secondaryType != SERVO::MaterialsType::G0) { |
| | | pTarSlot = pTarEq->getAvailableSlotForGlass(secondaryType); |
| | | pSrcSlot = pSrcEq->getProcessedSlot(secondaryType, bJobMode); |
| | | } |
| | |
| | | return nullptr; |
| | | } |
| | | |
| | | bool CMaster::canCreateControlJob() |
| | | { |
| | | return m_pControlJob == nullptr; |
| | | } |
| | | |
| | | bool CMaster::canCompleteControlJob() |
| | | { |
| | | return m_pControlJob != nullptr && m_state == SERVO::MASTERSTATE::READY; |
| | | } |
| | | |
| | | bool CMaster::canDeleteControlJob() |
| | | { |
| | | return m_pControlJob != nullptr |
| | | && m_pControlJob->state() == CJState::NoState |
| | | && m_state == SERVO::MASTERSTATE::READY; |
| | | } |
| | | |
| | | int CMaster::getWipGlasses(std::vector<CGlass*>& glasses) |
| | | { |
| | | for (auto eq : m_listEquipment) { |
| | |
| | | m_strLastError = "AOI检测未通过."; |
| | | } |
| | | } |
| | | |
| | | bool CMaster::moveGlassToBuf(int eqid, int slotNo) |
| | | { |
| | | CEquipment* pEquipment = getEquipment(eqid); |
| | | if (pEquipment == nullptr) return false; |
| | | |
| | | CSlot* pSlot = pEquipment->getSlotWithNo(slotNo); |
| | | if (pSlot == nullptr) return false; |
| | | |
| | | CGlass* pGlass = (CGlass*)pSlot->getContext(); |
| | | m_bufGlass.push_back(pGlass); |
| | | pGlass->addRef(); |
| | | pSlot->setContext(nullptr); |
| | | |
| | | m_bDataModify = TRUE; |
| | | if (m_listener.onEqDataChanged != nullptr) { |
| | | m_listener.onEqDataChanged(this, pEquipment, 0); |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | bool CMaster::moveGlassToSlot(int eqid, int slotNo) |
| | | { |
| | | CEquipment* pEquipment = getEquipment(eqid); |
| | | if (pEquipment == nullptr) return false; |
| | | |
| | | CSlot* pSlot = pEquipment->getSlotWithNo(slotNo); |
| | | if (pSlot == nullptr) return false; |
| | | if (m_bufGlass.empty()) return false; |
| | | |
| | | CGlass* pGlass = m_bufGlass.front(); |
| | | m_bufGlass.pop_front(); |
| | | if (pGlass == nullptr) return false; |
| | | pSlot->setContext(pGlass); |
| | | pGlass->release(); |
| | | |
| | | m_bDataModify = TRUE; |
| | | if (m_listener.onEqDataChanged != nullptr) { |
| | | m_listener.onEqDataChanged(this, pEquipment, 0); |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | } |