mrDarker
2025-06-16 56fd8f57fcc763ae079ae752d82e41b38d7d9e5f
SourceCode/Bond/Servo/CMaster.cpp
@@ -160,9 +160,9 @@
      ASSERT(pMeasurement);
      pEfem->setPort(0, pPort1);
      pEfem->setPort(1, pPort1);
      pEfem->setPort(2, pPort1);
      pEfem->setPort(3, pPort1);
      pEfem->setPort(1, pPort2);
      pEfem->setPort(2, pPort3);
      pEfem->setPort(3, pPort4);
      pEfem->setFliper(pFliper);
      pEfem->setAligner(pAligner);
      pEfem->setArmTray(0, pArmTray1);
@@ -395,7 +395,7 @@
         PORT_PUT:
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -409,7 +409,7 @@
            // BakeCooling ->Measurement
            m_pActiveRobotTask = createTransferTask_bakecooling_to_measurement(pBakeCooling, pMeasurement);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -424,7 +424,7 @@
            // Bake -> Cooling
            m_pActiveRobotTask = createTransferTask_bake_to_cooling(pBakeCooling);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -438,7 +438,7 @@
            // Bonder -> BakeCooling
            m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder1, pBakeCooling);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -450,7 +450,7 @@
            m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder2, pBakeCooling);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -464,7 +464,7 @@
            // VacuumBake(G1) -> Bonder
            m_pActiveRobotTask = createTransferTask(pFliper, pBonder1, primaryType, secondaryType, 2);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -476,7 +476,7 @@
            m_pActiveRobotTask = createTransferTask(pFliper, pBonder2, primaryType, secondaryType, 2);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -488,7 +488,7 @@
            m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder1, primaryType, secondaryType);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -500,7 +500,7 @@
            m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder2, primaryType, secondaryType);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -514,7 +514,7 @@
            // Aligner -> VacuumBake(G1)
            m_pActiveRobotTask = createTransferTask(pAligner, pFliper, primaryType, secondaryType, 2);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -526,7 +526,7 @@
            m_pActiveRobotTask = createTransferTask(pAligner, pVacuumBake, primaryType, secondaryType);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -551,7 +551,7 @@
PORT_GET:
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -586,16 +586,24 @@
         // 读标志位
         for (auto item : m_listEquipment) {
            if (item->getID() == EQ_ID_Bonder1 ||
               item->getID() == EQ_ID_Bonder2) {
               const StationIdentifier& station = item->getStation();
               MemoryBlock& block = item->getReadBitBlock();
            //if (item->getID() == EQ_ID_Bonder1 ||
            //   item->getID() == EQ_ID_Bonder2) {
            //   const StationIdentifier& station = item->getStation();
            //   MemoryBlock& block = item->getReadBitBlock();
               int nRet = m_cclink.ReadData2(station, (DeviceType)block.type,
                  block.start, block.size, block.buffer);
               if (0 == nRet) {
                  item->onReceiveLBData(block.buffer, block.size);
               }
            //   int nRet = m_cclink.ReadData2(station, (DeviceType)block.type,
            //      block.start, block.size, block.buffer);
            //   if (0 == nRet) {
            //      item->onReceiveLBData(block.buffer, block.size);
            //   }
            //}
            const StationIdentifier& station = item->getStation();
            MemoryBlock& block = item->getReadBitBlock();
            int nRet = m_cclink.ReadData2(station, (DeviceType)block.type,
               block.start, block.size, block.buffer);
            if (0 == nRet) {
               item->onReceiveLBData(block.buffer, block.size);
            }
         }
      }
@@ -677,17 +685,24 @@
         BOOL bOk = FALSE;
         lock();
         if (m_pActiveRobotTask != nullptr) {
            if (m_pActiveRobotTask->getTarPosition() == p->getID()) {
            // 是否已经进入手臂(即取片完成),进入下一步,放片
            if (m_pActiveRobotTask->isPicking() &&
               ((m_pActiveRobotTask->getArmNo() == 1 && p->getID() == EQ_ID_ARM_TRAY1)
               || (m_pActiveRobotTask->getArmNo() == 2 && p->getID() == EQ_ID_ARM_TRAY2))
               ) {
               slot = 1;
               bOk = TRUE;
            }
            // 是否放片完成
            else if (m_pActiveRobotTask->isPlacing() &&
               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();
@@ -710,21 +725,30 @@
         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()) {
            if (m_pActiveRobotTask != nullptr
               && m_pActiveRobotTask->isPicking()
               && ((m_pActiveRobotTask->getArmNo() == 1 && p->getID() == EQ_ID_ARM_TRAY1)
                  || (m_pActiveRobotTask->getArmNo() == 2 && p->getID() == EQ_ID_ARM_TRAY2))
               ) {
               LOGI("取片完成.");
               m_pActiveRobotTask->fetchOut();
               m_pActiveRobotTask->place();
            }
            else if (m_pActiveRobotTask != nullptr
               && m_pActiveRobotTask->isPlacing()
               && m_pActiveRobotTask->getTarPosition() == p->getID()) {
               m_pActiveRobotTask->stored();
               m_pActiveRobotTask->completed();
               LOGI("放片完成...");
               // 完成此条搬送任务,但要把数据和消息上抛应用层
               unlock();
               lock();
@@ -809,7 +833,7 @@
      pEquipment->setBaseAlarmId(BASE_ALARM_EFEM);
      pEquipment->setName("VacuumBake(G1)");
      pEquipment->setDescription("VacuumBake(G1).");
      pEquipment->setReadBitBlock(0x4000, 0x45ff);
      pEquipment->setReadBitBlock(0x5c00, 0x66ff);
      pEquipment->setStation(0, 255);
      addToEquipmentList(pEquipment);
@@ -920,7 +944,7 @@
      pEquipment->setBaseAlarmId(BASE_ALARM_EFEM);
      pEquipment->setName("BakeCooling");
      pEquipment->setDescription("BakeCooling.");
      pEquipment->setReadBitBlock(0x4000, 0x45ff);
      pEquipment->setReadBitBlock(0x5100, 0x5bff);
      pEquipment->setStation(0, 255);
      addToEquipmentList(pEquipment);
@@ -1161,11 +1185,14 @@
      if (pSrcSlot != nullptr && nullptr != pTarSlot) {
         int srcPos, srcSlot, tarPos, tarSlot;
         transformPosAndSlot(pSrcSlot->getPosition(), pSrcSlot->getNo(), srcPos, srcSlot);
         transformPosAndSlot(pTarSlot->getPosition(), pTarSlot->getNo(), tarPos, tarSlot);
         pTask = new CRobotTask();
         pTask->setContext(pSrcSlot->getContext());
         pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
         pTask->setRobotTransferParam(++taskSeqNo, armNo, pSrcSlot->getPosition(),
            pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
         taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, armNo, srcPos,
            tarPos, srcSlot, tarSlot);
      }
@@ -1182,11 +1209,14 @@
      pSrcSlot = pSrcEq->getProcessedSlot(MaterialsType::G1);
      if (pSrcSlot != nullptr && nullptr != pTarSlot) {
         int srcPos, srcSlot, tarPos, tarSlot;
         transformPosAndSlot(pSrcSlot->getPosition(), pSrcSlot->getNo(), srcPos, srcSlot);
         transformPosAndSlot(pTarSlot->getPosition(), pTarSlot->getNo(), tarPos, tarSlot);
         pTask = new CRobotTask();
         pTask->setContext(pSrcSlot->getContext());
         pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
         pTask->setRobotTransferParam(++taskSeqNo, 1, pSrcSlot->getPosition(),
            pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
         taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, srcPos,
            tarPos, srcSlot, tarSlot);
      }
@@ -1204,11 +1234,14 @@
      pSrcSlot = pSrcEq->getProcessedSlot2(MaterialsType::G1, slotsSrc);
      if (pSrcSlot != nullptr && nullptr != pTarSlot) {
         int srcPos, srcSlot, tarPos, tarSlot;
         transformPosAndSlot(pSrcSlot->getPosition(), pSrcSlot->getNo(), srcPos, srcSlot);
         transformPosAndSlot(pTarSlot->getPosition(), pTarSlot->getNo(), tarPos, tarSlot);
         pTask = new CRobotTask();
         pTask->setContext(pSrcSlot->getContext());
         pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
         pTask->setRobotTransferParam(++taskSeqNo, 1, pSrcSlot->getPosition(),
            pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
         taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, srcPos,
            tarPos, srcSlot, tarSlot);
      }
@@ -1225,15 +1258,68 @@
      pSrcSlot = pSrcEq->getProcessedSlot2(MaterialsType::G1, slots);
      if (pSrcSlot != nullptr && nullptr != pTarSlot) {
         int srcPos, srcSlot, tarPos, tarSlot;
         transformPosAndSlot(pSrcSlot->getPosition(), pSrcSlot->getNo(), srcPos, srcSlot);
         transformPosAndSlot(pTarSlot->getPosition(), pTarSlot->getNo(), tarPos, tarSlot);
         pTask = new CRobotTask();
         pTask->setContext(pSrcSlot->getContext());
         pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
         pTask->setRobotTransferParam(++taskSeqNo, 1, pSrcSlot->getPosition(),
            pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
         taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, srcPos,
            tarPos, srcSlot, tarSlot);
      }
      return pTask;
   }
   void CMaster::transformPosAndSlot(int srcPos, int srcSlot, int& tarPos, int& tarSlot)
   {
      switch (srcPos)
      {
      case EQ_ID_LOADPORT1:
      case EQ_ID_LOADPORT2:
      case EQ_ID_LOADPORT3:
      case EQ_ID_LOADPORT4:
      case EQ_ID_ARM_TRAY1:
      case EQ_ID_ARM_TRAY2:
      case EQ_ID_ALIGNER:
      case EQ_ID_FLIPER:
         tarPos = srcPos;
         tarSlot = 1;
         break;
      case EQ_ID_Bonder1:
         if (1 <= srcSlot && srcSlot <= 2) {
            tarPos = 9 + srcSlot;
            tarSlot = 1;
         }
         break;
      case EQ_ID_Bonder2:
         if (1 <= srcSlot && srcSlot <= 2) {
            tarPos = 11 + srcSlot;
            tarSlot = 1;
         }
         break;
      case EQ_ID_VACUUMBAKE:
         if (1 <= srcSlot && srcSlot <= 2) {
            tarPos = 13 + srcSlot;
            tarSlot = 1;
         }
         break;
      case EQ_ID_BAKE_COOLING:
         if (1 <= srcSlot && srcSlot <= 4) {
            tarPos = 15 + srcSlot;
            tarSlot = 1;
         }
         break;
      case EQ_ID_MEASUREMENT:
         tarPos = 19;
         tarSlot = 1;
         break;
      default:
         tarPos = srcPos;
         tarSlot = srcSlot;
         break;
      }
   }
   int CMaster::abortCurrentTask()
@@ -1260,4 +1346,18 @@
      return 0;
   }
   void CMaster::setPortType(unsigned int index, BOOL enable, int type, int mode,
      int cassetteType, int transferMode, BOOL autoChangeEnable)
   {
      ASSERT(index < 4);
      int eqid[] = { EQ_ID_LOADPORT1, EQ_ID_LOADPORT2, EQ_ID_LOADPORT3, EQ_ID_LOADPORT4};
      CLoadPort* pPort = (CLoadPort*)getEquipment(eqid[index]);
      pPort->localEanblePort(enable);
      pPort->localSetPortType((SERVO::PortType)type);
      pPort->localSetPortMode((SERVO::PortMode)mode);
      pPort->localSetCessetteType((SERVO::CassetteType)cassetteType);
      pPort->localSetTransferMode((SERVO::TransferMode)transferMode);
      pPort->localAutoChangeEnable(autoChangeEnable);
   }
}