From 9e25e06d7ec9d7cd1c31a9d30a8a018e2af63e3a Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期五, 29 八月 2025 11:28:16 +0800
Subject: [PATCH] 1.Port Unload Ready,事件的上报,EAP模拟程序观察验证数据;

---
 SourceCode/Bond/Servo/CMaster.cpp |  140 ++++++++++++++++++++++++++++++++++++----------
 1 files changed, 110 insertions(+), 30 deletions(-)

diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index e574cd6..1716f9a 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -63,6 +63,7 @@
 		m_nContinuousTransferCount = 0;
 		m_nContinuousTransferStep = CTStep_Unknow;
 		m_pControlJob = nullptr;
+		m_nTestFlag = 0;
 		InitializeCriticalSection(&m_criticalSection);
 	}
 
@@ -598,23 +599,38 @@
 
 				// 此处检测优先类型和次要类型(G1或G2)
 				// 如果其中一Bonder有单个玻璃,优先取它的配对类型,否则无所谓了
-				primaryType = MaterialsType::G1;
-				secondaryType = MaterialsType::G2;
-				if ((!pBonder1->canPlaceGlassInSlot(0) && !pBonder1->canPlaceGlassInSlot(1))
-					&& (!pBonder2->canPlaceGlassInSlot(0) && !pBonder2->canPlaceGlassInSlot(1))) {
-					// 如果G1和G2都满了,那就看Aligner, 如果Aligner有玻璃为G1, 则取G2
-					CGlass* pGlass = pAligner->getGlassFromSlot(1);
-					if (pGlass != nullptr && pGlass->getType() == MaterialsType::G1) {
-						primaryType = MaterialsType::G2;
-						secondaryType = MaterialsType::G1;
-					}
-				}
-				else if ((pBonder1->canPlaceGlassInSlot(0) && !pBonder1->canPlaceGlassInSlot(1))
-					|| (pBonder2->canPlaceGlassInSlot(0) && !pBonder2->canPlaceGlassInSlot(1))) {
-					primaryType = MaterialsType::G2;
-					secondaryType = MaterialsType::G1;
-				}
+				primaryType = MaterialsType::G2;
+				secondaryType = MaterialsType::G1;
 
+
+				if (!pBonder1->canPlaceGlassInSlot(0) && pBonder1->canPlaceGlassInSlot(1)) {
+					// 如果Bonder1有G2了,则取G1
+					primaryType = MaterialsType::G1;
+					secondaryType = MaterialsType::G0;
+				}
+				else if (!pBonder2->canPlaceGlassInSlot(0) && pBonder2->canPlaceGlassInSlot(1)) {
+					// 如果Bonder2有G2了,则取G1
+					primaryType = MaterialsType::G1;
+					secondaryType = MaterialsType::G0;
+				}
+				else if (!pFliper->canPlaceGlassInSlot(0)) {
+					primaryType = MaterialsType::G1;
+					secondaryType = MaterialsType::G0;
+				}
+				else if (pBonder1->canPlaceGlassInSlot(0)) {
+					// 如果Bonder1没有G2, 则先G2
+					primaryType = MaterialsType::G2;
+					secondaryType = MaterialsType::G0;
+				}
+				else if (pBonder2->canPlaceGlassInSlot(0)) {
+					// 如果Bonder2没有G2, 则先G2
+					primaryType = MaterialsType::G2;
+					secondaryType = MaterialsType::G0;
+				}
+				else {
+					primaryType = MaterialsType::G2;
+					secondaryType = MaterialsType::G0;
+				}
 
 				// Measurement -> LoadPort
 				if (rmd.armState[0] || rmd.armState[1]) {
@@ -674,24 +690,29 @@
 
 				// Fliper(G2) -> Bonder
 				auto pSrcSlot = pVacuumBake->getProcessedSlot(primaryType);
-				if (pSrcSlot != nullptr && !rmd.armState[1] && !pBonder1->hasBondClass()) {
-					m_pActiveRobotTask = createTransferTask(pFliper, pBonder1, primaryType, secondaryType, 2);
+				//LOGI("<Master>pSrcSlot = %x, primaryType:%d", pSrcSlot, primaryType);
+				if (pSrcSlot != nullptr && !rmd.armState[1]
+					&& pBonder1->canPlaceGlassInSlot(0)
+					&& !pBonder1->hasBondClass()) {
+					m_pActiveRobotTask = createTransferTask(pFliper, pBonder1, MaterialsType::G2, MaterialsType::G0, 2);
 					CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
 				}
-				if (pSrcSlot != nullptr && !rmd.armState[1] && !pBonder2->hasBondClass()) {
-					m_pActiveRobotTask = createTransferTask(pFliper, pBonder2, primaryType, secondaryType, 2);
+				if (pSrcSlot != nullptr && !rmd.armState[1] 
+					&& pBonder2->canPlaceGlassInSlot(0)
+					&& !pBonder2->hasBondClass()) {
+					m_pActiveRobotTask = createTransferTask(pFliper, pBonder2, MaterialsType::G2, MaterialsType::G0, 2);
 					CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
 				}
 
 
 				// VacuumBake(G1) -> Bonder
 				if (!rmd.armState[0] && !pBonder1->hasBondClass()) {
-					m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder1, primaryType, secondaryType);
+					m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder1, MaterialsType::G1, MaterialsType::G0);
 					CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
 				}
 
 				if (!rmd.armState[0] && !pBonder2->hasBondClass()) {
-					m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder2, primaryType, secondaryType);
+					m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder2, MaterialsType::G1, MaterialsType::G0);
 					CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
 				}
 
@@ -704,8 +725,11 @@
 				}
 
 				if (!rmd.armState[0]) {
+					// m_nTestFlag = 1;
+					if (m_nTestFlag == 1) LOGI("createTransferTask 004df %d, %d", primaryType, secondaryType);
 					m_pActiveRobotTask = createTransferTask(pAligner, pVacuumBake, primaryType, secondaryType);
 					CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
+					m_nTestFlag = 0;
 				}
 
 
@@ -1393,6 +1417,7 @@
 					if (m_pActiveRobotTask->getSrcPosition() == EQ_ID_MEASUREMENT) {
 						CGlass* pGlass = (CGlass*)m_pActiveRobotTask->getContext();
 						pGlass->complete();
+						this->saveState();
 						bool bMoved = glassFromInPorcessToComplete(pGlass);
 						if (bMoved) {
 							LOGI("<Master>Glass(%s)从工艺列队到完成列队转移成功.",
@@ -1409,10 +1434,22 @@
 						// 检查PJ是否已经完成
 						CProcessJob* pJob = getGlassProcessJob((CGlass*)m_pActiveRobotTask->getContext());
 						if (pJob != nullptr && checkAndUpdatePjComplete(pJob)) {
+							this->saveState();
 							LOGE("<Master>ProcessJob(%s)完成.",
 								pJob->id().c_str());
 							if (m_listener.onPjEnd != nullptr) {
 								m_listener.onPjEnd(this, pJob);
+							}
+
+							// 检查CJ是否已经完成
+							ASSERT(m_pControlJob);
+							if (checkAndUpdateCjComplete(m_pControlJob)) {
+								this->saveState();
+								LOGE("<Master>ControlJob(%s)完成.",
+									m_pControlJob->id().c_str());
+								if (m_listener.onCjEnd != nullptr) {
+									m_listener.onCjEnd(this, pJob);
+								}
 							}
 						}
 					}
@@ -1730,6 +1767,7 @@
 				CGlass* pGlass = m_queueGlasses.front();
 				pGlass->start();
 				glassFromQueueToInPorcess(pGlass);
+				this->saveState();
 
 				// 这里上报Panel Start事件
 				if (m_listener.onPanelStart != nullptr) {
@@ -1743,6 +1781,7 @@
 				CGlass* pGlass = m_inProcesGlasses.front();
 				pGlass->complete();
 				glassFromInPorcessToComplete(pGlass);
+				this->saveState();
 
 				// 这里上报Panel End事件
 				if (m_listener.onPanelEnd != nullptr) {
@@ -1751,10 +1790,23 @@
 
 				CProcessJob* pJob = getGlassProcessJob(pGlass);
 				if (pJob != nullptr && checkAndUpdatePjComplete(pJob)) {
+					processJobFromInPorcessToComplete(pJob);
+					this->saveState();
 					LOGE("<Master>ProcessJob(%s)完成.",
 						pJob->id().c_str());
 					if (m_listener.onPjEnd != nullptr) {
 						m_listener.onPjEnd(this, pJob);
+					}
+
+					// 检查CJ是否已经完成
+					ASSERT(m_pControlJob);
+					if (checkAndUpdateCjComplete(m_pControlJob)) {
+						this->saveState();
+						LOGE("<Master>ControlJob(%s)完成.",
+							m_pControlJob->id().c_str());
+						if (m_listener.onCjEnd != nullptr) {
+							m_listener.onCjEnd(this, pJob);
+						}
 					}
 				}
 			}
@@ -1929,16 +1981,17 @@
 		if (!pSrcEq->IsEnabled()) { 
 			return nullptr;
 		}
-
 		CRobotTask* pTask = nullptr;
 		CSlot* pSrcSlot, * pTarSlot;
+		pSrcEq->m_nTestFlag = m_nTestFlag;
 		pTarSlot = pTarEq->getAvailableSlotForGlass(primaryType);
 		pSrcSlot = pSrcEq->getProcessedSlot(primaryType, bJobMode);
-		if (pSrcSlot == nullptr || nullptr == pTarSlot) {
+		if (m_nTestFlag == 1) LOGI("createTransferTask 003 %x, %x", pTarSlot, pSrcSlot);
+		if (pSrcSlot == nullptr || nullptr == pTarSlot && secondaryType != SERVO::MaterialsType::G0) {
 			pTarSlot = pTarEq->getAvailableSlotForGlass(secondaryType);
 			pSrcSlot = pSrcEq->getProcessedSlot(secondaryType, bJobMode);
 		}
-
+		if (m_nTestFlag == 1) LOGI("createTransferTask 004 %x, %x", pTarSlot, pSrcSlot);
 
 		if (pSrcSlot != nullptr && nullptr != pTarSlot) {
 			pTask = new CRobotTask();
@@ -2458,8 +2511,8 @@
 		for (const auto pj : pjs) {
 			if (pj->state() == PJState::Queued) {
 				pj->start();
+				return pj;
 			}
-			return pj;
 		}
 
 
@@ -2533,6 +2586,17 @@
 		return false;
 	}
 
+	bool CMaster::processJobFromInPorcessToComplete(CProcessJob* pProcessJob)
+	{
+		auto it = std::find(m_inProcesJobs.begin(), m_inProcesJobs.end(), pProcessJob);
+		if (it != m_inProcesJobs.end()) {
+			m_completeProcessJobs.push_back(*it);
+			m_inProcesJobs.erase(it);
+			return true;
+		}
+		return false;
+	}
+
 	bool CMaster::checkAndUpdatePjComplete(CProcessJob* pJob)
 	{
 		ASSERT(pJob);
@@ -2541,10 +2605,26 @@
 
 		for (auto c : pJob->carriers()) {
 			for (auto g : c.contexts) {
-				CGlass* pGlass = (CGlass*)g;
-				if (pGlass->state() != GlsState::Aborted
-					&& pGlass->state() != GlsState::Completed
-					&& pGlass->state() != GlsState::Failed) return false;
+				auto state = ((CGlass*)g)->state();
+				if (state != GlsState::Aborted && state != GlsState::Completed
+					&& state != GlsState::Failed) return false;
+			}
+		}
+
+		return pJob->complete();
+	}
+
+	bool CMaster::checkAndUpdateCjComplete(CControlJob* pJob)
+	{
+		ASSERT(pJob);
+		auto state = pJob->state();
+		if (state != CJState::Executing && state != CJState::Paused) return false;
+
+		for (auto pj : pJob->getPjs()) {
+			auto state = pj->state();
+			if (state != PJState::Aborted && state != PJState::Completed
+				&& state != PJState::Failed) {
+				return false;
 			}
 		}
 

--
Gitblit v1.9.3