From 4eaefee05c987e352dd6d761e601aa450f7f92b4 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期五, 21 三月 2025 14:41:46 +0800
Subject: [PATCH] 1.添加其它机器并连接,显示连接图;

---
 SourceCode/Bond/Servo/CPageGraph2.cpp  |   49 +++++++++
 SourceCode/Bond/Servo/EqsGraphWnd.h    |    1 
 SourceCode/Bond/Servo/EqsGraphWnd.cpp  |   21 ++++
 SourceCode/Bond/Servo/CPageGraph2.h    |    2 
 SourceCode/Bond/Servo/CVacuumBake.cpp  |    3 
 SourceCode/Bond/Servo/CAligner.cpp     |    4 
 SourceCode/Bond/Servo/CFliper.cpp      |    3 
 SourceCode/Bond/Servo/CMaster.cpp      |  139 +++++++++++++++++++++++++++
 SourceCode/Bond/Servo/CMaster.h        |    8 +
 SourceCode/Bond/Servo/CLoadPort.cpp    |    3 
 SourceCode/Bond/Servo/CBakeCooling.cpp |    4 
 SourceCode/Bond/Servo/Common.h         |    4 
 12 files changed, 234 insertions(+), 7 deletions(-)

diff --git a/SourceCode/Bond/Servo/CAligner.cpp b/SourceCode/Bond/Servo/CAligner.cpp
index cc10715..f96229e 100644
--- a/SourceCode/Bond/Servo/CAligner.cpp
+++ b/SourceCode/Bond/Servo/CAligner.cpp
@@ -33,6 +33,10 @@
 	{
 		// 加入Pin初始化代码
 		LOGI("<CAligner>initPins");
+		addPin(SERVO::PinType::INPUT, _T("In1"));
+		addPin(SERVO::PinType::INPUT, _T("In2"));
+		addPin(SERVO::PinType::OUTPUT, _T("Out1"));
+		addPin(SERVO::PinType::OUTPUT, _T("Out2"));
 	}
 
 	void CAligner::onTimer(UINT nTimerid)
diff --git a/SourceCode/Bond/Servo/CBakeCooling.cpp b/SourceCode/Bond/Servo/CBakeCooling.cpp
index deac272..92aea69 100644
--- a/SourceCode/Bond/Servo/CBakeCooling.cpp
+++ b/SourceCode/Bond/Servo/CBakeCooling.cpp
@@ -33,6 +33,10 @@
 	{
 		// 加入Pin初始化代码
 		LOGI("<CBakeCooling>initPins");
+		addPin(SERVO::PinType::INPUT, _T("In1"));
+		addPin(SERVO::PinType::INPUT, _T("In2"));
+		addPin(SERVO::PinType::OUTPUT, _T("Out1"));
+		addPin(SERVO::PinType::OUTPUT, _T("Out2"));
 	}
 
 	void CBakeCooling::onTimer(UINT nTimerid)
diff --git a/SourceCode/Bond/Servo/CFliper.cpp b/SourceCode/Bond/Servo/CFliper.cpp
index 8858147..0b6c578 100644
--- a/SourceCode/Bond/Servo/CFliper.cpp
+++ b/SourceCode/Bond/Servo/CFliper.cpp
@@ -33,6 +33,9 @@
 	{
 		// 加入Pin初始化代码
 		LOGI("<CFliper>initPins");
+		addPin(SERVO::PinType::INPUT, _T("In1"));
+		addPin(SERVO::PinType::INPUT, _T("In2"));
+		addPin(SERVO::PinType::OUTPUT, _T("Out"));
 	}
 
 	void CFliper::onTimer(UINT nTimerid)
diff --git a/SourceCode/Bond/Servo/CLoadPort.cpp b/SourceCode/Bond/Servo/CLoadPort.cpp
index 71169c4..5b54636 100644
--- a/SourceCode/Bond/Servo/CLoadPort.cpp
+++ b/SourceCode/Bond/Servo/CLoadPort.cpp
@@ -35,7 +35,8 @@
 		// 加入Pin初始化代码
 		LOGI("<CLoadPort>initPins");
 		addPin(SERVO::PinType::INPUT, _T("In"));
-		addPin(SERVO::PinType::OUTPUT, _T("Out"));
+		addPin(SERVO::PinType::OUTPUT, _T("Out1"));
+		addPin(SERVO::PinType::OUTPUT, _T("Out2"));
 	}
 
 	void CLoadPort::onTimer(UINT nTimerid)
diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index 63a8e25..8c4f87d 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -76,9 +76,13 @@
 		addLoadPort(1, listener);
 		addLoadPort(2, listener);
 		addLoadPort(3, listener);
+		addFliper(listener);
+		addVacuumBake(listener);
+		addAligner(listener);
 		addEFEM(listener);
 		addBonder(0, listener);
 		addBonder(1, listener);
+		addBakeCooling(listener);
 		connectEquipments();
 
 
@@ -155,6 +159,57 @@
 		LOGE("已添加“%s”.", pEquipment->getName().c_str());
 
 
+		return 0;
+	}
+
+	int CMaster::addFliper(StepListener& listener)
+	{
+		CFliper* pEquipment = new CFliper();
+		pEquipment->setID(EQ_ID_FLIPER);
+		pEquipment->setBaseAlarmId(BASE_ALARM_EFEM);
+		pEquipment->setName("Fliper");
+		pEquipment->setDescription("Fliper.");
+		pEquipment->setReadBitBlock(0x4000, 0x45ff);
+		pEquipment->setStation(0, 255);
+		addToEquipmentList(pEquipment);
+
+
+		pEquipment->init();
+		LOGE("已添加“Fliper”.");
+		return 0;
+	}
+
+	int CMaster::addVacuumBake(StepListener& listener)
+	{
+		CVacuumBake* pEquipment = new CVacuumBake();
+		pEquipment->setID(EQ_ID_VACUUMBAKE);
+		pEquipment->setBaseAlarmId(BASE_ALARM_EFEM);
+		pEquipment->setName("VacuumBake");
+		pEquipment->setDescription("VacuumBake.");
+		pEquipment->setReadBitBlock(0x4000, 0x45ff);
+		pEquipment->setStation(0, 255);
+		addToEquipmentList(pEquipment);
+
+
+		pEquipment->init();
+		LOGE("已添加“VacuumBake”.");
+		return 0;
+	}
+
+	int CMaster::addAligner(StepListener& listener)
+	{
+		CAligner* pEquipment = new CAligner();
+		pEquipment->setID(EQ_ID_ALIGNER);
+		pEquipment->setBaseAlarmId(BASE_ALARM_EFEM);
+		pEquipment->setName("Aligner");
+		pEquipment->setDescription("Aligner.");
+		pEquipment->setReadBitBlock(0x4000, 0x45ff);
+		pEquipment->setStation(0, 255);
+		addToEquipmentList(pEquipment);
+
+
+		pEquipment->init();
+		LOGE("已添加“Aligner”.");
 		return 0;
 	}
 
@@ -474,6 +529,23 @@
 		return 0;
 	}
 
+	int CMaster::addBakeCooling(StepListener& listener)
+	{
+		CBakeCooling* pEquipment = new CBakeCooling();
+		pEquipment->setID(EQ_ID_BAKE_COOLING);
+		pEquipment->setBaseAlarmId(BASE_ALARM_EFEM);
+		pEquipment->setName("BakeCooling");
+		pEquipment->setDescription("BakeCooling.");
+		pEquipment->setReadBitBlock(0x4000, 0x45ff);
+		pEquipment->setStation(0, 255);
+		addToEquipmentList(pEquipment);
+
+
+		pEquipment->init();
+		LOGE("已添加“Aligner”.");
+		return 0;
+	}
+
 	void CMaster::onTimer(UINT nTimerid)
 	{
 		for (auto item : m_listEquipment) {
@@ -501,15 +573,74 @@
 
 	void CMaster::connectEquipments()
 	{
+		int nRet;
 		CLoadPort* pLoadPort1 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT1);
+		CLoadPort* pLoadPort2 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT2);
+		CLoadPort* pLoadPort3 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT3);
+		CLoadPort* pLoadPort4 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT4);
+		CFliper* pFliper = (CFliper*)getEquipment(EQ_ID_FLIPER);
+		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);
+		CBakeCooling* pBakeCooling = (CBakeCooling*)getEquipment(EQ_ID_BAKE_COOLING);
 
-		int nRet = pLoadPort1->getPin("Out")->connectPin(pBonder1->getPin("In"));
+		nRet = pLoadPort1->getPin("Out1")->connectPin(pFliper->getPin("In1"));
 		if (nRet < 0) {
-			AfxMessageBox("连接失败");
+			LOGE("连接LoadPort1-Fliper失败");
 		}
-		else {
-			// AfxMessageBox("连接成功");
+		nRet = pLoadPort2->getPin("Out1")->connectPin(pFliper->getPin("In2"));
+		if (nRet < 0) {
+			LOGE("连接LoadPort1-Fliper失败");
+		}
+
+		nRet = pLoadPort1->getPin("Out2")->connectPin(pVacuumBake->getPin("In1"));
+		if (nRet < 0) {
+			LOGE("连接LoadPort1-VacuumBake失败");
+		}
+		nRet = pLoadPort2->getPin("Out2")->connectPin(pVacuumBake->getPin("In2"));
+		if (nRet < 0) {
+			LOGE("连接LoadPort1-VacuumBake失败");
+		}
+
+		nRet = pFliper->getPin("Out")->connectPin(pAligner->getPin("In1"));
+		if (nRet < 0) {
+			LOGE("连接Fliper-Aligner失败");
+		}
+
+		nRet = pVacuumBake->getPin("Out")->connectPin(pAligner->getPin("In2"));
+		if (nRet < 0) {
+			LOGE("连接VacuumBake-Aligner失败");
+		}
+
+		nRet = pAligner->getPin("Out1")->connectPin(pBonder1->getPin("In"));
+		if (nRet < 0) {
+			LOGE("连接Aligner-Bondere1失败");
+		}
+
+		nRet = pAligner->getPin("Out2")->connectPin(pBonder2->getPin("In"));
+		if (nRet < 0) {
+			LOGE("连接Aligner-Bondere2失败");
+		}
+
+		nRet = pBonder1->getPin("Out")->connectPin(pBakeCooling->getPin("In1"));
+		if (nRet < 0) {
+			LOGE("连接Bonder1-BakeCooling失败");
+		}
+
+		nRet = pBonder2->getPin("Out")->connectPin(pBakeCooling->getPin("In2"));
+		if (nRet < 0) {
+			LOGE("连接Bonder2-BakeCooling失败");
+		}
+
+		nRet = pBakeCooling->getPin("Out1")->connectPin(pLoadPort3->getPin("In"));
+		if (nRet < 0) {
+			LOGE("连接BakeCooling-LoadPort3失败");
+		}
+
+		nRet = pBakeCooling->getPin("Out2")->connectPin(pLoadPort4->getPin("In"));
+		if (nRet < 0) {
+			LOGE("连接BakeCooling-LoadPort4失败");
 		}
 	}
 }
diff --git a/SourceCode/Bond/Servo/CMaster.h b/SourceCode/Bond/Servo/CMaster.h
index d73535e..12b8de3 100644
--- a/SourceCode/Bond/Servo/CMaster.h
+++ b/SourceCode/Bond/Servo/CMaster.h
@@ -4,6 +4,10 @@
 #include "CEFEM.h"
 #include "CBonder.h"
 #include "CLoadPort.h"
+#include "CFliper.h"
+#include "CAligner.h"
+#include "CVacuumBake.h"
+#include "CBakeCooling.h"
 #include "CCLinkIEControl.h"
 
 
@@ -35,8 +39,12 @@
     private:
         int addToEquipmentList(CEquipment* pEquipment);
         int addLoadPort(int index, StepListener& listener);
+        int addFliper(StepListener& listener);
+        int addVacuumBake(StepListener& listener);
+        int addAligner(StepListener& listener);
         int addEFEM(StepListener& listener);
         int addBonder(int index, StepListener& listener);
+        int addBakeCooling(StepListener& listener);
         void connectEquipments();
 
 
diff --git a/SourceCode/Bond/Servo/CPageGraph2.cpp b/SourceCode/Bond/Servo/CPageGraph2.cpp
index aa1cd73..83c2471 100644
--- a/SourceCode/Bond/Servo/CPageGraph2.cpp
+++ b/SourceCode/Bond/Servo/CPageGraph2.cpp
@@ -133,6 +133,7 @@
 void CPageGraph2::OnDestroy()
 {
 	CDialogEx::OnDestroy();
+	SaveEqsGraphData();
 
 	if (m_hbrBkgnd != nullptr) {
 		::DeleteObject(m_hbrBkgnd);
@@ -154,8 +155,15 @@
 #define OUTPIN		2
 void CPageGraph2::AddEqToGraphWnd(SERVO::CEquipment* pEquipment)
 {
+	int x, y;
+	GetItemDataFormIni(pEquipment->getName().c_str(), x, y);
+
 	EQITEM* pItem = m_pEqsGraphWnd->AddItem(0, pEquipment->getName().c_str(), (DWORD_PTR)pEquipment);
 	m_pEqsGraphWnd->SetItemType(pItem, ITEM_SMALL);
+	if (x > 0 && y > 0) {
+		m_pEqsGraphWnd->SetItemPos(pItem, x, y);
+	}
+
 	std::vector<SERVO::CPin*>& inPins = pEquipment->getInputPins();
 	for (auto inPin : inPins) {
 		m_pEqsGraphWnd->AddPin(pItem, INPIN, inPin->getName().c_str(), (DWORD_PTR)inPin);
@@ -172,10 +180,47 @@
 	if (1 == nIDEvent) {
 		KillTimer(1);
 		std::list<SERVO::CEquipment*>& eqs = theApp.m_model.m_master.getEquipmentList();
-		for (auto item : eqs) {
-			AddEqToGraphWnd(item);
+		for (auto eq : eqs) {
+			AddEqToGraphWnd(eq);
+		}
+
+		for (auto eq : eqs) {
+			auto& pins = eq->getOutputPins();
+			for (auto pin : pins) {
+				SERVO::CPin* pPin2 = pin->getConnectedPin();
+				if (pPin2 != nullptr) {
+					m_pEqsGraphWnd->ConnectPin((DWORD_PTR)eq, (DWORD_PTR)pin, (DWORD_PTR)pPin2->getEquipment(), (DWORD_PTR)pPin2);
+				}
+			}
 		}
 	}
 
 	CDialogEx::OnTimer(nIDEvent);
 }
+
+void CPageGraph2::SaveEqsGraphData()
+{
+	char szFilepath[MAX_PATH];
+	CString strValue;
+	sprintf_s(szFilepath, MAX_PATH, "%s\\EqsGraph.ini", (LPTSTR)(LPCTSTR)theApp.m_strAppDir);
+	std::list<SERVO::CEquipment*>& eqs = theApp.m_model.m_master.getEquipmentList();
+	for (auto item : eqs) {
+		EQITEM* pEqItem = m_pEqsGraphWnd->GetItem((DWORD_PTR)item);
+
+		strValue.Format(_T("%d"), pEqItem->rect.left);
+		WritePrivateProfileString(item->getName().c_str(), _T("Left"),
+			(LPTSTR)(LPCTSTR)strValue, szFilepath);
+		strValue.Format(_T("%d"), pEqItem->rect.top);
+		WritePrivateProfileString(item->getName().c_str(), _T("Top"),
+			(LPTSTR)(LPCTSTR)strValue, szFilepath);
+	}
+}
+
+void CPageGraph2::GetItemDataFormIni(const char* pszItemName, int& left, int& top)
+{
+	char szFilepath[MAX_PATH];
+	CString strValue;
+	sprintf_s(szFilepath, MAX_PATH, "%s\\EqsGraph.ini", (LPTSTR)(LPCTSTR)theApp.m_strAppDir);
+	left = GetPrivateProfileInt(pszItemName, _T("Left"), 0, szFilepath);
+	top = GetPrivateProfileInt(pszItemName, _T("Top"), 0, szFilepath);
+}
\ No newline at end of file
diff --git a/SourceCode/Bond/Servo/CPageGraph2.h b/SourceCode/Bond/Servo/CPageGraph2.h
index c587ab6..a90ca36 100644
--- a/SourceCode/Bond/Servo/CPageGraph2.h
+++ b/SourceCode/Bond/Servo/CPageGraph2.h
@@ -15,6 +15,8 @@
 
 private:
 	void AddEqToGraphWnd(SERVO::CEquipment* pEquipment);
+	void SaveEqsGraphData();
+	void GetItemDataFormIni(const char* pszItemName, int& left, int& top);
 
 private:
 	CEqsGraphWnd* m_pEqsGraphWnd;
diff --git a/SourceCode/Bond/Servo/CVacuumBake.cpp b/SourceCode/Bond/Servo/CVacuumBake.cpp
index 41dee7d..b22f52f 100644
--- a/SourceCode/Bond/Servo/CVacuumBake.cpp
+++ b/SourceCode/Bond/Servo/CVacuumBake.cpp
@@ -33,6 +33,9 @@
 	{
 		// 加入Pin初始化代码
 		LOGI("<CVacuumBake>initPins");
+		addPin(SERVO::PinType::INPUT, _T("In1"));
+		addPin(SERVO::PinType::INPUT, _T("In2"));
+		addPin(SERVO::PinType::OUTPUT, _T("Out"));
 	}
 
 	void CVacuumBake::onTimer(UINT nTimerid)
diff --git a/SourceCode/Bond/Servo/Common.h b/SourceCode/Bond/Servo/Common.h
index 939e474..3860990 100644
--- a/SourceCode/Bond/Servo/Common.h
+++ b/SourceCode/Bond/Servo/Common.h
@@ -57,6 +57,10 @@
 #define EQ_ID_LOADPORT2		5
 #define EQ_ID_LOADPORT3		6
 #define EQ_ID_LOADPORT4		7
+#define EQ_ID_FLIPER		8
+#define EQ_ID_VACUUMBAKE	9
+#define EQ_ID_ALIGNER		10
+#define EQ_ID_BAKE_COOLING	11
 
 
 /* step name */
diff --git a/SourceCode/Bond/Servo/EqsGraphWnd.cpp b/SourceCode/Bond/Servo/EqsGraphWnd.cpp
index 46aa8a4..9c0af84 100644
--- a/SourceCode/Bond/Servo/EqsGraphWnd.cpp
+++ b/SourceCode/Bond/Servo/EqsGraphWnd.cpp
@@ -649,6 +649,27 @@
 	::InvalidateRect(m_hWnd, &pItem->rect, TRUE);
 }
 
+void CEqsGraphWnd::SetItemPos(EQITEM* pItem, int x, int y)
+{
+	ASSERT(pItem);
+	pItem->rect.left = x;
+	pItem->rect.top = y;
+	if (pItem->nShowType == ITEM_SMALL) {
+		pItem->rect.right = pItem->rect.left + ITEM_CX_SMALL;
+		pItem->rect.bottom = pItem->rect.top + ITEM_CY_SMALL;
+	}
+	else if (pItem->nShowType == ITEM_LARGE) {
+		pItem->rect.right = pItem->rect.left + ITEM_CX_LARGE;
+		pItem->rect.bottom = pItem->rect.top + ITEM_CY_LARGE;
+	}
+	else {
+		pItem->rect.right = pItem->rect.left + ITEM_CX_NORMAL;
+		pItem->rect.bottom = pItem->rect.top + ITEM_CY_NORMAL;
+	}
+
+	::InvalidateRect(m_hWnd, &pItem->rect, TRUE);
+}
+
 PIN * CEqsGraphWnd::AddPin(EQITEM* pItem, int nType, CString strName, DWORD_PTR dwData)
 {
 	ASSERT(pItem);
diff --git a/SourceCode/Bond/Servo/EqsGraphWnd.h b/SourceCode/Bond/Servo/EqsGraphWnd.h
index e275896..1c4ff41 100644
--- a/SourceCode/Bond/Servo/EqsGraphWnd.h
+++ b/SourceCode/Bond/Servo/EqsGraphWnd.h
@@ -139,6 +139,7 @@
 	int ConnectPin(DWORD_PTR dwItem1Data, DWORD_PTR dwPin1Data, DWORD_PTR dwItem2Data, DWORD_PTR dwPin2Data);
 	void SetItemText(EQITEM* pItem, CString strText);
 	void SetItemType(EQITEM* pItem, int type);
+	void SetItemPos(EQITEM* pItem, int x, int y);
 	void FlashItem(EQITEM* pItem);
 	void AnimationItem(EQITEM*pItem);
 

--
Gitblit v1.9.3