LAPTOP-SNT8I5JK\Boounion
2025-06-03 61b2bfa09588f08accb13e98ee4cd73015cb2352
SourceCode/Bond/Servo/CMaster.cpp
@@ -33,7 +33,7 @@
   CMaster::CMaster()
   {
      m_listener = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr};
      m_listener = {};
      m_bDataModify = FALSE;
      m_hEventReadBitsThreadExit[0] = ::CreateEvent(NULL, TRUE, FALSE, NULL);
      m_hEventReadBitsThreadExit[1] = ::CreateEvent(NULL, TRUE, FALSE, NULL);
@@ -83,12 +83,7 @@
   void CMaster::setListener(MasterListener listener)
   {
      m_listener.onMasterStateChanged = listener.onMasterStateChanged;
      m_listener.onEqAlive = listener.onEqAlive;
      m_listener.onEqCimStateChanged = listener.onEqCimStateChanged;
      m_listener.onEqAlarm = listener.onEqAlarm;
      m_listener.onEqVcrEventReport = listener.onEqVcrEventReport;
      m_listener.onEqDataChanged = listener.onEqDataChanged;
      m_listener = listener;
   }
   CRobotTask* CMaster::getActiveRobotTask()
@@ -284,6 +279,19 @@
   unsigned CMaster::DispatchProc()
   {
      // 各种机器
      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);
      CAligner* pAligner = (CAligner*)getEquipment(EQ_ID_ALIGNER);
      ASSERT(pLoadPort1);
      ASSERT(pLoadPort2);
      ASSERT(pFliper);
      ASSERT(pVacuumBack);
      ASSERT(pAligner);
      while (1) {
         // 待退出信号或时间到
         HANDLE hEvents[] = { m_hEventDispatchThreadExit[0], m_hDispatchEvent };
@@ -315,30 +323,24 @@
         // 调度逻辑处理
         else if (m_state == MASTERSTATE::RUNNING) {
            unlock();
            LOGI("调度处理中...");
            // LOGI("调度处理中...");
            lock();
            if (m_pActiveRobotTask != nullptr) {
               unlock();
               // 检测到当前有正在下午的任务,确保当前任务完成或中止后继续
               LOGI("检测到当前有正在下午的任务,确保当前任务完成或中止后继续...");
               // 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();
               if (m_listener.onRobotTaskEvent != nullptr) {
                  m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
               }
               LOGI("创建新任务<%s>...", strDescription.c_str());
               continue;
            }
@@ -347,6 +349,9 @@
            if (m_pActiveRobotTask != nullptr) {
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
                  m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
               }
               LOGI("创建新任务<%s>...", strDescription.c_str());
               continue;
            }
@@ -358,7 +363,10 @@
            if (m_pActiveRobotTask != nullptr) {
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               LOGI("创建新任务1<%s>...", strDescription.c_str());
               if (m_listener.onRobotTaskEvent != nullptr) {
                  m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
               }
               LOGI("创建新任务<%s>...", strDescription.c_str());
               continue;
            }
@@ -366,16 +374,40 @@
            if (m_pActiveRobotTask != nullptr) {
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               LOGI("创建新任务2<%s>...", strDescription.c_str());
               if (m_listener.onRobotTaskEvent != nullptr) {
                  m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
               }
               LOGI("创建新任务<%s>...", strDescription.c_str());
               continue;
            }
            // Fliper(G2) -> Aligner
            // VacuumBake(G1) -> Aligner
            m_pActiveRobotTask = createTransferTask(pFliper, pAligner);
            if (m_pActiveRobotTask != nullptr) {
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
                  m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
               }
               LOGI("创建新任务<%s>...", strDescription.c_str());
               continue;
            }
            m_pActiveRobotTask = createTransferTask(pVacuumBack, pAligner);
            if (m_pActiveRobotTask != nullptr) {
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
                  m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
               }
               LOGI("创建新任务<%s>...", strDescription.c_str());
               continue;
            }
            // Fliper(G2) -> Aligner
            // VacuumBake(G1) -> Aligner
            // Aligner -> Bonder
@@ -469,19 +501,54 @@
         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()) {
         if (m_pActiveRobotTask != nullptr) {
            if (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, 已校验数据一致性.");
                  }
               }
            }
            else if (p->getID() == EQ_ID_ARM_TRAY1 || p->getID() == EQ_ID_ARM_TRAY2) {
               bOk = TRUE;
            }
         }
         unlock();
         if (!bOk) {
            LOGE("<CMaster>onPreFethedOutJob, 数据校验失败.");
         }
         return bOk;
      };
      listener.onPreStoredJob = [&](void* pEquipment, CJobDataB* pJobDataB, short& slot) -> BOOL {
         CEquipment* p = (CEquipment*)pEquipment;
         // 放片,更新当前搬送任务
         BOOL bOk = FALSE;
         lock();
         if (m_pActiveRobotTask != nullptr) {
            if (m_pActiveRobotTask->getTarPosition() == p->getID()) {
               CGlass* pGlass = p->getGlassFromSlot(m_pActiveRobotTask->getTarSlot());
               if (pGlass == nullptr) {
                  bOk = TRUE;
                  slot = m_pActiveRobotTask->getTarSlot();
                  LOGI("<CMaster>onPreFethedOutJob, 已校验数据一致性.");
               }
            }
            else if (p->getID() == EQ_ID_ARM_TRAY1 || p->getID() == EQ_ID_ARM_TRAY2) {
               slot = 1;
               bOk = TRUE;
            }
         }
         unlock();
@@ -513,7 +580,21 @@
            lock();
            if (m_pActiveRobotTask != nullptr && m_pActiveRobotTask->getTarPosition() == p->getID()) {
               m_pActiveRobotTask->stored();
               m_pActiveRobotTask->completed();
               LOGI("放片完成...");
               // 完成此条搬送任务,但要把数据和消息上抛应用层
               unlock();
               lock();
               delete m_pActiveRobotTask;
               m_pActiveRobotTask = nullptr;
               if (m_listener.onRobotTaskEvent != nullptr) {
                  m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
               }
            }
            unlock();
         }