From 02fe6422964aab86753818744b901b2c299c06a4 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期四, 22 五月 2025 11:30:29 +0800
Subject: [PATCH] 1.Port cmd功能和界面操作实现; 2.操作提示框界面实现;

---
 Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.5(5).xlsx |    0 
 SourceCode/Bond/Servo/CPagePortProperty.cpp                     |  274 +++++++++++++++
 SourceCode/Bond/Servo/Servo.vcxproj                             |    2 
 SourceCode/Bond/Servo/resource.h                                |    0 
 SourceCode/Bond/x64/Debug/Servo.ini                             |    4 
 SourceCode/Bond/Servo/CPagePortProperty.h                       |    5 
 SourceCode/Bond/Servo/CGlass.h                                  |    7 
 SourceCode/Bond/Servo/CLoadPort.h                               |    9 
 SourceCode/Bond/Servo/CLoadPort.cpp                             |  174 ++++++++++
 Document/simulator/SEComSimulator.Conf                          |   53 +++
 SourceCode/Bond/x64/Debug/Res/msgbox_tip.ico                    |    0 
 SourceCode/Bond/Servo/MsgDlg.h                                  |   72 ++++
 SourceCode/Bond/x64/Debug/Master.dat                            |    0 
 SourceCode/Bond/Servo/Servo.vcxproj.filters                     |    2 
 SourceCode/Bond/x64/Debug/EqsGraph.ini                          |   51 +++
 SourceCode/Bond/x64/Debug/Res/msgbox_warning.ico                |    0 
 SourceCode/Bond/Servo/MsgDlg.cpp                                |  303 +++++++++++++++++
 SourceCode/Bond/x64/Debug/Res/msgbox_question.ico               |    0 
 SourceCode/Bond/Servo/Servo.rc                                  |    0 
 SourceCode/Bond/x64/Debug/Res/msgbox_error.ico                  |    0 
 SourceCode/Bond/Servo/ServoCommo.h                              |   37 ++
 SourceCode/Bond/x64/Debug/Res/msgbox_succeed.ico                |    0 
 SourceCode/Bond/Servo/Common.h                                  |    3 
 23 files changed, 987 insertions(+), 9 deletions(-)

diff --git "a/Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.5\0505\051.xlsx" "b/Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.5\0505\051.xlsx"
index 0e5b4b9..8b3d58f 100644
--- "a/Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.5\0505\051.xlsx"
+++ "b/Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.5\0505\051.xlsx"
Binary files differ
diff --git a/Document/simulator/SEComSimulator.Conf b/Document/simulator/SEComSimulator.Conf
new file mode 100644
index 0000000..a2608bb
--- /dev/null
+++ b/Document/simulator/SEComSimulator.Conf
@@ -0,0 +1,53 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<SEComSimulatorConfiguration>
+  <LASTSELECT>
+    <LASTSEComID>A</LASTSEComID>
+  </LASTSELECT>
+  <SEComID>
+    <A>
+      <DRVINFO>
+        <DEVICEID>1</DEVICEID>
+        <IDENTITY>Host</IDENTITY>
+      </DRVINFO>
+      <LOGINFO>
+        <DIR>D:\Chenluhua\dazi\a</DIR>
+        <SECSIMODE>D</SECSIMODE>
+        <SECSIIMODE>D</SECSIIMODE>
+        <XMLMODE />
+        <DRIVERMODE>N</DRIVERMODE>
+        <DRIVERLEVEL>5</DRIVERLEVEL>
+        <BACKUP>2</BACKUP>
+      </LOGINFO>
+      <SECSMODE MODE="HSMS">
+        <HSMS>
+          <HSMSMODE>Active</HSMSMODE>
+          <REMOTEIP>127.0.0.1</REMOTEIP>
+          <REMOTEPORT>7000</REMOTEPORT>
+          <LOCALPORT>
+          </LOCALPORT>
+        </HSMS>
+        <SECS1>
+          <MASTER>True</MASTER>
+          <COMPORT>COM1</COMPORT>
+          <AUTOBAUD>False</AUTOBAUD>
+          <BAUDRATE>9600</BAUDRATE>
+          <INTERLEAVE>False</INTERLEAVE>
+          <RETRYCOUNT>3</RETRYCOUNT>
+        </SECS1>
+      </SECSMODE>
+      <TIMEOUT>
+        <T1>0.5</T1>
+        <T2>10</T2>
+        <T3>45</T3>
+        <T4>45</T4>
+        <T5>10</T5>
+        <T6>5</T6>
+        <T7>10</T7>
+        <T8>10</T8>
+      </TIMEOUT>
+      <EXT>
+        <LINKTEST>120</LINKTEST>
+      </EXT>
+    </A>
+  </SEComID>
+</SEComSimulatorConfiguration>
\ No newline at end of file
diff --git a/SourceCode/Bond/Servo/CGlass.h b/SourceCode/Bond/Servo/CGlass.h
index 8ed33c2..be44aaa 100644
--- a/SourceCode/Bond/Servo/CGlass.h
+++ b/SourceCode/Bond/Servo/CGlass.h
@@ -6,15 +6,10 @@
 #include "CJobDataB.h"
 #include "CJobDataC.h"
 #include "CJobDataS.h"
+#include "ServoCommo.h"
 
 
 namespace SERVO {
-	enum MaterialsType {
-		G1 = 0,
-		G2 = 1,
-		G1G2 = 2
-	};
-
 	class CGlass : public CContext
 	{
 	public:
diff --git a/SourceCode/Bond/Servo/CLoadPort.cpp b/SourceCode/Bond/Servo/CLoadPort.cpp
index c7c6040..940dbbc 100644
--- a/SourceCode/Bond/Servo/CLoadPort.cpp
+++ b/SourceCode/Bond/Servo/CLoadPort.cpp
@@ -682,6 +682,180 @@
 		return nRet;
 	}
 
+	int CLoadPort::setPortType(PortType type, ONWRITED onWritedBlock/* = nullptr*/)
+	{
+		static char* pszName[] = { STEP_PORT1_TYPE_CHANGE, STEP_PORT2_TYPE_CHANGE, STEP_PORT3_TYPE_CHANGE, STEP_PORT4_TYPE_CHANGE };
+		SERVO::CEqWriteStep* pStep = (SERVO::CEqWriteStep*)getStepWithName(pszName[m_nIndex]);
+		if (pStep == nullptr) {
+			return -1;
+		}
+
+		LOGI("<CLoadPort-%d>准备设置Port type<%d>", m_nIndex, (int)type);
+		short value = (short)type;
+		if (onWritedBlock != nullptr) {
+			pStep->writeDataEx((const char*)&value, sizeof(short), onWritedBlock);
+		}
+		else {
+			pStep->writeDataEx((const char*)&value, sizeof(short), [&](int code) -> int {
+				if (code == WOK) {
+					LOGI("<CLoadPort-%d>设置Port type成功.", m_nIndex);
+				}
+				else {
+					LOGI("<CLoadPort-%d>设置Port type失败,code:%d", m_nIndex, code);
+				}
+
+				return 0;
+				});
+		}
+
+		return 0;
+	}
+
+	int CLoadPort::eablePort(BOOL bEnable, ONWRITED onWritedBlock/* = nullptr*/)
+	{
+		static char* pszName[] = { STEP_PORT1_ENABLE_MODE_CHANGE, STEP_PORT2_ENABLE_MODE_CHANGE, STEP_PORT3_ENABLE_MODE_CHANGE, STEP_PORT4_ENABLE_MODE_CHANGE };
+		SERVO::CEqWriteStep* pStep = (SERVO::CEqWriteStep*)getStepWithName(pszName[m_nIndex]);
+		if (pStep == nullptr) {
+			return -1;
+		}
+
+		LOGI("<CLoadPort-%d>准备%s Port", m_nIndex, bEnable ? _T("启用") : _T("禁用"));
+		short value = bEnable ? 1 : 2;
+		if (onWritedBlock != nullptr) {
+			pStep->writeDataEx((const char*)&value, sizeof(short), onWritedBlock);
+		}
+		else {
+			pStep->writeDataEx((const char*)&value, sizeof(short), [&](int code) -> int {
+				if (code == WOK) {
+					LOGI("<CLoadPort-%d>%s Port成功.", m_nIndex, bEnable ? _T("启用") : _T("禁用"));
+				}
+				else {
+					LOGI("<CLoadPort-%d>%s  Port失败,code:%d", m_nIndex, bEnable ? _T("启用") : _T("禁用"), code);
+				}
+
+				return 0;
+				});
+		}
+
+		return 0;
+	}
+
+	int CLoadPort::setPortMode(PortMode mode, ONWRITED onWritedBlock/* = nullptr*/)
+	{
+		static char* pszName[] = { STEP_PORT1_MODE_CHANGE, STEP_PORT2_MODE_CHANGE, STEP_PORT3_MODE_CHANGE, STEP_PORT4_MODE_CHANGE };
+		SERVO::CEqWriteStep* pStep = (SERVO::CEqWriteStep*)getStepWithName(pszName[m_nIndex]);
+		if (pStep == nullptr) {
+			return -1;
+		}
+
+		LOGI("<CLoadPort-%d>准备设置Port mode<%d>", m_nIndex, (int)mode);
+		short value = (short)mode;
+		if (onWritedBlock != nullptr) {
+			pStep->writeDataEx((const char*)&value, sizeof(short), onWritedBlock);
+		}
+		else {
+			pStep->writeDataEx((const char*)&value, sizeof(short), [&](int code) -> int {
+				if (code == WOK) {
+					LOGI("<CLoadPort-%d>设置Port mode成功.", m_nIndex);
+				}
+				else {
+					LOGI("<CLoadPort-%d>设置Port mode失败,code:%d", m_nIndex, code);
+				}
+
+				return 0;
+				});
+		}
+
+		return 0;
+	}
+
+	int CLoadPort::setCassetteType(CassetteType type, ONWRITED onWritedBlock/* = nullptr*/)
+	{
+		static char* pszName[] = { STEP_PORT1_CASSETTE_TYPE_CHANGE, STEP_PORT2_CASSETTE_TYPE_CHANGE, STEP_PORT3_CASSETTE_TYPE_CHANGE, STEP_PORT4_CASSETTE_TYPE_CHANGE };
+		SERVO::CEqWriteStep* pStep = (SERVO::CEqWriteStep*)getStepWithName(pszName[m_nIndex]);
+		if (pStep == nullptr) {
+			return -1;
+		}
+
+		LOGI("<CLoadPort-%d>准备设置Cassette Type<%d>", m_nIndex, (int)type);
+		short value = (short)type;
+		if (onWritedBlock != nullptr) {
+			pStep->writeDataEx((const char*)&value, sizeof(short), onWritedBlock);
+		}
+		else {
+			pStep->writeDataEx((const char*)&value, sizeof(short), [&](int code) -> int {
+				if (code == WOK) {
+					LOGI("<CLoadPort-%d>设置Cassette Type成功.", m_nIndex);
+				}
+				else {
+					LOGI("<CLoadPort-%d>设置Cassette Type失败,code:%d", m_nIndex, code);
+				}
+
+				return 0;
+				});
+		}
+
+		return 0;
+	}
+
+	int CLoadPort::setTransferMode(TransferMode mode, ONWRITED onWritedBlock/* = nullptr*/)
+	{
+		static char* pszName[] = { STEP_PORT1_TRANSFER_MODE_CHANGE, STEP_PORT2_TRANSFER_MODE_CHANGE, STEP_PORT3_TRANSFER_MODE_CHANGE, STEP_PORT4_TRANSFER_MODE_CHANGE };
+		SERVO::CEqWriteStep* pStep = (SERVO::CEqWriteStep*)getStepWithName(pszName[m_nIndex]);
+		if (pStep == nullptr) {
+			return -1;
+		}
+
+		LOGI("<CLoadPort-%d>准备设置Transfer mode<%d>", m_nIndex, (int)mode);
+		short value = (short)mode;
+		if (onWritedBlock != nullptr) {
+			pStep->writeDataEx((const char*)&value, sizeof(short), onWritedBlock);
+		}
+		else {
+			pStep->writeDataEx((const char*)&value, sizeof(short), [&](int code) -> int {
+				if (code == WOK) {
+					LOGI("<CLoadPort-%d>设置Transfer mode成功.", m_nIndex + 1);
+				}
+				else {
+					LOGI("<CLoadPort-%d>设置Transfer mode失败,code:%d", m_nIndex + 1, code);
+				}
+
+				return 0;
+				});
+		}
+
+		return 0;
+	}
+
+	int CLoadPort::eableAutoChange(BOOL bEnable, ONWRITED onWritedBlock/* = nullptr*/)
+	{
+		static char* pszName[] = { STEP_PORT1_TYPE_AUTO_CHANGE, STEP_PORT2_TYPE_AUTO_CHANGE, STEP_PORT3_TYPE_AUTO_CHANGE, STEP_PORT4_TYPE_AUTO_CHANGE };
+		SERVO::CEqWriteStep* pStep = (SERVO::CEqWriteStep*)getStepWithName(pszName[m_nIndex]);
+		if (pStep == nullptr) {
+			return -1;
+		}
+
+		LOGI("<CLoadPort-%d>准备%s Auto Change", m_nIndex, bEnable ? _T("启用") : _T("禁用"));
+		short value = bEnable ? 1 : 2;
+		if (onWritedBlock != nullptr) {
+			pStep->writeDataEx((const char*)&value, sizeof(short), onWritedBlock);
+		}
+		else {
+			pStep->writeDataEx((const char*)&value, sizeof(short), [&](int code) -> int {
+				if (code == WOK) {
+					LOGI("<CLoadPort-%d>%s Auto Change成功.", m_nIndex, bEnable ? _T("启用") : _T("禁用"));
+				}
+				else {
+					LOGI("<CLoadPort-%d>%s  Auto Change失败,code:%d", m_nIndex, bEnable ? _T("启用") : _T("禁用"), code);
+				}
+
+				return 0;
+				});
+		}
+
+		return 0;
+	}
+
 	/*
 	 * 生成测试用的玻璃列表
 	 */
diff --git a/SourceCode/Bond/Servo/CLoadPort.h b/SourceCode/Bond/Servo/CLoadPort.h
index 17d8eef..cd5146e 100644
--- a/SourceCode/Bond/Servo/CLoadPort.h
+++ b/SourceCode/Bond/Servo/CLoadPort.h
@@ -1,5 +1,6 @@
 #pragma once
 #include "CEquipment.h"
+#include "ServoCommo.h"
 
 
 namespace SERVO {
@@ -24,6 +25,14 @@
 		virtual void onReceiveLBData(const char* pszData, size_t size);
 
 	public:
+		int setPortType(PortType type, ONWRITED onWritedBlock = nullptr);
+		int eablePort(BOOL bEnable, ONWRITED onWritedBlock = nullptr);
+		int setPortMode(PortMode mode, ONWRITED onWritedBlock = nullptr);
+		int setCassetteType(CassetteType type, ONWRITED onWritedBlock = nullptr);
+		int setTransferMode(TransferMode mode, ONWRITED onWritedBlock = nullptr);
+		int eableAutoChange(BOOL bEnable, ONWRITED onWritedBlock = nullptr);
+
+	public:
 		void setIndex(unsigned int index);
 		unsigned int getIndex();
 		BOOL isEnable();
diff --git a/SourceCode/Bond/Servo/CPagePortProperty.cpp b/SourceCode/Bond/Servo/CPagePortProperty.cpp
index 88728b5..b163d01 100644
--- a/SourceCode/Bond/Servo/CPagePortProperty.cpp
+++ b/SourceCode/Bond/Servo/CPagePortProperty.cpp
@@ -5,6 +5,8 @@
 #include "Servo.h"
 #include "CPagePortProperty.h"
 #include "afxdialogex.h"
+#include "Log.h"
+#include "MsgDlg.h"
 
 
 // CPagePortProperty 瀵硅瘽妗�
@@ -32,6 +34,11 @@
 	ON_WM_DESTROY()
 	ON_WM_SIZE()
 	ON_BN_CLICKED(IDC_CHECK_ENABLE, &CPagePortProperty::OnBnClickedCheckEnable)
+	ON_CBN_SELCHANGE(IDC_COMBO_PORT_TYPE, &CPagePortProperty::OnCbnSelchangeComboPortType)
+	ON_CBN_SELCHANGE(IDC_COMBO_PORT_MODE, &CPagePortProperty::OnCbnSelchangeComboPortMode)
+	ON_CBN_SELCHANGE(IDC_COMBO_PORT_CASSERT_TYPE, &CPagePortProperty::OnCbnSelchangeComboPortCassertType)
+	ON_CBN_SELCHANGE(IDC_COMBO_PORT_TRANSFER_MODE, &CPagePortProperty::OnCbnSelchangeComboPortTransferMode)
+	ON_BN_CLICKED(IDC_CHECK_AUTO_CHANGE, &CPagePortProperty::OnBnClickedCheckAutoChange)
 END_MESSAGE_MAP()
 
 
@@ -61,12 +68,12 @@
 	}
 
 	pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_PORT_MODE);
-	for (int i = 1; i <= 3; i++) {
+	for (int i = 0; i <= 5; i++) {
 		pComboBox->InsertString(i - 1, SERVO::CLoadPort::getPortModeDescription(i, strTemp).c_str());
 	}
 	int portMode = m_pPort->getPortMode();
-	if (1 <= portMode && portMode <= 3) {
-		pComboBox->SetCurSel(portMode - 1);
+	if (0 <= portMode && portMode <= 5) {
+		pComboBox->SetCurSel(portMode);
 	}
 
 	pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_PORT_CASSERT_TYPE);
@@ -127,6 +134,266 @@
 {
 	BOOL bCheck = ((CButton*)GetDlgItem(IDC_CHECK_ENABLE))->GetCheck() == BST_CHECKED;
 	EnableCtrls(bCheck);
+
+
+	// enable port
+	CMsgDlg msgDlg("璇风瓑寰�", "姝e湪鎿嶄綔锛岃绛夊緟...");
+
+	ASSERT(m_pPort != nullptr);
+	m_pPort->eablePort(bCheck, [&](int code) -> int {
+		Sleep(100);
+		CString strMsg;
+
+		if (code == WOK) {
+			LOGI("%s Port 鎴愬姛.", bCheck ? _T("enable") : _T("disable"));
+
+			msgDlg.DelayClose(3000);
+			strMsg.Format(_T("%s Port 鎴愬姛."), bCheck ? _T("enable") : _T("disable"));
+			msgDlg.DelayClose(3000);
+			msgDlg.SetIcon(MSG_BOX_SUCCEED);
+			msgDlg.SetTitle(_T("鎿嶄綔鎴愬姛"));
+			msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg);
+			msgDlg.SetMarquee(FALSE, 0);
+			msgDlg.SetCompleteCode(0);
+		}
+		else {
+			LOGI("%s Port 澶辫触锛宑ode:%d", bCheck ? _T("enable") : _T("disable"), code);
+
+			msgDlg.DelayClose(3000);
+			strMsg.Format(_T("%s Port 澶辫触锛宑ode:%d"), bCheck ? _T("enable") : _T("disable"), code);
+			msgDlg.DelayClose(3000);
+			msgDlg.SetIcon(MSG_BOX_ERROR);
+			msgDlg.SetTitle(_T("鎿嶄綔澶辫触"));
+			msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg);
+			msgDlg.SetMarquee(FALSE, 0);
+			msgDlg.SetCompleteCode(-1);
+			
+			// 杩樺師鎺т欢鐘舵��
+			EnableCtrls(!bCheck);
+			((CButton*)GetDlgItem(IDC_CHECK_ENABLE))->SetCheck(!bCheck ? BST_CHECKED : BST_UNCHECKED);
+		}
+
+		return 0;
+		});
+
+	msgDlg.DoModal();
+}
+
+void CPagePortProperty::OnCbnSelchangeComboPortType()
+{
+	CMsgDlg msgDlg("璇风瓑寰�", "姝e湪鎿嶄綔锛岃绛夊緟...");
+	msgDlg.SetData((DWORD_PTR)this);
+
+	ASSERT(m_pPort != nullptr);
+	int index = ((CComboBox*)GetDlgItem(IDC_COMBO_PORT_TYPE))->GetCurSel();
+	m_pPort->setPortType(SERVO::PortType(index + 1), [&](int code) -> int {
+		Sleep(100);
+		CString strMsg;
+
+		if (code == WOK) {
+			LOGI("璁剧疆Port Type(%d)鎴愬姛.", index + 1);
+
+			msgDlg.DelayClose(3000);
+			strMsg.Format(_T("璁剧疆Port Type(%d)鎴愬姛"), index + 1);
+			msgDlg.DelayClose(3000);
+			msgDlg.SetIcon(MSG_BOX_SUCCEED);
+			msgDlg.SetTitle(_T("鎿嶄綔鎴愬姛"));
+			msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg);
+			msgDlg.SetMarquee(FALSE, 0);
+			msgDlg.SetCompleteCode(0);
+		}
+		else {
+			LOGI("璁剧疆Port Type(%d)澶辫触锛宑ode:%d", index + 1, code);
+
+			msgDlg.DelayClose(3000);
+			strMsg.Format(_T("璁剧疆Port Type(%d)澶辫触锛宑ode:%d"), index + 1, code);
+			msgDlg.DelayClose(3000);
+			msgDlg.SetIcon(MSG_BOX_ERROR);
+			msgDlg.SetTitle(_T("鎿嶄綔澶辫触"));
+			msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg);
+			msgDlg.SetMarquee(FALSE, 0);
+			msgDlg.SetCompleteCode(-1);
+		}
+
+		return 0;
+	});
+
+	msgDlg.DoModal();
+}
+
+void CPagePortProperty::OnCbnSelchangeComboPortMode()
+{
+	CMsgDlg msgDlg("璇风瓑寰�", "姝e湪鎿嶄綔锛岃绛夊緟...");
+	msgDlg.SetData((DWORD_PTR)this);
+
+	ASSERT(m_pPort != nullptr);
+	int index = ((CComboBox*)GetDlgItem(IDC_COMBO_PORT_MODE))->GetCurSel();
+	m_pPort->setPortMode(SERVO::PortMode(index), [&](int code) -> int {
+		Sleep(100);
+		CString strMsg;
+
+		if (code == WOK) {
+			LOGI("璁剧疆Port Mode(%d)鎴愬姛.", index);
+
+			msgDlg.DelayClose(3000);
+			strMsg.Format(_T("璁剧疆Port Mode(%d)鎴愬姛"), index);
+			msgDlg.DelayClose(3000);
+			msgDlg.SetIcon(MSG_BOX_SUCCEED);
+			msgDlg.SetTitle(_T("鎿嶄綔鎴愬姛"));
+			msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg);
+			msgDlg.SetMarquee(FALSE, 0);
+			msgDlg.SetCompleteCode(0);
+		}
+		else {
+			LOGI("璁剧疆Port Mode(%d)澶辫触锛宑ode:%d", index, code);
+
+			msgDlg.DelayClose(3000);
+			strMsg.Format(_T("璁剧疆Port Mode(%d)澶辫触锛宑ode:%d"), index, code);
+			msgDlg.DelayClose(3000);
+			msgDlg.SetIcon(MSG_BOX_ERROR);
+			msgDlg.SetTitle(_T("鎿嶄綔澶辫触"));
+			msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg);
+			msgDlg.SetMarquee(FALSE, 0);
+			msgDlg.SetCompleteCode(-1);
+		}
+
+		return 0;
+		});
+
+	msgDlg.DoModal();
+}
+
+void CPagePortProperty::OnCbnSelchangeComboPortCassertType()
+{
+	CMsgDlg msgDlg("璇风瓑寰�", "姝e湪鎿嶄綔锛岃绛夊緟...");
+	msgDlg.SetData((DWORD_PTR)this);
+
+	ASSERT(m_pPort != nullptr);
+	int index = ((CComboBox*)GetDlgItem(IDC_COMBO_PORT_CASSERT_TYPE))->GetCurSel();
+	m_pPort->setPortMode(SERVO::PortMode(index + 1), [&](int code) -> int {
+		Sleep(100);
+		CString strMsg;
+
+		if (code == WOK) {
+			LOGI("璁剧疆Cassette type(%d)鎴愬姛.", index + 1);
+
+			msgDlg.DelayClose(3000);
+			strMsg.Format(_T("璁剧疆Cassette type(%d)鎴愬姛"), index + 1);
+			msgDlg.DelayClose(3000);
+			msgDlg.SetIcon(MSG_BOX_SUCCEED);
+			msgDlg.SetTitle(_T("鎿嶄綔鎴愬姛"));
+			msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg);
+			msgDlg.SetMarquee(FALSE, 0);
+			msgDlg.SetCompleteCode(0);
+		}
+		else {
+			LOGI("璁剧疆Cassette type(%d)澶辫触锛宑ode:%d", index + 1, code);
+
+			msgDlg.DelayClose(3000);
+			strMsg.Format(_T("璁剧疆Cassette type(%d)澶辫触锛宑ode:%d"), index + 1, code);
+			msgDlg.DelayClose(3000);
+			msgDlg.SetIcon(MSG_BOX_ERROR);
+			msgDlg.SetTitle(_T("鎿嶄綔澶辫触"));
+			msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg);
+			msgDlg.SetMarquee(FALSE, 0);
+			msgDlg.SetCompleteCode(-1);
+		}
+
+		return 0;
+		});
+
+	msgDlg.DoModal();
+}
+
+void CPagePortProperty::OnCbnSelchangeComboPortTransferMode()
+{
+	// TODO: 鍦ㄦ娣诲姞鎺т欢閫氱煡澶勭悊绋嬪簭浠g爜
+	CMsgDlg msgDlg("璇风瓑寰�", "姝e湪鎿嶄綔锛岃绛夊緟...");
+	msgDlg.SetData((DWORD_PTR)this);
+
+	ASSERT(m_pPort != nullptr);
+	int index = ((CComboBox*)GetDlgItem(IDC_COMBO_PORT_TRANSFER_MODE))->GetCurSel();
+	m_pPort->setPortMode(SERVO::PortMode(index + 1), [&](int code) -> int {
+		Sleep(100);
+		CString strMsg;
+
+		if (code == WOK) {
+			LOGI("璁剧疆Transfer mode(%d)鎴愬姛.", index + 1);
+
+			msgDlg.DelayClose(3000);
+			strMsg.Format(_T("璁剧疆Transfer mode(%d)鎴愬姛"), index + 1);
+			msgDlg.DelayClose(3000);
+			msgDlg.SetIcon(MSG_BOX_SUCCEED);
+			msgDlg.SetTitle(_T("鎿嶄綔鎴愬姛"));
+			msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg);
+			msgDlg.SetMarquee(FALSE, 0);
+			msgDlg.SetCompleteCode(0);
+		}
+		else {
+			LOGI("璁剧疆Transfer mode(%d)澶辫触锛宑ode:%d", index + 1, code);
+
+			msgDlg.DelayClose(3000);
+			strMsg.Format(_T("璁剧疆Transfer mode(%d)澶辫触锛宑ode:%d"), index + 1, code);
+			msgDlg.DelayClose(3000);
+			msgDlg.SetIcon(MSG_BOX_ERROR);
+			msgDlg.SetTitle(_T("鎿嶄綔澶辫触"));
+			msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg);
+			msgDlg.SetMarquee(FALSE, 0);
+			msgDlg.SetCompleteCode(-1);
+		}
+
+		return 0;
+		});
+
+	msgDlg.DoModal();
+}
+
+void CPagePortProperty::OnBnClickedCheckAutoChange()
+{
+	BOOL bCheck = ((CButton*)GetDlgItem(IDC_CHECK_AUTO_CHANGE))->GetCheck() == BST_CHECKED;
+	EnableCtrls(bCheck);
+
+
+	// enable port
+	CMsgDlg msgDlg("璇风瓑寰�", "姝e湪鎿嶄綔锛岃绛夊緟...");
+
+	ASSERT(m_pPort != nullptr);
+	m_pPort->eableAutoChange(bCheck, [&](int code) -> int {
+		Sleep(100);
+		CString strMsg;
+
+		if (code == WOK) {
+			LOGI("%s Auto Change 鎴愬姛.", bCheck ? _T("enable") : _T("disable"));
+
+			msgDlg.DelayClose(3000);
+			strMsg.Format(_T("%s Auto Change 鎴愬姛."), bCheck ? _T("enable") : _T("disable"));
+			msgDlg.DelayClose(3000);
+			msgDlg.SetIcon(MSG_BOX_SUCCEED);
+			msgDlg.SetTitle(_T("鎿嶄綔鎴愬姛"));
+			msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg);
+			msgDlg.SetMarquee(FALSE, 0);
+			msgDlg.SetCompleteCode(0);
+		}
+		else {
+			LOGI("%s Auto Change 澶辫触锛宑ode:%d", bCheck ? _T("enable") : _T("disable"), code);
+
+			msgDlg.DelayClose(3000);
+			strMsg.Format(_T("%s Auto Change 澶辫触锛宑ode:%d"), bCheck ? _T("enable") : _T("disable"), code);
+			msgDlg.DelayClose(3000);
+			msgDlg.SetIcon(MSG_BOX_ERROR);
+			msgDlg.SetTitle(_T("鎿嶄綔澶辫触"));
+			msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg);
+			msgDlg.SetMarquee(FALSE, 0);
+			msgDlg.SetCompleteCode(-1);
+
+			// 杩樺師鎺т欢鐘舵��
+			((CButton*)GetDlgItem(IDC_CHECK_AUTO_CHANGE))->SetCheck(!bCheck ? BST_CHECKED : BST_UNCHECKED);
+		}
+
+		return 0;
+		});
+
+	msgDlg.DoModal();
 }
 
 void CPagePortProperty::EnableCtrls(BOOL bEnable)
@@ -137,3 +404,4 @@
 	GetDlgItem(IDC_COMBO_PORT_TRANSFER_MODE)->EnableWindow(bEnable);
 	GetDlgItem(IDC_CHECK_AUTO_CHANGE)->EnableWindow(bEnable);
 }
+
diff --git a/SourceCode/Bond/Servo/CPagePortProperty.h b/SourceCode/Bond/Servo/CPagePortProperty.h
index f7e159c..7be09fb 100644
--- a/SourceCode/Bond/Servo/CPagePortProperty.h
+++ b/SourceCode/Bond/Servo/CPagePortProperty.h
@@ -37,4 +37,9 @@
 	afx_msg void OnDestroy();
 	afx_msg void OnSize(UINT nType, int cx, int cy);
 	afx_msg void OnBnClickedCheckEnable();
+	afx_msg void OnCbnSelchangeComboPortType();
+	afx_msg void OnCbnSelchangeComboPortMode();
+	afx_msg void OnCbnSelchangeComboPortCassertType();
+	afx_msg void OnCbnSelchangeComboPortTransferMode();
+	afx_msg void OnBnClickedCheckAutoChange();
 };
diff --git a/SourceCode/Bond/Servo/Common.h b/SourceCode/Bond/Servo/Common.h
index e723756..7d09612 100644
--- a/SourceCode/Bond/Servo/Common.h
+++ b/SourceCode/Bond/Servo/Common.h
@@ -34,6 +34,9 @@
 #define EQ_BOX_ONLINE						RGB(0, 176, 80)
 #define EQ_BOX_FRAME1						RGB(22, 22, 22)
 #define EQ_BOX_FRAME2						RGB(255, 127, 39)
+#define CR_MSGBOX_BKGND						RGB(7, 71, 166)
+#define CR_MSGBOX_TITLE						RGB(200, 216, 246)
+#define CR_MSGBOX_MESSAGE					RGB(200, 216, 246)
 
 
 /* LOG BTN */
diff --git a/SourceCode/Bond/Servo/MsgDlg.cpp b/SourceCode/Bond/Servo/MsgDlg.cpp
new file mode 100644
index 0000000..9e797c0
--- /dev/null
+++ b/SourceCode/Bond/Servo/MsgDlg.cpp
@@ -0,0 +1,303 @@
+锘�// MsgDlg.cpp: 瀹炵幇鏂囦欢
+//
+
+#include "stdafx.h"
+#include "Servo.h"
+#include "MsgDlg.h"
+#include "afxdialogex.h"
+
+
+// CMsgDlg 瀵硅瘽妗�
+
+IMPLEMENT_DYNAMIC(CMsgDlg, CDialogEx)
+
+CMsgDlg::CMsgDlg(CWnd* pParent /*=nullptr*/)
+	: CDialogEx(IDD_DIALOG_MSG, pParent)
+{
+	m_nCompleteCode = 0;
+	m_dwData = 0;
+	m_dwDataEx = 0;
+	m_crBkgnd = CR_MSGBOX_BKGND;
+	m_brBkgnd.CreateSolidBrush(m_crBkgnd);
+	m_crTitle = CR_MSGBOX_TITLE;
+	m_crMessage = CR_MSGBOX_MESSAGE;
+	m_nIcon = MSG_BOX_TIP;
+}
+
+CMsgDlg::CMsgDlg(CString strTitle, CString strMessage)
+	: CDialogEx(IDD_DIALOG_MSG, NULL)
+{
+	m_strTitle = strTitle;
+	m_strMessage = strMessage;
+	m_crBkgnd = CR_MSGBOX_BKGND;
+	m_brBkgnd.CreateSolidBrush(m_crBkgnd);
+	m_crTitle = CR_MSGBOX_TITLE;
+	m_crMessage = CR_MSGBOX_MESSAGE;
+	m_nIcon = MSG_BOX_TIP;
+}
+
+CMsgDlg::CMsgDlg(int nIcon, CString strTitle, CString strMessage)
+	: CDialogEx(IDD_DIALOG_MSG, NULL)
+{
+	m_strTitle = strTitle;
+	m_strMessage = strMessage;
+	m_crBkgnd = CR_MSGBOX_BKGND;
+	m_brBkgnd.CreateSolidBrush(m_crBkgnd);
+	m_crTitle = CR_MSGBOX_TITLE;
+	m_crMessage = CR_MSGBOX_MESSAGE;
+	m_nIcon = nIcon;
+}
+
+CMsgDlg::~CMsgDlg()
+{
+}
+
+void CMsgDlg::DoDataExchange(CDataExchange* pDX)
+{
+	CDialogEx::DoDataExchange(pDX);
+}
+
+
+BEGIN_MESSAGE_MAP(CMsgDlg, CDialogEx)
+	ON_WM_TIMER()
+	ON_WM_CTLCOLOR()
+	ON_WM_SIZE()
+END_MESSAGE_MAP()
+
+
+// CMsgDlg 娑堟伅澶勭悊绋嬪簭
+
+void CMsgDlg::SetCompleteCode(int code)
+{
+	m_nCompleteCode = code;
+	CWnd* pProgressCtrl = GetDlgItem(IDC_PROGRESS1);
+	if(pProgressCtrl != nullptr) pProgressCtrl->ShowWindow(SW_HIDE);
+}
+
+int CMsgDlg::GetCompleteCode()
+{
+	return m_nCompleteCode;
+}
+
+void CMsgDlg::SetData(DWORD_PTR dwData)
+{
+	m_dwData = dwData;
+}
+
+DWORD_PTR CMsgDlg::GetData()
+{
+	return m_dwData;
+}
+
+void CMsgDlg::SetDataEx(DWORD_PTR dwData)
+{
+	m_dwDataEx = dwData;
+}
+
+DWORD_PTR CMsgDlg::GetDataEx()
+{
+	return m_dwDataEx;
+}
+
+void CMsgDlg::SetIcon(int nIcon)
+{
+	m_nIcon = nIcon;
+	if (::IsWindow(m_hWnd)) {
+		UpdateIcon();
+	}
+}
+
+void CMsgDlg::UpdateIcon()
+{
+	static char* pszFile[] = { "msgbox_tip.ico", "msgbox_question.ico", "msgbox_warning.ico", "msgbox_error.ico",
+	"msgbox_succeed.ico"};
+	if (MSG_BOX_TIP <= m_nIcon && m_nIcon <= MSG_BOX_SUCCEED) {
+		CStatic* pStatic = (CStatic*)GetDlgItem(IDC_ICON_MAIN);
+		if (pStatic != NULL) {
+			CString strFile;
+			strFile.Format(_T("%s\\res\\%s"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir, pszFile[m_nIcon]);
+			HICON hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), strFile, IMAGE_ICON,
+				48, 48, LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_LOADFROMFILE);
+			pStatic->SetIcon(hIcon);
+			SetMarquee(TRUE, 1);
+		}
+	}
+}
+
+void CMsgDlg::SetTitle(CString strTitle)
+{
+	m_strTitle = strTitle;
+	if (::IsWindow(m_hWnd) && GetDlgItem(IDC_LABEL_TITLE) != NULL) {
+		SetWindowText(m_strTitle);
+		SetDlgItemText(IDC_LABEL_TITLE, m_strTitle);
+	}
+}
+
+void CMsgDlg::SetMessage(CString strMessage)
+{
+	m_strMessage = strMessage;
+	if (::IsWindow(m_hWnd) && GetDlgItem(IDC_LABEL_MSG) != NULL) {
+		SetDlgItemText(IDC_LABEL_MSG, m_strMessage);
+	}
+}
+
+void CMsgDlg::SetMarquee(_In_ BOOL fMarqueeMode, _In_ int nInterval)
+{
+	if (!::IsWindow(m_hWnd)) {
+		return;
+	}
+
+	CProgressCtrl* pProgressCtrl = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
+	if (pProgressCtrl != NULL) {
+		pProgressCtrl->SendMessage(PBM_SETMARQUEE, (WPARAM)fMarqueeMode, (LPARAM)nInterval);
+		if (!fMarqueeMode) {
+			pProgressCtrl->ModifyStyle(PBS_MARQUEE, 0);
+			pProgressCtrl->SetRange32(0, 100);
+			pProgressCtrl->SetPos(0);
+		}
+		else {
+			pProgressCtrl->ModifyStyle(0, PBS_MARQUEE);
+		}
+	}
+}
+
+void CMsgDlg::BeginThread(AFX_THREADPROC pfnThreadProc)
+{
+	CWinThread* pThread = AfxBeginThread(pfnThreadProc, (LPVOID)this,
+		THREAD_PRIORITY_NORMAL, 0, DEBUG_PROCESS);
+}
+
+void CMsgDlg::DelayClose(int nDelay)
+{
+	SetTimer(1, nDelay, NULL);
+}
+
+void CMsgDlg::ShowCloseButton(BOOL bVisible)
+{
+	if (::IsWindow(m_hWnd) && GetDlgItem(IDCANCEL) != NULL) {
+		GetDlgItem(IDCANCEL)->ShowWindow(bVisible ? SW_SHOW : SW_HIDE);
+	}
+}
+
+BOOL CMsgDlg::OnInitDialog()
+{
+	CDialogEx::OnInitDialog();
+
+	SetWindowText(m_strTitle);
+	SetDlgItemText(IDC_LABEL_TITLE, m_strTitle);
+	SetDlgItemText(IDC_LABEL_MSG, m_strMessage);
+
+
+	// 瀛椾綋
+	HFONT hFontDefault = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
+	CFont* pFont = CFont::FromHandle(hFontDefault);
+	LOGFONT lf;
+	pFont->GetLogFont(&lf);
+	lf.lfHeight -= 12;
+	lf.lfWeight = FW_SEMIBOLD;
+	m_fontTitle.CreateFontIndirect(&lf);
+	GetDlgItem(IDC_LABEL_TITLE)->SetFont(&m_fontTitle);
+
+	pFont->GetLogFont(&lf);
+	lf.lfHeight -= 2;
+	m_fontMsg.CreateFontIndirect(&lf);
+	GetDlgItem(IDC_LABEL_MSG)->SetFont(&m_fontMsg);
+
+
+	// 鍥炬爣
+	UpdateIcon();
+	SetMarquee(TRUE, 1);
+	MoveWindow(0, 0, 320, 268);
+	CenterWindow();
+	Resize();
+
+
+	return TRUE;  // return TRUE unless you set the focus to a control
+				  // 寮傚父: OCX 灞炴�ч〉搴旇繑鍥� FALSE
+}
+
+
+void CMsgDlg::OnTimer(UINT_PTR nIDEvent)
+{
+	// TODO: 鍦ㄦ娣诲姞娑堟伅澶勭悊绋嬪簭浠g爜鍜�/鎴栬皟鐢ㄩ粯璁ゅ��
+	if (nIDEvent == 1) {
+		KillTimer(1);
+		PostMessage(WM_CLOSE);
+	}
+
+	CDialogEx::OnTimer(nIDEvent);
+}
+
+
+BOOL CMsgDlg::PreTranslateMessage(MSG* pMsg)
+{
+	// TODO: 鍦ㄦ娣诲姞涓撶敤浠g爜鍜�/鎴栬皟鐢ㄥ熀绫�
+	if (pMsg->message == WM_KEYDOWN) {
+		if ((pMsg->wParam == VK_RETURN) || (pMsg->wParam == VK_ESCAPE) || (pMsg->wParam == VK_SPACE)) {
+			return TRUE;
+		}
+	}
+	return CDialogEx::PreTranslateMessage(pMsg);
+}
+
+HBRUSH CMsgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
+{
+	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
+
+	if (nCtlColor == CTLCOLOR_STATIC) {
+		pDC->SetBkColor(m_crBkgnd);
+		int nID = pWnd->GetDlgCtrlID();
+		if (nID == IDC_LABEL_TITLE) {
+			pDC->SetTextColor(CR_MSGBOX_TITLE);
+		}
+		else if (nID == IDC_LABEL_MSG) {
+			pDC->SetTextColor(CR_MSGBOX_MESSAGE);
+		}
+	}
+
+	return m_brBkgnd;
+}
+
+void CMsgDlg::OnSize(UINT nType, int cx, int cy)
+{
+	CDialogEx::OnSize(nType, cx, cy);
+	if (GetDlgItem(IDC_LABEL_TITLE) == nullptr) return;
+	Resize();
+}
+
+void CMsgDlg::Resize()
+{
+	int x = 28;
+	int y = 28;
+	CWnd* pItem;
+	CRect rcClient, rcIcon, rcItem;
+	GetClientRect(&rcClient);
+
+	pItem = GetDlgItem(IDC_ICON_MAIN);
+	pItem->GetWindowRect(&rcIcon);
+	pItem->MoveWindow(x, y, rcIcon.Width(), rcIcon.Height());
+	x += rcIcon.Width();
+	x += 12;
+
+	// title
+	pItem->GetWindowRect(&rcIcon);
+	ScreenToClient(&rcIcon);
+	pItem = GetDlgItem(IDC_LABEL_TITLE);
+	pItem->GetWindowRect(&rcItem);
+	pItem->MoveWindow(x, rcIcon.top + rcIcon.Height() / 2  - rcItem.Height() / 2,
+		rcClient.Width() - 24 - x, rcItem.Height());
+	x = rcIcon.left;
+	y += rcIcon.Height();
+	y += 18;
+
+	// msg
+	pItem = GetDlgItem(IDC_LABEL_MSG);
+	pItem->GetClientRect(&rcItem);
+	pItem->MoveWindow(x, y, rcClient.Width() - 24 - x, rcItem.Height());
+
+
+	y = rcClient.bottom - 12;
+	pItem = GetDlgItem(IDC_PROGRESS1);
+	pItem->GetClientRect(&rcItem);
+	pItem->MoveWindow(12, y - rcItem.Height(), rcClient.Width() - 24, rcItem.Height());
+}
\ No newline at end of file
diff --git a/SourceCode/Bond/Servo/MsgDlg.h b/SourceCode/Bond/Servo/MsgDlg.h
new file mode 100644
index 0000000..d9f08d9
--- /dev/null
+++ b/SourceCode/Bond/Servo/MsgDlg.h
@@ -0,0 +1,72 @@
+锘�#pragma once
+
+
+// CMsgDlg 瀵硅瘽妗�
+
+#define MSG_BOX_TIP			0x00
+#define MSG_BOX_QUESTION	0x01
+#define MSG_BOX_WARNING		0x02
+#define MSG_BOX_ERROR		0x03
+#define MSG_BOX_SUCCEED		0x04
+
+class CMsgDlg : public CDialogEx
+{
+	DECLARE_DYNAMIC(CMsgDlg)
+
+public:
+	CMsgDlg(CWnd* pParent = nullptr);   // 鏍囧噯鏋勯�犲嚱鏁�
+	CMsgDlg(CString strTitle, CString strMessage);
+	CMsgDlg(int nIcon, CString strTitle, CString strMessage);
+	virtual ~CMsgDlg();
+
+
+public:
+	void BeginThread(AFX_THREADPROC pfnThreadProc);
+	void SetIcon(int nIcon);
+	void SetTitle(CString strTitle);
+	void SetMessage(CString strMessage);
+	void DelayClose(int nDelay);
+	void SetMarquee(_In_ BOOL fMarqueeMode, _In_ int nInterval);
+	void ShowCloseButton(BOOL bVisible);
+	void SetCompleteCode(int code);
+	int GetCompleteCode();
+	void SetData(DWORD_PTR dwData);
+	DWORD_PTR GetData();
+	void SetDataEx(DWORD_PTR dwData);
+	DWORD_PTR GetDataEx();
+
+private:
+	void Resize();
+	void UpdateIcon();
+
+private:
+	COLORREF m_crBkgnd;
+	CBrush m_brBkgnd;
+	int m_nIcon;
+	CString m_strTitle;
+	CString m_strMessage;
+	COLORREF m_crTitle;
+	COLORREF m_crMessage;
+	CFont m_fontTitle;
+	CFont m_fontMsg;
+	int m_nCompleteCode;
+	DWORD_PTR m_dwData;
+	DWORD_PTR m_dwDataEx;
+
+
+// 瀵硅瘽妗嗘暟鎹�
+#ifdef AFX_DESIGN_TIME
+	enum { IDD = IDD_DIALOG_MSG };
+#endif
+
+protected:
+	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 鏀寔
+
+	DECLARE_MESSAGE_MAP()
+public:
+	virtual BOOL OnInitDialog();
+	afx_msg void OnTimer(UINT_PTR nIDEvent);
+	virtual BOOL PreTranslateMessage(MSG* pMsg);
+	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
+	afx_msg void OnSize(UINT nType, int cx, int cy);
+};
diff --git a/SourceCode/Bond/Servo/Servo.rc b/SourceCode/Bond/Servo/Servo.rc
index d8792b7..a341402 100644
--- a/SourceCode/Bond/Servo/Servo.rc
+++ b/SourceCode/Bond/Servo/Servo.rc
Binary files differ
diff --git a/SourceCode/Bond/Servo/Servo.vcxproj b/SourceCode/Bond/Servo/Servo.vcxproj
index e158b1d..778e944 100644
--- a/SourceCode/Bond/Servo/Servo.vcxproj
+++ b/SourceCode/Bond/Servo/Servo.vcxproj
@@ -201,6 +201,7 @@
     <ClInclude Include="CEquipmentPage3.h" />
     <ClInclude Include="CGlassPool.h" />
     <ClInclude Include="CPortStatusReport.h" />
+    <ClInclude Include="MsgDlg.h" />
     <ClInclude Include="PageRecipe.h" />
     <ClInclude Include="CDoubleGlass.h" />
     <ClInclude Include="CProcessData.h" />
@@ -301,6 +302,7 @@
     <ClCompile Include="CEquipmentPage3.cpp" />
     <ClCompile Include="CGlassPool.cpp" />
     <ClCompile Include="CPortStatusReport.cpp" />
+    <ClCompile Include="MsgDlg.cpp" />
     <ClCompile Include="PageRecipe.cpp" />
     <ClCompile Include="CDoubleGlass.cpp" />
     <ClCompile Include="CProcessData.cpp" />
diff --git a/SourceCode/Bond/Servo/Servo.vcxproj.filters b/SourceCode/Bond/Servo/Servo.vcxproj.filters
index 4f377c4..eb0a614 100644
--- a/SourceCode/Bond/Servo/Servo.vcxproj.filters
+++ b/SourceCode/Bond/Servo/Servo.vcxproj.filters
@@ -106,6 +106,7 @@
     <ClCompile Include="CGlassPool.cpp" />
     <ClCompile Include="CEquipmentPage3.cpp" />
     <ClCompile Include="CPortStatusReport.cpp" />
+    <ClCompile Include="MsgDlg.cpp" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="AlarmManager.h" />
@@ -210,6 +211,7 @@
     <ClInclude Include="CGlassPool.h" />
     <ClInclude Include="CEquipmentPage3.h" />
     <ClInclude Include="CPortStatusReport.h" />
+    <ClInclude Include="MsgDlg.h" />
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="Servo.rc" />
diff --git a/SourceCode/Bond/Servo/ServoCommo.h b/SourceCode/Bond/Servo/ServoCommo.h
new file mode 100644
index 0000000..959a8a1
--- /dev/null
+++ b/SourceCode/Bond/Servo/ServoCommo.h
@@ -0,0 +1,37 @@
+#pragma once
+
+
+namespace SERVO {
+	enum PortType {
+		Loading = 1,
+		Unloading,
+		Both,
+		Buffer,
+		LoaderInBuffer,
+		UnloaderInBuffer,
+		UnloadingPartial
+	};
+
+	enum PortMode {
+		OutOfService = 0,
+		TransferBlocked,
+		ReadyToLoad,
+		ReadyToUnload,
+		InService,
+		TransferReady
+	};
+
+	enum MaterialsType {
+		G1 = 0,
+		G2 = 1,
+		G1G2 = 2
+	};
+	typedef MaterialsType CassetteType;
+
+	enum TransferMode {
+		MGVMode = 1,
+		AGVMode,
+		StockerInlineMode
+	};
+}
+
diff --git a/SourceCode/Bond/Servo/resource.h b/SourceCode/Bond/Servo/resource.h
index 6f0240f..140bfaf 100644
--- a/SourceCode/Bond/Servo/resource.h
+++ b/SourceCode/Bond/Servo/resource.h
Binary files differ
diff --git a/SourceCode/Bond/x64/Debug/EqsGraph.ini b/SourceCode/Bond/x64/Debug/EqsGraph.ini
new file mode 100644
index 0000000..9b63e87
--- /dev/null
+++ b/SourceCode/Bond/x64/Debug/EqsGraph.ini
@@ -0,0 +1,51 @@
+[LoadPort 1]
+Left=23
+Top=88
+[LoadPort 2]
+Left=23
+Top=437
+[LoadPort 3]
+Left=1253
+Top=297
+[LoadPort 4]
+Left=1253
+Top=457
+[EFEM(ROBOT)]
+Left=294
+Top=63
+[Bonder 1]
+Left=659
+Top=297
+[Bonder 2]
+Left=659
+Top=437
+[Fliper]
+Left=279
+Top=297
+[Aligner]
+Left=446
+Top=363
+[VacuumBake]
+Left=279
+Top=437
+[BakeCooling]
+Left=853
+Top=363
+[ARM]
+Left=628
+Top=63
+[Arm Tray1]
+Left=467
+Top=63
+[Arm Tray2]
+Left=467
+Top=166
+[Fliper(G2)]
+Left=238
+Top=251
+[VacuumBake(G1)]
+Left=238
+Top=386
+[Measurement]
+Left=1041
+Top=363
diff --git a/SourceCode/Bond/x64/Debug/Master.dat b/SourceCode/Bond/x64/Debug/Master.dat
new file mode 100644
index 0000000..86656a2
--- /dev/null
+++ b/SourceCode/Bond/x64/Debug/Master.dat
Binary files differ
diff --git a/SourceCode/Bond/x64/Debug/Res/msgbox_error.ico b/SourceCode/Bond/x64/Debug/Res/msgbox_error.ico
new file mode 100644
index 0000000..91d0c14
--- /dev/null
+++ b/SourceCode/Bond/x64/Debug/Res/msgbox_error.ico
Binary files differ
diff --git a/SourceCode/Bond/x64/Debug/Res/msgbox_question.ico b/SourceCode/Bond/x64/Debug/Res/msgbox_question.ico
new file mode 100644
index 0000000..fd55f81
--- /dev/null
+++ b/SourceCode/Bond/x64/Debug/Res/msgbox_question.ico
Binary files differ
diff --git a/SourceCode/Bond/x64/Debug/Res/msgbox_succeed.ico b/SourceCode/Bond/x64/Debug/Res/msgbox_succeed.ico
new file mode 100644
index 0000000..60bea0a
--- /dev/null
+++ b/SourceCode/Bond/x64/Debug/Res/msgbox_succeed.ico
Binary files differ
diff --git a/SourceCode/Bond/x64/Debug/Res/msgbox_tip.ico b/SourceCode/Bond/x64/Debug/Res/msgbox_tip.ico
new file mode 100644
index 0000000..190c14b
--- /dev/null
+++ b/SourceCode/Bond/x64/Debug/Res/msgbox_tip.ico
Binary files differ
diff --git a/SourceCode/Bond/x64/Debug/Res/msgbox_warning.ico b/SourceCode/Bond/x64/Debug/Res/msgbox_warning.ico
new file mode 100644
index 0000000..20d21ad
--- /dev/null
+++ b/SourceCode/Bond/x64/Debug/Res/msgbox_warning.ico
Binary files differ
diff --git a/SourceCode/Bond/x64/Debug/Servo.ini b/SourceCode/Bond/x64/Debug/Servo.ini
new file mode 100644
index 0000000..7a7bf01
--- /dev/null
+++ b/SourceCode/Bond/x64/Debug/Servo.ini
@@ -0,0 +1,4 @@
+[App]
+MasterPanelWidth=245
+AttributesPanelWidth=306
+EquipmentPanelWidth=277

--
Gitblit v1.9.3