SourceCode/Bond/Servo/CMaster.cpp
@@ -47,6 +47,7 @@
      m_ullStartTime = 0;
      m_ullRunTime = 0;
      m_state = MASTERSTATE::READY;
      m_pActiveRobotTask = nullptr;
      InitializeCriticalSection(&m_criticalSection);
   }
@@ -88,6 +89,11 @@
      m_listener.onEqAlarm = listener.onEqAlarm;
      m_listener.onEqVcrEventReport = listener.onEqVcrEventReport;
      m_listener.onEqDataChanged = listener.onEqDataChanged;
   }
   CRobotTask* CMaster::getActiveRobotTask()
   {
      return m_pActiveRobotTask;
   }
   int CMaster::init()
@@ -222,6 +228,12 @@
      }
      saveCache();
      lock();
      if (m_pActiveRobotTask != nullptr) {
         delete m_pActiveRobotTask;
         m_pActiveRobotTask = nullptr;
      }
      unlock();
      for (auto item : m_listEquipment) {
         delete item;
@@ -304,7 +316,83 @@
         else if (m_state == MASTERSTATE::RUNNING) {
            unlock();
            LOGI("调度处理中...");
            Sleep(1000);
            lock();
            if (m_pActiveRobotTask != nullptr) {
               unlock();
               // 检测到当前有正在下午的任务,确保当前任务完成或中止后继续
               LOGI("检测到当前有正在下午的任务,确保当前任务完成或中止后继续...");
               continue;
            }
            // LoadPort -> Fliper(G2)
            CLoadPort* pLoadPort1 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT1);
            CLoadPort* pLoadPort2 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT2);
            CFliper* pFliper = (CFliper*)getEquipment(EQ_ID_FLIPER);
            CVacuumBake* pVacuumBack = (CVacuumBake*)getEquipment(EQ_ID_VACUUMBAKE);
            ASSERT(pLoadPort1);
            ASSERT(pLoadPort2);
            ASSERT(pFliper);
            ASSERT(pVacuumBack);
            m_pActiveRobotTask = createTransferTask(pLoadPort1, pFliper);
            if (m_pActiveRobotTask != nullptr) {
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               LOGI("创建新任务<%s>...", strDescription.c_str());
               continue;
            }
            m_pActiveRobotTask = createTransferTask(pLoadPort2, pFliper);
            if (m_pActiveRobotTask != nullptr) {
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               LOGI("创建新任务<%s>...", strDescription.c_str());
               continue;
            }
            // LoadPort -> VacuumBake(G1)
            m_pActiveRobotTask = createTransferTask(pLoadPort1, pVacuumBack);
            if (m_pActiveRobotTask != nullptr) {
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               LOGI("创建新任务1<%s>...", strDescription.c_str());
               continue;
            }
            m_pActiveRobotTask = createTransferTask(pLoadPort2, pVacuumBack);
            if (m_pActiveRobotTask != nullptr) {
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               LOGI("创建新任务2<%s>...", strDescription.c_str());
               continue;
            }
            // Fliper(G2) -> Aligner
            // VacuumBake(G1) -> Aligner
            // Aligner -> Bonder
            // Bonder -> BakeCooling
            // BakeCooling ->Measurement
            // Measurement -> LoadPort
            unlock();
         }
         unlock();
      }
@@ -377,11 +465,57 @@
            m_listener.onEqVcrEventReport(this, p, p2);
         }
      };
      listener.onPreFethedOutJob = [&](void* pEquipment, CJobDataB* pJobDataB) -> BOOL {
         CEquipment* p = (CEquipment*)pEquipment;
         // 取放片,更新当前搬送任务
         BOOL bOk = FALSE;
         lock();
         if (m_pActiveRobotTask != nullptr && m_pActiveRobotTask->getSrcPosition() == p->getID()) {
            CGlass* pGlass = p->getGlassFromSlot(m_pActiveRobotTask->getSrcSlot());
            if (pGlass != nullptr) {
               CJobDataB* pJobDataBSrc = pGlass->getJobDataB();
               if (pJobDataBSrc != nullptr
                  && pJobDataBSrc->getCassetteSequenceNo() == pJobDataB->getCassetteSequenceNo()
                  && pJobDataBSrc->getJobSequenceNo() == pJobDataB->getJobSequenceNo()) {
                  bOk = TRUE;
                  LOGI("<CMaster>onPreFethedOutJob, 已校验数据一致性.");
               }
            }
         }
         unlock();
         if (!bOk) {
            LOGE("<CMaster>onPreFethedOutJob, 数据校验失败.");
         }
         return bOk;
      };
      listener.onDataChanged = [&](void* pEquipment, int code) -> void {
         m_bDataModify = TRUE;
         CEquipment* p = (CEquipment*)pEquipment;
         if (m_listener.onEqDataChanged != nullptr) {
            m_listener.onEqDataChanged(this, p, 0);
         }
         // 取放片,更新当前搬送任务
         if (code == EDCC_FETCHOUT_JOB) {
            lock();
            if (m_pActiveRobotTask != nullptr && m_pActiveRobotTask->getSrcPosition() == p->getID()) {
               m_pActiveRobotTask->fetchOut();
               LOGI("开始取片...");
            }
            unlock();
         }
         else if (code == EDCC_STORED_JOB) {
            lock();
            if (m_pActiveRobotTask != nullptr && m_pActiveRobotTask->getTarPosition() == p->getID()) {
               m_pActiveRobotTask->stored();
               LOGI("放片完成...");
            }
            unlock();
         }
      };
@@ -793,4 +927,28 @@
         m_listener.onMasterStateChanged(this, m_state);
      }
   }
   static int taskSeqNo = 0;
   CRobotTask* CMaster::createTransferTask(CEquipment* pSrcEq, CEquipment* pTarEq)
   {
      CRobotTask* pTask = nullptr;
      CSlot* pSrcSlot, * pTarSlot;
      pTarSlot = pTarEq->getAvailableSlotForGlass(MaterialsType::G1);
      pSrcSlot = pSrcEq->getNonEmptySlot(MaterialsType::G1);
      if (pSrcSlot == nullptr || nullptr == pTarSlot) {
         pTarSlot = pTarEq->getAvailableSlotForGlass(MaterialsType::G2);
         pSrcSlot = pSrcEq->getNonEmptySlot(MaterialsType::G2);
      }
      if (pSrcSlot != nullptr && nullptr != pTarSlot) {
         pTask = new CRobotTask();
         pTask->setContext(pSrcSlot->getContext());
         pTask->setRobotTransferParam(++taskSeqNo, 1, pSrcSlot->getPosition(),
            pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
      }
      return pTask;
   }
}