From 56fd8f57fcc763ae079ae752d82e41b38d7d9e5f Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期一, 16 六月 2025 10:50:16 +0800
Subject: [PATCH] Merge branch 'clh' into liuyang

---
 SourceCode/Bond/Servo/CMaster.cpp |  254 +++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 187 insertions(+), 67 deletions(-)

diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index 661f2de..b9ea92b 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/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);
@@ -284,7 +284,6 @@
 		// Bonder1和Bonder2需要的G2就过不来了
 		// 最基本的实现,可以G2和G2轮流搬送,但最好根据Bonder的需求来决定
 		MaterialsType primaryType, secondaryType;
-		int armNo = 1;			// 默认使用手臂2
 
 
 		// 各种机器
@@ -294,7 +293,7 @@
 		CLoadPort* pLoadPort3 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT3);
 		CLoadPort* pLoadPort4 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT4);
 		CFliper* pFliper = (CFliper*)getEquipment(EQ_ID_FLIPER);
-		CVacuumBake* pVacuumBack = (CVacuumBake*)getEquipment(EQ_ID_VACUUMBAKE);
+		CVacuumBake* pVacuumBake = (CVacuumBake*)getEquipment(EQ_ID_VACUUMBAKE);
 		CAligner* pAligner = (CAligner*)getEquipment(EQ_ID_ALIGNER);
 		CBonder* pBonder1 = (CBonder*)getEquipment(EQ_ID_Bonder1);
 		CBonder* pBonder2 = (CBonder*)getEquipment(EQ_ID_Bonder2);
@@ -307,7 +306,7 @@
 		ASSERT(pLoadPort3);
 		ASSERT(pLoadPort4);
 		ASSERT(pFliper);
-		ASSERT(pVacuumBack);
+		ASSERT(pVacuumBake);
 		ASSERT(pAligner);
 		ASSERT(pBonder1);
 		ASSERT(pBonder2);
@@ -378,16 +377,16 @@
 
 				// Measurement -> LoadPort
 				CLoadPort* pEqLoadPort[] = { pLoadPort1, pLoadPort2, pLoadPort3, pLoadPort4 };
-				CEquipment* pEqTar[] = { pVacuumBack, pFliper };
+				CEquipment* pEqTar[] = { pVacuumBake, pFliper };
 				if (primaryType == MaterialsType::G2) {
 					pEqTar[0] = pFliper;
-					pEqTar[1] = pVacuumBack;
+					pEqTar[1] = pVacuumBake;
 				}
 				for (int s = 0; s < 4; s++) {
 					if (pEqLoadPort[s]->isEnable()
 						&& pEqLoadPort[s]->getPortType() == PortType::Unloading
 						&& pEqLoadPort[s]->getPortMode() == PortMode::ReadyToUnload) {
-						m_pActiveRobotTask = createTransferTask(pMeasurement, pEqLoadPort[s], primaryType, secondaryType, armNo);
+						m_pActiveRobotTask = createTransferTask(pMeasurement, pEqLoadPort[s], primaryType, secondaryType);
 						if (m_pActiveRobotTask != nullptr) {
 							goto PORT_PUT;
 						}
@@ -396,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) {
@@ -410,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) {
@@ -425,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) {
@@ -439,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) {
@@ -451,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) {
@@ -461,10 +460,11 @@
 					continue;
 				}
 
-				// Aligner -> Bonder
-				m_pActiveRobotTask = createTransferTask(pAligner, pBonder1, primaryType, secondaryType, armNo);
+				// Fliper(G2) -> Bonder
+				// 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) {
@@ -474,9 +474,9 @@
 					continue;
 				}
 
-				m_pActiveRobotTask = createTransferTask(pAligner, pBonder2, primaryType, secondaryType, armNo);
+				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) {
@@ -486,12 +486,9 @@
 					continue;
 				}
 
-
-				// Fliper(G2) -> Aligner
-				// VacuumBake(G1) -> Aligner
-				m_pActiveRobotTask = createTransferTask(pFliper, pAligner, primaryType, secondaryType, armNo);
+				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) {
@@ -501,9 +498,35 @@
 					continue;
 				}
 
-				m_pActiveRobotTask = createTransferTask(pVacuumBack, pAligner, primaryType, secondaryType, armNo);
+				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) {
+						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+					}
+					LOGI("创建新任务<%s>...", strDescription.c_str());
+					continue;
+				}
+
+				// Aligner -> Fliper(G2)
+				// Aligner -> VacuumBake(G1)
+				m_pActiveRobotTask = createTransferTask(pAligner, pFliper, primaryType, secondaryType, 2);
+				if (m_pActiveRobotTask != nullptr) {
+					m_pActiveRobotTask->pick();
+					std::string strDescription = m_pActiveRobotTask->getDescription();
+					unlock();
+					if (m_listener.onRobotTaskEvent != nullptr) {
+						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+					}
+					LOGI("创建新任务<%s>...", strDescription.c_str());
+					continue;
+				}
+
+				m_pActiveRobotTask = createTransferTask(pAligner, pVacuumBake, primaryType, secondaryType);
+				if (m_pActiveRobotTask != nullptr) {
+					m_pActiveRobotTask->pick();
 					std::string strDescription = m_pActiveRobotTask->getDescription();
 					unlock();
 					if (m_listener.onRobotTaskEvent != nullptr) {
@@ -514,24 +537,21 @@
 				}
 
 
-				// LoadPort -> Fliper(G2)
-				// LoadPort -> VacuumBake(G1)
+				// LoadPort -> Aligner
 				for (int s = 0; s < 4; s++) {
-					for (int t = 0; t < 2; t++) {
-						if (pEqLoadPort[s]->isEnable()
-							&& pEqLoadPort[s]->getPortType() == PortType::Loading
-							&& pEqLoadPort[s]->getPortMode() == PortMode::ReadyToLoad) {
-							m_pActiveRobotTask = createTransferTask(pEqLoadPort[s], pEqTar[t], primaryType, secondaryType, armNo);
-							if (m_pActiveRobotTask != nullptr) {
-								goto PORT_GET;
-							}
+					if (pEqLoadPort[s]->isEnable()
+						&& pEqLoadPort[s]->getPortType() == PortType::Loading
+						&& pEqLoadPort[s]->getPortMode() == PortMode::ReadyToLoad) {
+						m_pActiveRobotTask = createTransferTask(pEqLoadPort[s], pAligner, primaryType, secondaryType);
+						if (m_pActiveRobotTask != nullptr) {
+							goto PORT_GET;
 						}
 					}
 				}
 
 PORT_GET:
 				if (m_pActiveRobotTask != nullptr) {
-					m_pActiveRobotTask->run();
+					m_pActiveRobotTask->pick();
 					std::string strDescription = m_pActiveRobotTask->getDescription();
 					unlock();
 					if (m_listener.onRobotTaskEvent != nullptr) {
@@ -566,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);
 				}
 			}
 		}
@@ -657,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();
@@ -690,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();
@@ -789,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);
 
@@ -900,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);
 
@@ -981,11 +1025,11 @@
 		CBakeCooling* pBakeCooling = (CBakeCooling*)getEquipment(EQ_ID_BAKE_COOLING);
 		CMeasurement* pMeasurement = (CMeasurement*)getEquipment(EQ_ID_MEASUREMENT);
 
-		nRet = pLoadPort1->getPin("Out1")->connectPin(pAligner->getPin("In1"));
+		nRet = pLoadPort1->getPin("Out")->connectPin(pAligner->getPin("In1"));
 		if (nRet < 0) {
 			LOGE("连接LoadPort1-Fliper失败");
 		}
-		nRet = pLoadPort2->getPin("Out1")->connectPin(pAligner->getPin("In2"));
+		nRet = pLoadPort2->getPin("Out")->connectPin(pAligner->getPin("In2"));
 		if (nRet < 0) {
 			LOGE("连接LoadPort1-Fliper失败");
 		}
@@ -1141,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);
 		}
 
 
@@ -1162,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);
 		}
 
 
@@ -1184,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);
 		}
 
 
@@ -1205,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()
@@ -1240,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);
+	}
 }

--
Gitblit v1.9.3