LAPTOP-SNT8I5JK\Boounion
2025-06-05 65802dfbbaf135e97a2415e3306aabfd2af49c69
SourceCode/Bond/Servo/CEquipment.cpp
@@ -35,6 +35,7 @@
      m_bLocalAlarm = FALSE;
      m_bAutoRecipeChange = FALSE;
      m_bVCREnable[0] = FALSE;
      memset(m_bLinkSignal, 0, sizeof(m_bLinkSignal));
      m_pCclink = nullptr;
      m_nBaseAlarmId = 0;
      m_pArm = nullptr;
@@ -326,7 +327,7 @@
      else {
         for (int i = 0; i < SLOT_MAX; i++) {
            m_slot[i].serialize(ar);
            if (m_slot[i].getContext() != nullptr) {
            if (m_slot[i].getTempContext() != nullptr) {
               CGlass* pGlass = theApp.m_model.m_glassPool.allocaGlass();
               pGlass->serialize(ar);
               m_slot[i].setContext(pGlass);
@@ -363,9 +364,19 @@
      }
      */
      // 以下解释和处理数据
      // 连接信号解释和保存
      BOOL bFlag;
      int index = 0x540;
      int index = 0;
      for (int i = 0; i < 8; i++) {
         m_bLinkSignal[i][SIGNAL_UPSTREAM_INLINE] = isBitOn(pszData, size, index + 0);
         m_bLinkSignal[i][SIGNAL_UPSTREAM_TROUBLE] = isBitOn(pszData, size, index + 1);
         m_bLinkSignal[i][SIGNAL_SEND_ABLE] = isBitOn(pszData, size, index + 3);
         index += 0x40;
      }
      // 其它信号及响应
      index = 0x540;
      // alive
@@ -582,6 +593,20 @@
      return m_bVCREnable[index];
   }
   BOOL CEquipment::isLinkSignalOn(unsigned int path, unsigned int signal)
   {
      if (path >= PATH_MAX) return FALSE;
      if (signal >= SIGNAL_MAX) return FALSE;
      return m_bLinkSignal[path][signal];
   }
   void CEquipment::setLinkSignal(unsigned int path, unsigned int signal, BOOL bOn)
   {
      if (path >= PATH_MAX) return;
      if (signal >= SIGNAL_MAX) return;
      m_bLinkSignal[path][signal] = bOn;
   }
   int CEquipment::onStepEvent(CStep* pStep, int code)
   {
      if (code == STEP_EVENT_READDATA) {
@@ -722,6 +747,7 @@
         CGlass* pGlass = (CGlass*)m_slot[i].getContext();
         if (pGlass != nullptr && compareJobDataB(pJobDataB, pGlass->getJobDataB())) {
            pContext = pGlass;
            if (pGlass != nullptr) pGlass->addRef();
            m_slot[i].setContext(nullptr);
            break;
         }
@@ -737,7 +763,6 @@
         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;
            }
@@ -756,7 +781,7 @@
      return 0;
   }
   int CEquipment::storedJob(CJobDataB* pJobDataB, short& putSlot)
   int CEquipment::storedJob(CJobDataB* pJobDataB, short putSlot)
   {
      if (m_pArm == nullptr) {
         return -1;
@@ -770,23 +795,26 @@
      ASSERT(pGlass);
      Lock();
      pGlass->addPath(m_nID);
      pGlass->addPath(m_nID, getSlotUnit(putSlot));
      m_slot[putSlot - 1].setContext(pGlass);
      pGlass->release();            // tempFetchOut需要调用一次release
      Unlock();
      // 如果此玻璃已经贴合,贴合的玻璃也要从加入到列表中
      /*
      CGlass* pBuddy = pGlass->getBuddy();
      if (pBuddy != nullptr) {
         Lock();
         pBuddy->addPath(m_nID);
         pBuddy->addRef();               // 加入list,addRef
         m_glassList.push_back(pBuddy);
         pBuddy->addPath(m_nID, 0);
         if (putSlot % 2 == 0) {
            m_slot[putSlot - 2].setContext(pBuddy);
         }
         else {
            m_slot[putSlot].setContext(pBuddy);
         }
         Unlock();
      }
      */
      if (m_listener.onDataChanged != nullptr) {
         m_listener.onDataChanged(this, EDCC_STORED_JOB);
@@ -804,6 +832,20 @@
      }
      return FALSE;
   }
   CGlass* CEquipment::getGlass(const char* pszGlassId)
   {
      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;
         if (pGlass->getID().compare(pszGlassId) == 0) {
            return pGlass;
         }
      }
      return nullptr;
   }
   bool CEquipment::isAlarmStep(SERVO::CStep* pStep)
@@ -1051,6 +1093,27 @@
      return nullptr;
   }
   CSlot* CEquipment::getAvailableSlotForGlass2(MaterialsType type, const std::vector<int>& candidates)
   {
      for (auto item : candidates) {
         for (int i = 0; i < SLOT_MAX; i++) {
            if (item == i + 1) {
               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++) {
@@ -1062,6 +1125,25 @@
         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;
   }
   CSlot* CEquipment::getProcessedSlot(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;
         if (!pGlass->isProcessed(m_nID, 0)) continue;
         return &m_slot[i];
      }
@@ -1384,6 +1466,7 @@
   int CEquipment::onProcessData(CProcessData* pProcessData)
   {
      LOGI("<CEquipment-%s>onProcessData.", m_strName.c_str());
      return 0;
   }