From 6e0341c6356cdb6e527fbd89d1dc876f4e47ce46 Mon Sep 17 00:00:00 2001
From: chenluhua1980 <Chenluhua@qq.com>
Date: 星期五, 09 一月 2026 20:37:50 +0800
Subject: [PATCH] 1.Trace Data,ProcessData, SVData等上报

---
 SourceCode/Bond/Servo/CMaster.cpp |  358 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 327 insertions(+), 31 deletions(-)

diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index 8df061b..6df6ca1 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -222,6 +222,9 @@
 		// 璇荤紦瀛樻暟鎹�
 		readCache();
 		loadState();
+		if (m_listener.onControlJobChanged) {
+			m_listener.onControlJobChanged(this);
+		}
 
 
 		// 瀹氭椂鍣�
@@ -1483,6 +1486,7 @@
 							this->saveState();
 							LOGE("<Master>ProcessJob(%s)瀹屾垚.",
 								pJob->id().c_str());
+							processJobFromInPorcessToComplete(pJob);
 							if (m_listener.onPjEnd != nullptr) {
 								m_listener.onPjEnd(this, pJob);
 							}
@@ -1536,19 +1540,30 @@
 				unlock();
 			}
 		};
-		listener.onProcessStateChanged = [&](void* pEquipment, int slotNo, PROCESS_STATE state) -> void {
+		listener.onProcessStateChanged = [&](void* pEquipment, int slotNo, PROCESS_STATE prevState, PROCESS_STATE state) -> void {
 			ASSERT(1 <= slotNo && slotNo <= 8);
 			int eqid = ((CEquipment*)pEquipment)->getID();
 			CGlass* pGlass = ((CEquipment*)pEquipment)->getGlassFromSlot(slotNo);
 			LOGI("<Master>onProcessStateChanged<%d>", (int)state);
 			if (state == PROCESS_STATE::Processing) {
 				if (pGlass != nullptr) {
-					m_pCollector->batchStart(eqid,
+					m_pCollector->batchStart(SlotToMid(eqid, slotNo),
 						pGlass->getID().c_str(), 10 * 60 * 1000ULL);
 				}
 			}
 			else if (state == PROCESS_STATE::Complete) {
-				m_pCollector->batchStop(eqid);
+				if (pGlass != nullptr) {
+					m_pCollector->batchStop(SlotToMid(eqid, slotNo));
+				}
+			}
+
+			if (m_listener.onProcessStateChanged != nullptr) {
+				m_listener.onProcessStateChanged(this, (CEquipment*)pEquipment, slotNo, prevState, state);
+			}
+		};
+		listener.onProcessDataReport = [&](void* pEquipment, const std::vector<CParam>& params) {
+			if (m_listener.onProcessDataReport != nullptr) {
+				m_listener.onProcessDataReport(this, (CEquipment*)pEquipment, params);
 			}
 		};
 		listener.onMapMismatch = [&](void* pEquipment, short scanMap, short downMap) {
@@ -1641,16 +1656,16 @@
 					{8, 8}, {9, 9}, {10, 10}, {11, 11}, {12, 12}, {13, 13}, {14, 14}, {15, 15}, {16, 16}
 				};
 
-				CGlass* pGlass = ((CEquipment*)pEquipment)->getGlassFromSlot(1);
+				CGlass* pGlass = ((CEquipment*)pEquipment)->getGlassFromSlot(2);
 				auto& dataTypes = CServoUtilsTool::getEqDataTypes();
-				auto& bonderTypes = dataTypes[eqid];
+				auto& bonderTypes = dataTypes[SlotToMid(eqid, 2)];
 				for (const auto& mapping : bonderMapping) {
 					int paramIndex = mapping.first;
 					int channel = mapping.second;
 
 					if (paramIndex < params.size() && channel - 1 < bonderTypes.size()) {
 						if(m_pCollector != nullptr)
-							m_pCollector->buffersPush(eqid, channel, ts, params.at(paramIndex).getDoubleValue());
+							m_pCollector->buffersPush(SlotToMid(eqid, 2), channel, ts, params.at(paramIndex).getDoubleValue());
 						if(pGlass != nullptr)
 							pGlass->addSVData(eqid, bonderTypes[channel - 1], ts, params.at(paramIndex).getDoubleValue());
 					}
@@ -1664,19 +1679,34 @@
 					{10, 8}, {11, 9}, {12, 10}, {13, 11}, {14, 12}, {15, 13}, {16, 14}
 				};
 
-				CGlass* pGlass = ((CEquipment*)pEquipment)->getGlassFromSlot(1);
+				CGlass* pGlass1 = ((CEquipment*)pEquipment)->getGlassFromSlot(1);
+				CGlass* pGlass2 = ((CEquipment*)pEquipment)->getGlassFromSlot(2);
 				auto& dataTypes = CServoUtilsTool::getEqDataTypes();
-				auto& vacuumbakeTypes = dataTypes[eqid];
+				auto& vacuumbakeTypes = dataTypes[SlotToMid(eqid, 1)];
 				LOGD("<Master>onSVDataReport 003 : %d", vacuumMapping.size());
 				for (const auto& mapping : vacuumMapping) {
 					int paramIndex = mapping.first;
 					int channel = mapping.second;
 
 					if (paramIndex < params.size() && channel - 1 < vacuumbakeTypes.size()) {
-						if (m_pCollector != nullptr)
-							m_pCollector->buffersPush(eqid, channel, ts, params.at(paramIndex).getDoubleValue());
-						if (pGlass != nullptr)
-							pGlass->addSVData(eqid, vacuumbakeTypes[channel - 1], ts, params.at(paramIndex).getDoubleValue());
+						auto& param = params.at(paramIndex);
+						double value = param.getDoubleValue();
+						const std::string& dataType = vacuumbakeTypes[channel - 1];
+						const std::string& paramName = param.getName();
+						const char slotTag = !paramName.empty() ? paramName[0] : '\0';
+
+						if (m_pCollector != nullptr) {
+							if (slotTag == 'A')
+								m_pCollector->buffersPush(SlotToMid(eqid, 1), channel, ts, value);
+							else if (slotTag == 'B')
+								m_pCollector->buffersPush(SlotToMid(eqid, 2), channel, ts, value);
+						}
+
+						// 鏍规嵁鑵斾綋鍓嶇紑鍐欏叆瀵瑰簲 Slot 鐨勭幓鐠�
+						if (pGlass1 != nullptr && !dataType.empty() && slotTag == 'A')
+							pGlass1->addSVData(eqid, dataType, ts, value);
+						if (pGlass2 != nullptr && !dataType.empty() && slotTag == 'B')
+							pGlass2->addSVData(eqid, dataType, ts, value);
 					}
 				}
 			}
@@ -1688,19 +1718,55 @@
 					{11, 7}, {12, 8}, {13, 9}, {14, 10}, {15, 11}, {16, 12}
 				};
 
-				CGlass* pGlass = ((CEquipment*)pEquipment)->getGlassFromSlot(1);
+				CGlass* pGlass1 = ((CEquipment*)pEquipment)->getGlassFromSlot(1); // A Bake
+				CGlass* pGlass2 = ((CEquipment*)pEquipment)->getGlassFromSlot(2); // A Cool
+				CGlass* pGlass3 = ((CEquipment*)pEquipment)->getGlassFromSlot(3); // B Bake
+				CGlass* pGlass4 = ((CEquipment*)pEquipment)->getGlassFromSlot(4); // B Cool
 				auto& dataTypes = CServoUtilsTool::getEqDataTypes();
-				auto& coolingTypes = dataTypes[eqid];
+				auto& coolingTypes = dataTypes[SlotToMid(eqid, 1)];
 				LOGD("<Master>onSVDataReport 003B : %d", coolingMapping.size());
+				auto addToGlass = [&](CGlass* glass, const std::string& type, double val) {
+					if (glass != nullptr)
+						glass->addSVData(eqid, type, ts, val);
+				};
 				for (const auto& mapping : coolingMapping) {
 					int paramIndex = mapping.first;
 					int channel = mapping.second;
 
 					if (paramIndex < params.size() && channel - 1 < coolingTypes.size()) {
-						if (m_pCollector != nullptr)
-							m_pCollector->buffersPush(eqid, channel, ts, params.at(paramIndex).getDoubleValue());
-						if (pGlass != nullptr)
-							pGlass->addSVData(eqid, coolingTypes[channel - 1], ts, params.at(paramIndex).getDoubleValue());
+						auto& param = params.at(paramIndex);
+						double value = param.getDoubleValue();
+						const std::string& dataType = coolingTypes[channel - 1];
+						const std::string& paramName = param.getName();
+						const char slotTag = !paramName.empty() ? paramName[0] : '\0';
+						const bool paramIsBake = paramName.find("鐑樼儰") != std::string::npos;
+						const bool paramIsCooling = paramName.find("鍐峰嵈") != std::string::npos;
+
+						if (m_pCollector != nullptr && paramIsBake) {
+							if (slotTag == 'A')
+								m_pCollector->buffersPush(SlotToMid(eqid, 1), channel, ts, value);
+							else if (slotTag == 'B')
+								m_pCollector->buffersPush(SlotToMid(eqid, 3), channel, ts, value);
+						}
+
+						if (!dataType.empty()) {
+							switch (slotTag) {
+							case 'A':
+								if (paramIsBake)
+									addToGlass(pGlass1, dataType, value);
+								else if (paramIsCooling)
+									addToGlass(pGlass2, dataType, value);
+								break;
+							case 'B':
+								if (paramIsBake)
+									addToGlass(pGlass3, dataType, value);
+								else if (paramIsCooling)
+									addToGlass(pGlass4, dataType, value);
+								break;
+							default:
+								break;
+							}
+						}
 					}
 				}
 			}
@@ -1720,6 +1786,10 @@
 				strOut.append(szBuffer);
 			}
 			LOGD("<CMaster-%s>SVDataReport:%s", ((CEquipment*)pEquipment)->getName().c_str(), strOut.c_str());
+
+			if (m_listener.onSVDataReport != nullptr) {
+				m_listener.onSVDataReport(this, (CEquipment*)pEquipment, params);
+			}
 		};
 		listener.onPanelDataReport = [&](void* pEquipment, void* pContext) {
 			LOGD("<CMaster-%s>onPanelDataReport", ((CEquipment*)pEquipment)->getName().c_str());
@@ -1977,6 +2047,173 @@
 			}
 		}
 
+
+		// 妯℃嫙娴嬭瘯锛堟棤鏈哄櫒鑱旀満鏃剁敤浜庤仈璋� EAP锛�
+		// 璇诲彇 test.ini锛堝綋鍓嶇洰褰曟垨 exe 鍚岀洰褰曪級
+		{
+			struct SimCfg {
+				bool enabled{ false };
+				DWORD intervalMs{ 5000 };
+				int step{ 0 };
+			};
+			auto loadCfg = [&]() -> SimCfg {
+				SimCfg cfg;
+
+				// Try INI: current dir, then exe dir
+				char iniPath[MAX_PATH] = { 0 };
+				strcpy_s(iniPath, "test.ini");
+				auto readIni = [&](const char* path) -> bool {
+					const UINT en = GetPrivateProfileIntA("SimEap", "Enabled", 0, path);
+					if (en == 0) return false; // treat as missing/disabled
+					cfg.enabled = (en != 0);
+					cfg.intervalMs = (DWORD)GetPrivateProfileIntA("SimEap", "IntervalMs", 5000, path);
+					cfg.intervalMs = max(500u, cfg.intervalMs);
+					cfg.step = (int)GetPrivateProfileIntA("SimEap", "Step", 0, path);
+					return true;
+				};
+				if (!readIni(iniPath)) {
+					char exePath[MAX_PATH] = { 0 };
+					GetModuleFileNameA(NULL, exePath, MAX_PATH);
+					char* lastSlash = strrchr(exePath, '\\');
+					if (lastSlash != nullptr) {
+						*(lastSlash + 1) = '\0';
+						strcat_s(exePath, "test.ini");
+						readIni(exePath);
+					}
+				}
+				return cfg;
+			};
+
+			const SimCfg cfg = loadCfg();
+			if (cfg.enabled) {
+				static DWORD lastTick = 0;
+				static int lastExecutedStep = -1;
+				static bool inited = false;
+				static SERVO::CGlass simGlass;
+				static SERVO::CVcrEventReport simVcr;
+				static SERVO::CProcessJob simPj("PJ1001");
+				static SERVO::CControlJob simCj("CJ5007");
+
+				if (!inited) {
+					inited = true;
+					simGlass.setID("SIM_PANEL_001");
+					simVcr.getGlassId() = "SIM_PANEL_001";
+				}
+
+				DWORD now = GetTickCount();
+				if (lastTick == 0) lastTick = now;
+				if ((now - lastTick) < cfg.intervalMs) {
+					return;
+				}
+				lastTick = now;
+
+				// 鍗曟瑙﹀彂锛氭瘡涓� Step 鍙墽琛屼竴娆★紱浣犳墜鍔ㄤ慨鏀� ini 鐨� Step 鍊煎悗浼氬啀娆¤Е鍙�
+				const int step = cfg.step;
+				if (step <= 0 || step == lastExecutedStep) {
+					return;
+				}
+				lastExecutedStep = step;
+
+				// 鍙栦竴涓� LoadPort 浣滀负妯℃嫙鐩爣
+				SERVO::CLoadPort* pLpEq = (SERVO::CLoadPort*)getEquipment(EQ_ID_LOADPORT1);
+
+				auto fireLoadPortStatus = [&](short status) {
+					pLpEq->simulateSetCassetteId("Test-Cassette-001");
+					if (m_listener.onLoadPortStatusChanged != nullptr && pLpEq != nullptr) {
+						m_listener.onLoadPortStatusChanged(this, pLpEq, status, 0);
+					}
+				};
+				auto fireProcessState = [&](SERVO::CEquipment* pEq, int slotNo, SERVO::PROCESS_STATE st) {
+					// Drive equipment state so listeners receive prev/current states consistently.
+					if (pEq != nullptr) {
+						pEq->fireSetProcessState(slotNo, st);
+					}
+				};
+
+				LOGI("<Master>SIM_EAP single-step=%d", step);
+				switch (step) {
+					// ===== 涓氬姟娴佺▼姝ラ锛�1~23锛�=====
+				case 1: // E87_06 Material Arrived(TransferBlock) -> Port Blocked
+					fireLoadPortStatus(PORT_BLOCKED);
+					break;
+				case 2: // E87_03 CarrierID Readed -> Port InUse
+					fireLoadPortStatus(PORT_INUSE);
+					break;
+				case 3: // S1F3 Query CJ Space (Host->EQ) - wait host
+					LOGI("<Master>SIM_EAP step3: wait host S1F3");
+					break;
+				case 4: // S16F21 Query PJ Space (Host->EQ) - wait host
+					LOGI("<Master>SIM_EAP step4: wait host S16F21");
+					break;
+				case 5: // S7F19 Query PPID List (Host->EQ) - wait host
+					LOGI("<Master>SIM_EAP step5: wait host S7F19");
+					break;
+				case 6: // S3F17 ProceedWithCarrier (Host->EQ) - wait host
+					LOGI("<Master>SIM_EAP step6: wait host S3F17 ProceedWithCarrier");
+					break;
+				case 7: // E87_14 Check SlotMap (璁惧涓婃姤/杩涘叆 WFH) - 鐢� PORT_INUSE 鍐呴儴瑙﹀彂
+					fireLoadPortStatus(PORT_INUSE);
+					break;
+				case 8: // S3F17 ProceedWithSlotMap (Host->EQ) - wait host
+					LOGI("<Master>SIM_EAP step8: wait host S3F17 ProceedWithSlotMap");
+					break;
+				case 9: // SlotMap Verify OK (鏈」鐩湪鏀跺埌 ProceedWithSlotMap 鍚庝笂鎶�) - wait host
+					LOGI("<Master>SIM_EAP step9: wait host ProceedWithSlotMap to trigger VerifyOK");
+					break;
+				case 10: // Create PJ (Host->EQ) - wait host
+					LOGI("<Master>SIM_EAP step10: wait host S16F15 CreateMultiPJ");
+					break;
+				case 11: // PJ Queued锛堟湰椤圭洰鍦ㄥ垱寤� PJ 鍚庝笂鎶ワ級 - wait host
+					LOGI("<Master>SIM_EAP step11: wait host CreateMultiPJ to trigger PJ_Queued");
+					break;
+				case 12: // Create CJ (Host->EQ) - wait host
+					LOGI("<Master>SIM_EAP step12: wait host S14F9 CreateCJ");
+					break;
+				case 13: // CJ Start
+					if (m_listener.onCjStart != nullptr) m_listener.onCjStart(this, &simCj);
+					break;
+				case 14: // PJ Start
+					if (m_listener.onPjStart != nullptr) m_listener.onPjStart(this, &simPj);
+					break;
+				case 15: // OCR
+					if (m_listener.onEqVcrEventReport != nullptr && pLpEq != nullptr) {
+						m_listener.onEqVcrEventReport(this, pLpEq, &simVcr);
+					}
+					break;
+				case 16: // Panel Start
+					if (m_listener.onPanelStart != nullptr) m_listener.onPanelStart(this, &simGlass);
+					// 鍚屾椂瑙﹀彂涓�娆″瓙鏈哄彴寮�濮嬶紙绀轰緥锛欱onder1, slot 1锛�
+					fireProcessState(getEquipment(EQ_ID_Bonder1), 1, SERVO::PROCESS_STATE::Processing);
+					break;
+				case 17: // Panel End
+					// 鍚屾椂瑙﹀彂涓�娆″瓙鏈哄彴缁撴潫锛堢ず渚嬶細Bonder1, slot 1锛�
+					fireProcessState(getEquipment(EQ_ID_Bonder1), 1, SERVO::PROCESS_STATE::Complete);
+					if (m_listener.onPanelEnd != nullptr) m_listener.onPanelEnd(this, &simGlass);
+					break;
+				case 18: // PJ End
+					if (m_listener.onPjEnd != nullptr) m_listener.onPjEnd(this, &simPj);
+					break;
+				case 19: // CJ End
+					if (m_listener.onCjEnd != nullptr) m_listener.onCjEnd(this, &simCj);
+					break;
+				case 20: // Ready to Release (Port Unload Ready; with prev INUSE will also trigger ReadyToRelease)
+					fireLoadPortStatus(PORT_UNLOAD_READY);
+					break;
+				case 21: // CarrierRelease (Host->EQ) - optional / wait host
+					LOGI("<Master>SIM_EAP step21: wait host S3F17 CarrierRelease");
+					break;
+				case 22: // Ready to Unload
+					fireLoadPortStatus(PORT_UNLOAD_READY);
+					break;
+				case 23: // Material Removed (and ReadyToLoad)
+					fireLoadPortStatus(PORT_LOAD_READY);
+					fireLoadPortStatus(PORT_EMPTY); // will also raise LoadPortNotAssoc via Model
+					break;
+				default:
+					break;
+				}
+			}
+		}
 
 
 		// 妯℃嫙娴嬭瘯
@@ -2547,15 +2784,31 @@
 		}
 		m_processJobs = temp;
 
+		// 閲嶇疆鍚勭鍙� DownloadMap锛圚ost/鏈湴鍕鹃�夌殑鏈熸湜鍔犲伐妲戒綅锛�
+		for (int i = 0; i < 4; i++) {
+			auto* pPort = (CLoadPort*)getEquipment(EQ_ID_LOADPORT1 + i);
+			if (pPort != nullptr) {
+				pPort->setDownloadCassetteMap(0);
+			}
+		}
+
 
 		// 鏇存柊context
-		std::vector<uint8_t> newSlots;
-		std::vector<void*> newContexts;
 		for (auto pj : m_processJobs) {
 			for (auto& c : pj->carriers()) {
 				auto pPort = getPortWithCarrierId(c.carrierId);
 				if (pPort == nullptr) continue;
 
+				short downloadMap = 0;
+				for (auto s : c.slots) {
+					if (s >= 1 && s <= 8) {
+						downloadMap |= (short)(1 << (s - 1));
+					}
+				}
+				pPort->setDownloadCassetteMap((short)(pPort->getDownloadCassetteMap() | downloadMap));
+
+				std::vector<uint8_t> newSlots;
+				std::vector<void*> newContexts;
 				for (auto s : c.slots) {
 					auto pGlass = pPort->getGlassFromSlot(s);
 					if (pGlass == nullptr) continue;
@@ -2571,6 +2824,9 @@
 
 
 		this->saveState();
+		if (m_listener.onControlJobChanged) {
+			m_listener.onControlJobChanged(this);
+		}
 
 		return (int)m_processJobs.size();
 	}
@@ -2628,6 +2884,9 @@
 		}
 		m_pControlJob->setPJs(temps);
 		this->saveState();
+		if (m_listener.onControlJobChanged) {
+			m_listener.onControlJobChanged(this);
+		}
 
 
 		return 0;
@@ -2970,6 +3229,9 @@
 
 
 		saveState();
+		if (m_listener.onControlJobChanged) {
+			m_listener.onControlJobChanged(this);
+		}
 
 		return true;
 	}
@@ -3004,6 +3266,9 @@
 
 
 		saveState();
+		if (m_listener.onControlJobChanged) {
+			m_listener.onControlJobChanged(this);
+		}
 
 		return true;
 	}
@@ -3141,29 +3406,60 @@
 
 			// 1) 娉ㄥ唽鏈哄彴锛堟帹鑽愶細鍏堟敞鍐� id + 鏈哄櫒鍚嶇О锛�
 			RetentionPolicy defP; defP.mode = RetainMode::ByCount; defP.maxSamples = 200;
-			m_pCollector->registryAddMachine(EQ_ID_Bonder1, "Bonder1", defP);
-			m_pCollector->registryAddMachine(EQ_ID_Bonder2, "Bonder2", defP);
-			m_pCollector->registryAddMachine(EQ_ID_VACUUMBAKE, "鍓嶇儤鐑�", defP);
-			m_pCollector->registryAddMachine(EQ_ID_BAKE_COOLING, "鐑樼儰鍐峰嵈", defP);
+			m_pCollector->registryAddMachine(MID_Bonder1, "Bonder1", defP);
+			m_pCollector->registryAddMachine(MID_Bonder2, "Bonder2", defP);
+			m_pCollector->registryAddMachine(MID_VacuumBakeA, "鍓嶇儤-A", defP);
+			m_pCollector->registryAddMachine(MID_VacuumBakeB, "鍓嶇儤-B", defP);
+			m_pCollector->registryAddMachine(MID_BakeCoolingA, "鍚庣儤-A", defP);
+			m_pCollector->registryAddMachine(MID_BakeCoolingB, "鍚庣儤-B", defP);
 
 
 			// 2) 涓洪�氶亾璁剧疆鈥滄洸绾垮悕绉扳��
 			auto& dataTypes = CServoUtilsTool::getEqDataTypes();
-			auto& bonderTypes = dataTypes[EQ_ID_Bonder1];
+			auto& bonderTypes = dataTypes[MID_Bonder1];
 			for (size_t i = 0; i < bonderTypes.size(); ++i) {
-				m_pCollector->buffersSetChannelName(EQ_ID_Bonder1, i + 1, bonderTypes[i].c_str());
-				m_pCollector->buffersSetChannelName(EQ_ID_Bonder2, i + 1, bonderTypes[i].c_str());
+				m_pCollector->buffersSetChannelName(MID_Bonder1, i + 1, bonderTypes[i].c_str());
+				m_pCollector->buffersSetChannelName(MID_Bonder2, i + 1, bonderTypes[i].c_str());
 			}
 
-			auto& vacuumbakeTypes = dataTypes[EQ_ID_VACUUMBAKE];
+			auto& vacuumbakeTypes = dataTypes[MID_VacuumBakeA];
 			for (size_t i = 0; i < vacuumbakeTypes.size(); ++i) {
-				m_pCollector->buffersSetChannelName(EQ_ID_VACUUMBAKE, i + 1, vacuumbakeTypes[i].c_str());
+				m_pCollector->buffersSetChannelName(MID_VacuumBakeA, i + 1, vacuumbakeTypes[i].c_str());
+				m_pCollector->buffersSetChannelName(MID_VacuumBakeB, i + 1, vacuumbakeTypes[i].c_str());
 			}
 
-			auto& coolingTypes = dataTypes[EQ_ID_BAKE_COOLING];
+			auto& coolingTypes = dataTypes[MID_BakeCoolingA];
 			for (size_t i = 0; i < coolingTypes.size(); ++i) {
-				m_pCollector->buffersSetChannelName(EQ_ID_VACUUMBAKE, i + 1, coolingTypes[i].c_str());
+				m_pCollector->buffersSetChannelName(MID_BakeCoolingA, i + 1, coolingTypes[i].c_str());
+				m_pCollector->buffersSetChannelName(MID_BakeCoolingB, i + 1, coolingTypes[i].c_str());
 			}
 		}
 	}
+
+	uint32_t CMaster::SlotToMid(int eqid, int slot)
+	{
+		if (eqid == EQ_ID_Bonder1) {
+			return MID_Bonder1;
+		}
+
+		if (eqid == EQ_ID_Bonder2) {
+			return MID_Bonder2;
+		}
+
+		if (eqid == EQ_ID_VACUUMBAKE) {
+			if(slot == 1)
+				return MID_VacuumBakeA;
+			if (slot == 2)
+				return MID_VacuumBakeB;
+		}
+
+		if (eqid == EQ_ID_BAKE_COOLING) {
+			if (slot == 1)
+				return MID_BakeCoolingA;
+			if (slot == 3)
+				return MID_BakeCoolingB;
+		}
+
+		return 0;
+	}
 }

--
Gitblit v1.9.3