From f2f77036149a57e84e9c75caa06e14158b502376 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期二, 26 八月 2025 17:46:44 +0800
Subject: [PATCH] 1.PJEnd事件上报功能实现,EAP模拟器接收数据并验证;

---
 SourceCode/Bond/Servo/CMaster.cpp |  102 +++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 95 insertions(+), 7 deletions(-)

diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index e6ed125..baf3806 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -939,15 +939,17 @@
 						&& pLoadPorts[s]->getPortStatus() == PORT_INUSE) {
 						m_pActiveRobotTask = createTransferTask(pLoadPorts[s], pAligner, primaryType, secondaryType, m_bJobMode);
 						if (m_pActiveRobotTask != nullptr) {
-							pEFEM->setContext(m_pActiveRobotTask->getContext());
-							bool bMoved = glassFromQueueToInPorcess((CGlass*)m_pActiveRobotTask->getContext());
+							CGlass* pGlass = (CGlass*)m_pActiveRobotTask->getContext();
+							pEFEM->setContext(pGlass);
+							pGlass->start();
+							bool bMoved = glassFromQueueToInPorcess(pGlass);
 							if (bMoved) {
 								LOGI("<Master>Glass(%s)从等待列队到工艺列队转移成功.",
-									((CGlass*)m_pActiveRobotTask->getContext())->getID().c_str());
+									pGlass->getID().c_str());
 							}
 							else {
 								LOGE("<Master>Glass(%s)从等待列队到工艺列队转移失败.",
-									((CGlass*)m_pActiveRobotTask->getContext())->getID().c_str());
+									pGlass->getID().c_str());
 							}
 
 							goto BATCH_PORT_GET;
@@ -1258,6 +1260,15 @@
 							bOk = TRUE;
 							LOGI("<CMaster>onPreFethedOutJob, 已校验数据一致性.");
 						}
+						LOGI("<CMaster>onPreFethedOutJob 0004.");
+						if (pJobDataS != nullptr) {
+							LOGI("<CMaster>onPreFethedOutJob 0005. %d,%d,%d,%d", 
+								pJobDataS->getCassetteSequenceNo(),
+								pJobDataB->getCassetteSequenceNo(),
+								pJobDataS->getJobSequenceNo(),
+								pJobDataB->getJobSequenceNo()
+								);
+						}
 					}
 				}
 				else if (p->getID() == EQ_ID_ARM_TRAY1 || p->getID() == EQ_ID_ARM_TRAY2) {
@@ -1371,16 +1382,29 @@
 
 					// 如果是搬送回从AOI搬送回Port, 则glass工艺完成
 					if (m_pActiveRobotTask->getSrcPosition() == EQ_ID_MEASUREMENT) {
-						bool bMoved = glassFromInPorcessToComplete((CGlass*)m_pActiveRobotTask->getContext());
+						CGlass* pGlass = (CGlass*)m_pActiveRobotTask->getContext();
+						pGlass->complete();
+						bool bMoved = glassFromInPorcessToComplete(pGlass);
 						if (bMoved) {
 							LOGI("<Master>Glass(%s)从工艺列队到完成列队转移成功.",
-								((CGlass*)m_pActiveRobotTask->getContext())->getID().c_str());
+								pGlass->getID().c_str());
 						}
 						else {
 							LOGE("<Master>Glass(%s)从工艺列队到完成列队转移失败.",
-								((CGlass*)m_pActiveRobotTask->getContext())->getID().c_str());
+								pGlass->getID().c_str());
+						}
+
+						// 检查PJ是否已经完成
+						CProcessJob* pJob = getGlassProcessJob((CGlass*)m_pActiveRobotTask->getContext());
+						if (pJob != nullptr && checkAndUpdatePjComplete(pJob)) {
+							LOGE("<Master>ProcessJob(%s)完成.",
+								pJob->id().c_str());
+							if (m_listener.onPjEnd != nullptr) {
+								m_listener.onPjEnd(this, pJob);
+							}
 						}
 					}
+
 
 
 					unlock();
@@ -1684,6 +1708,38 @@
 			}
 		}
 
+
+
+		// 模拟测试
+		/*
+		static int aaa = 0;
+		aaa++;
+		if (aaa % 30 == 0) {
+			if (!m_queueGlasses.empty()) {
+				CGlass* pGlass = m_queueGlasses.front();
+				pGlass->start();
+				glassFromQueueToInPorcess(pGlass);
+			}
+		}
+
+		if (aaa % 45 == 0) {
+			if (!m_inProcesGlasses.empty()) {
+				CGlass* pGlass = m_inProcesGlasses.front();
+				pGlass->complete();
+				glassFromInPorcessToComplete(pGlass);
+
+
+				CProcessJob* pJob = getGlassProcessJob(pGlass);
+				if (pJob != nullptr && checkAndUpdatePjComplete(pJob)) {
+					LOGE("<Master>ProcessJob(%s)完成.",
+						pJob->id().c_str());
+					if (m_listener.onPjEnd != nullptr) {
+						m_listener.onPjEnd(this, pJob);
+					}
+				}
+			}
+		}
+		*/
 	}
 
 	void CMaster::connectEquipments()
@@ -2456,4 +2512,36 @@
 		}
 		return false;
 	}
+
+	bool CMaster::checkAndUpdatePjComplete(CProcessJob* pJob)
+	{
+		ASSERT(pJob);
+		auto state = pJob->state();
+		if (state != PJState::InProcess && state != PJState::Paused) return false;
+
+		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;
+			}
+		}
+
+		return pJob->complete();
+	}
+
+	CProcessJob* CMaster::getGlassProcessJob(CGlass* pGlass)
+	{
+		if (m_pControlJob == nullptr) return nullptr;
+		for (auto pj : m_pControlJob->getPjs()) {
+			for (auto c : pj->carriers()) {
+				for (auto g : c.contexts) {
+					if (g == pGlass) return pj;
+				}
+			}
+		}
+
+		return nullptr;
+	}
 }

--
Gitblit v1.9.3