From e5fb1e316cd9e1a85abd9c8e9a81f66990a82c6b Mon Sep 17 00:00:00 2001
From: chenluhua1980 <Chenluhua@qq.com>
Date: 星期四, 12 二月 2026 14:36:05 +0800
Subject: [PATCH] 1.S1F11与S1F21对换;

---
 SourceCode/Bond/Servo/CMaster.cpp |   92 ++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 88 insertions(+), 4 deletions(-)

diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index c7703e4..62a6733 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -997,9 +997,19 @@
 						}
 						m_pActiveRobotTask = createTransferTask(pLoadPorts[s], pAligner, primaryType, secondaryType, 1, m_bJobMode);
 						if (m_pActiveRobotTask != nullptr) {
-							LOGI("<Master>LoadPort->Aligner鍛戒腑(RUNNING): port=%d, primaryType=%d, preferredPort=%d",
-								s + 1, (int)primaryType, preferredPortForPrimary >= 0 ? (preferredPortForPrimary + 1) : 0);
 							CGlass* pGlass = (CGlass*)m_pActiveRobotTask->getContext();
+							CProcessJob* pPJ = (pGlass != nullptr) ? pGlass->getProcessJob() : nullptr;
+							LOGI("<Master>LoadPort->Aligner鍛戒腑(RUNNING): port=%d, primaryType=%d, preferredPort=%d, glass=%s, scheduled=%d, pj=%s",
+								s + 1, (int)primaryType, preferredPortForPrimary >= 0 ? (preferredPortForPrimary + 1) : 0,
+								pGlass != nullptr ? pGlass->getID().c_str() : "",
+								(pGlass != nullptr && pGlass->isScheduledForProcessing()) ? 1 : 0,
+								pPJ != nullptr ? pPJ->id().c_str() : "NULL");
+							if (pGlass == nullptr) {
+								LOGE("<Master>LoadPort->Aligner鍛戒腑(RUNNING)浣哻ontext涓虹┖锛屼换鍔″凡涓㈠純.");
+								delete m_pActiveRobotTask;
+								m_pActiveRobotTask = nullptr;
+								continue;
+							}
 							if (pGlass->getBuddy() != nullptr) {
 								delete m_pActiveRobotTask;
 								m_pActiveRobotTask = nullptr;
@@ -1352,9 +1362,19 @@
 
 						m_pActiveRobotTask = createTransferTask(pLoadPorts[s], pAligner, primaryType, secondaryType, 1, m_bJobMode);
 						if (m_pActiveRobotTask != nullptr) {
-							LOGI("<Master>LoadPort->Aligner鍛戒腑(RUNNING_BATCH): port=%d, primaryType=%d, preferredPort=%d",
-								s + 1, (int)primaryType, preferredPortForPrimary >= 0 ? (preferredPortForPrimary + 1) : 0);
 							auto* pGlass = static_cast<CGlass*>(m_pActiveRobotTask->getContext());
+							CProcessJob* pPJ = (pGlass != nullptr) ? pGlass->getProcessJob() : nullptr;
+							LOGI("<Master>LoadPort->Aligner鍛戒腑(RUNNING_BATCH): port=%d, primaryType=%d, preferredPort=%d, glass=%s, scheduled=%d, pj=%s",
+								s + 1, (int)primaryType, preferredPortForPrimary >= 0 ? (preferredPortForPrimary + 1) : 0,
+								pGlass != nullptr ? pGlass->getID().c_str() : "",
+								(pGlass != nullptr && pGlass->isScheduledForProcessing()) ? 1 : 0,
+								pPJ != nullptr ? pPJ->id().c_str() : "NULL");
+							if (pGlass == nullptr) {
+								LOGE("<Master>LoadPort->Aligner鍛戒腑(RUNNING_BATCH)浣哻ontext涓虹┖锛屼换鍔″凡涓㈠純.");
+								delete m_pActiveRobotTask;
+								m_pActiveRobotTask = nullptr;
+								continue;
+							}
 							if (pGlass->getBuddy() != nullptr) {
 								delete m_pActiveRobotTask; m_pActiveRobotTask = nullptr;
 								continue;
@@ -3361,12 +3381,51 @@
 			}
 		}
 
+		// 鍏堟竻绌烘墍鏈夌鍙g幓鐠冪殑璋冨害鏍囪锛岄伩鍏嶆部鐢ㄥ巻鍙� PJ 鐘舵�併��
+		int clearedGlassCount = 0;
+		for (int i = 0; i < 4; i++) {
+			auto* pPort = (CLoadPort*)getEquipment(EQ_ID_LOADPORT1 + i);
+			if (pPort == nullptr) continue;
+			for (int slot = 1; slot <= SLOT_MAX; slot++) {
+				auto* pGlass = pPort->getGlassFromSlot(slot);
+				if (pGlass == nullptr) continue;
+				pGlass->setProcessJob(nullptr);
+				pGlass->setScheduledForProcessing(FALSE);
+				clearedGlassCount++;
+			}
+		}
+		LOGI("<Master>setProcessJobs: cleared scheduling marks on %d glass(es).", clearedGlassCount);
+
+		auto toPortIndex = [](int eqid) -> int {
+			switch (eqid) {
+			case EQ_ID_LOADPORT1: return 0;
+			case EQ_ID_LOADPORT2: return 1;
+			case EQ_ID_LOADPORT3: return 2;
+			case EQ_ID_LOADPORT4: return 3;
+			default: return -1;
+			}
+		};
+
+		auto hasAnySelectedPorts = [](const PJWarp& warp) -> bool {
+			for (int p = 0; p < 4; p++) {
+				if (warp.selectedPorts[p]) return true;
+			}
+			return false;
+		};
+
+		auto hasAnyLegacyCheckedSlots = [](const PJWarp& warp) -> bool {
+			for (int s = 0; s < 8; s++) {
+				if (warp.checkSlot[s]) return true;
+			}
+			return false;
+		};
 
 		// 鏇存柊context
 		for (auto pj : m_processJobs) {
 			for (auto& c : pj->carriers()) {
 				auto pPort = getPortWithCarrierId(c.carrierId);
 				if (pPort == nullptr) continue;
+				const int portIndex = toPortIndex(pPort->getID());
 
 				short downloadMap = 0;
 				for (auto s : c.slots) {
@@ -3378,12 +3437,37 @@
 
 				std::vector<uint8_t> newSlots;
 				std::vector<void*> newContexts;
+				PJWarp& warp = pj->getPjWarp();
+				const bool useMultiPortWarp = hasAnySelectedPorts(warp);
+				const bool useLegacyWarp = !useMultiPortWarp && hasAnyLegacyCheckedSlots(warp);
 				for (auto s : c.slots) {
 					auto pGlass = pPort->getGlassFromSlot(s);
 					if (pGlass == nullptr) continue;
 
 					newSlots.push_back(s);
 					newContexts.push_back(pGlass);
+
+					// 榛樿锛欻ost 涓嬪彂浣嗘湭鎼哄甫 PJWarp 缁嗚妭鏃讹紝carrier slots 瑙嗕负搴斿姞宸ャ��
+					BOOL scheduled = TRUE;
+					int material = (pGlass->getType() == MaterialsType::G2) ? 2 : 1;
+
+					if (1 <= s && s <= 8) {
+						if (useMultiPortWarp && 0 <= portIndex && portIndex < 4 && warp.selectedPorts[portIndex]) {
+							scheduled = warp.checkSlots[portIndex][s - 1];
+							material = warp.materialSlots[portIndex][s - 1];
+						}
+						else if (useLegacyWarp) {
+							scheduled = warp.checkSlot[s - 1];
+							material = warp.material[s - 1];
+						}
+					}
+					material = (material == 2) ? 2 : 1;
+
+					pGlass->setProcessJob(pj);
+					pGlass->setScheduledForProcessing(scheduled);
+					pGlass->setType(static_cast<MaterialsType>(material));
+					LOGI("<Master>setProcessJobs bind: pj=%s, port=%d, slot=%d, glass=%s, scheduled=%d, material=%d",
+						pj->id().c_str(), portIndex + 1, (int)s, pGlass->getID().c_str(), scheduled ? 1 : 0, material);
 				}
 
 				pj->setCarrierSlotsAndContexts(c.carrierId, newSlots, newContexts);

--
Gitblit v1.9.3