From 0d41f9169a84eb0082585d55af5785d020628bca Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期四, 27 三月 2025 18:04:24 +0800
Subject: [PATCH] 1.增加人工处理(移除、抱走)物料功能,以便和机器中的实物丰符合。 2.Port1 ~ Port4,type, mode, cassette type, transfer mode, enable mode, type auto change mode数据获取。 3.增加通用的读取cc-link int数据的CEqReadIntStep

---
 SourceCode/Bond/Servo/Servo.vcxproj                          |    4 
 SourceCode/Bond/Servo/CEqPortChangeStep.cpp                  |  268 +++++++++++++++
 SourceCode/Bond/Servo/CEqReadIntStep.h                       |   28 +
 SourceCode/Bond/Servo/resource.h                             |    0 
 SourceCode/Bond/Servo/CEquipmentPage1.cpp                    |   28 +
 SourceCode/Bond/Servo/CEqPortChangeStep.h                    |   35 ++
 SourceCode/Bond/Servo/Servo.vcxproj.filters                  |    4 
 SourceCode/Bond/Servo/CEquipmentPage2.cpp                    |  129 +++++++
 SourceCode/Bond/Servo/CEquipment.cpp                         |   72 +++
 SourceCode/Bond/Servo/Servo.rc                               |    0 
 SourceCode/Bond/Servo/CMaster.cpp                            |  224 +++++++++++++
 Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.1.xlsx |    0 
 SourceCode/Bond/Servo/CEqReadIntStep.cpp                     |   83 ++++
 SourceCode/Bond/Servo/CEquipment.h                           |    5 
 SourceCode/Bond/Servo/CEquipmentPage2.h                      |   10 
 SourceCode/Bond/Servo/CEquipmentPage1.h                      |    3 
 SourceCode/Bond/Servo/Common.h                               |   77 +++-
 17 files changed, 935 insertions(+), 35 deletions(-)

diff --git a/Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.1.xlsx b/Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.1.xlsx
index 544f8a8..be48abf 100644
--- a/Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.1.xlsx
+++ b/Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.1.xlsx
Binary files differ
diff --git a/SourceCode/Bond/Servo/CEqPortChangeStep.cpp b/SourceCode/Bond/Servo/CEqPortChangeStep.cpp
new file mode 100644
index 0000000..0927225
--- /dev/null
+++ b/SourceCode/Bond/Servo/CEqPortChangeStep.cpp
@@ -0,0 +1,268 @@
+#include "stdafx.h"
+#include "CEqPortChangeStep.h"
+#include "Log.h"
+
+
+namespace SERVO {
+	CEqPortChangeStep::CEqPortChangeStep() : CReadStep()
+	{
+		m_nPortDev = 0;
+		m_nPortType = 0;
+		m_nPortMode = 0;
+		m_nPortCassetteType = 0;
+		m_nPortTransferMode = 0;
+		m_nPortEanbleMode = 0;
+		m_nPortTypeAutoChangeMode = 0;
+	}
+
+	CEqPortChangeStep::~CEqPortChangeStep()
+	{
+
+	}
+
+	void CEqPortChangeStep::getAttributeVector(CAttributeVector& attrubutes)
+	{
+		CReadStep::getAttributeVector(attrubutes);
+
+		std::string strTemp;
+		attrubutes.addAttribute(new CAttribute("Port Dev",
+			("W" + CToolUnits::toHexString(m_nPortDev, strTemp)).c_str(), ""));
+		attrubutes.addAttribute(new CAttribute("PortType",
+			std::to_string(m_nPortType).c_str(), getPortTypeDescription(strTemp).c_str()));
+		attrubutes.addAttribute(new CAttribute("PortMode",
+			std::to_string(m_nPortMode).c_str(), getPortModeDescription(strTemp).c_str()));
+		attrubutes.addAttribute(new CAttribute("PortCassetteType",
+			std::to_string(m_nPortCassetteType).c_str(), getPortCassetteTypeDescription(strTemp).c_str()));
+		attrubutes.addAttribute(new CAttribute("PortTransferMode",
+			std::to_string(m_nPortTransferMode).c_str(), getPortTransferModeDescription(strTemp).c_str()));
+		attrubutes.addAttribute(new CAttribute("PortEnableMode",
+			std::to_string(m_nPortEanbleMode).c_str(), getPortEnableModeDescription(strTemp).c_str()));
+		attrubutes.addAttribute(new CAttribute("PortTypeAutoChangeMode",
+			std::to_string(m_nPortTypeAutoChangeMode).c_str(), getPortTypeAutoChangeModeDescription(strTemp).c_str()));
+	}
+
+	int CEqPortChangeStep::onReadData()
+	{
+		CReadStep::onReadData();
+
+
+		char szBuffer[32];
+		int nRet = m_pCclink->ReadData2(m_station, DeviceType::W, m_nPortDev, 32, szBuffer);
+		if (0 != nRet) {
+			return -1;
+		}
+
+		m_nPortType = (unsigned int)CToolUnits::toInt16(&szBuffer[0]);
+		m_nPortMode = (unsigned int)CToolUnits::toInt16(&szBuffer[2]);
+		m_nPortCassetteType = (unsigned int)CToolUnits::toInt32(&szBuffer[4]);
+		m_nPortTransferMode = (unsigned int)CToolUnits::toInt16(&szBuffer[8]);
+		m_nPortEanbleMode = (unsigned int)CToolUnits::toInt16(&szBuffer[10]);
+		m_nPortTypeAutoChangeMode = (unsigned int)CToolUnits::toInt16(&szBuffer[12]);
+
+		/*
+		LOGI("<CEqAlarmStep> Equipment Alarm state Changed<State:%d, Unit:%d, Level:%d, Code:%d, ID:%d>\n",
+			m_nAlarmState, m_nUnitId, m_nAlarmLevel, m_nAlarmCode, m_nAlarmId,
+			m_strText.c_str(), m_strDescription.c_str());
+*/
+
+		return 0;
+	}
+
+	int CEqPortChangeStep::onComplete()
+	{
+		CReadStep::onComplete();
+		LOGI("<CEQPortChangeStep> onComplete.");
+
+		return 0;
+	}
+
+	int CEqPortChangeStep::onTimeout()
+	{
+		CReadStep::onTimeout();
+		LOGI("<CEQPortChangeStep> onTimeout.");
+
+		return 0;
+	}
+
+	void CEqPortChangeStep::setPortDev(int nDev)
+	{
+		m_nPortDev = nDev;
+	}
+
+	int CEqPortChangeStep::getPortType()
+	{
+		return m_nPortType;
+	}
+
+	/*
+	 1: Loading Port
+	 2: Unloading Port
+	 3: Both Port
+	 4: Buffer Port-Buffer Type
+	 5: Buffer Port-Loader in Buffer Type
+	 6: Buffer Port-Un-loader in Buffer Type
+	 7: Unloading Partial Port
+	 */
+	std::string& CEqPortChangeStep::getPortTypeDescription(std::string& strDescription)
+	{
+		switch (m_nPortType) {
+		case 1:
+			strDescription = _T("Loading Port");
+			break;
+		case 2:
+			strDescription = _T("Unloading Port");
+			break;
+		case 3:
+			strDescription = _T("Both Port");
+			break;
+		case 4:
+			strDescription = _T("Buffer Port - Buffer Type");
+			break;
+		case 5:
+			strDescription = _T("Buffer Port - Loader in Buffer Type");
+			break;
+		case 6:
+			strDescription = _T("Buffer Port - Un-loader in Buffer Type");
+			break;
+		case 7:
+			strDescription = _T("Unloading Partial Port");
+			break;
+		default:
+			strDescription = _T("");
+			break;
+		}
+
+		return strDescription;
+	}
+
+	/*
+	 0: OutOfService
+	 1: TransferBlocked
+	 2: ReadyToLoad
+	 3: ReadyToUnload
+	 4: InService
+	 5: TransferReady
+	 */
+	std::string& CEqPortChangeStep::getPortModeDescription(std::string& strDescription)
+	{
+		switch (m_nPortMode) {
+		case 0:
+			strDescription = _T("OutOfService");
+			break;
+		case 1:
+			strDescription = _T("TransferBlocked");
+			break;
+		case 2:
+			strDescription = _T("ReadyToLoad");
+			break;
+		case 3:
+			strDescription = _T("ReadyToUnload");
+			break;
+		case 4:
+			strDescription = _T("InService");
+			break;
+		case 5:
+			strDescription = _T("TransferReady");
+			break;
+		default:
+			strDescription = _T("");
+			break;
+		}
+
+		return strDescription;
+	}
+
+	/*
+	 1: G1
+	 2: G2
+	 3: G1&G2
+	 */
+	std::string& CEqPortChangeStep::getPortCassetteTypeDescription(std::string& strDescription)
+	{
+		switch (m_nPortCassetteType) {
+		case 1:
+			strDescription = _T("G1");
+			break;
+		case 2:
+			strDescription = _T("G2");
+			break;
+		case 3:
+			strDescription = _T("G1&G2");
+			break;
+		default:
+			strDescription = _T("");
+			break;
+		}
+
+		return strDescription;
+	}
+
+	/*
+	 1: MGV Mode
+	 2: AGV Mode
+	 3: Stocker Inline Mode
+	 */
+	std::string& CEqPortChangeStep::getPortTransferModeDescription(std::string& strDescription)
+	{
+		switch (m_nPortTransferMode) {
+		case 1:
+			strDescription = _T("MGV Mode");
+			break;
+		case 2:
+			strDescription = _T("AGV Mode");
+			break;
+		case 3:
+			strDescription = _T("Stocker Inline Mode");
+			break;
+		default:
+			strDescription = _T("");
+			break;
+		}
+
+		return strDescription;
+	}
+
+
+	/*
+	 1 : Enable
+	 2 : Disable
+	 */
+	std::string& CEqPortChangeStep::getPortEnableModeDescription(std::string& strDescription)
+	{
+		switch (m_nPortEanbleMode) {
+		case 1:
+			strDescription = _T("Enable");
+			break;
+		case 2:
+			strDescription = _T("Disable");
+			break;
+		default:
+			strDescription = _T("");
+			break;
+		}
+
+		return strDescription;
+	}
+
+	/*
+	 1: Auto Change Enable
+	 2: Auto Change Disable
+	 */
+	std::string& CEqPortChangeStep::getPortTypeAutoChangeModeDescription(std::string& strDescription)
+	{
+		switch (m_nPortTypeAutoChangeMode) {
+		case 1:
+			strDescription = _T("Auto Change Enable");
+			break;
+		case 2:
+			strDescription = _T("Auto Change Disable");
+			break;
+		default:
+			strDescription = _T("");
+			break;
+		}
+
+		return strDescription;
+	}
+}
+
diff --git a/SourceCode/Bond/Servo/CEqPortChangeStep.h b/SourceCode/Bond/Servo/CEqPortChangeStep.h
new file mode 100644
index 0000000..27f7a99
--- /dev/null
+++ b/SourceCode/Bond/Servo/CEqPortChangeStep.h
@@ -0,0 +1,35 @@
+#pragma once
+#include "CReadStep.h"
+
+namespace SERVO {
+	class CEqPortChangeStep : public CReadStep
+	{
+	public:
+		CEqPortChangeStep();
+		~CEqPortChangeStep();
+
+	public:
+		virtual void getAttributeVector(CAttributeVector& attrubutes);
+		virtual int onReadData();
+		virtual int onComplete();
+		virtual int onTimeout();
+		void setPortDev(int nDev);
+		int getPortType();
+		std::string& getPortTypeDescription(std::string& strDescription);
+		std::string& getPortModeDescription(std::string& strDescription);
+		std::string& getPortCassetteTypeDescription(std::string& strDescription);
+		std::string& getPortTransferModeDescription(std::string& strDescription);
+		std::string& getPortEnableModeDescription(std::string& strDescription);
+		std::string& getPortTypeAutoChangeModeDescription(std::string& strDescription);
+
+	private:
+		int m_nPortDev;
+		int m_nPortType;
+		int m_nPortMode;
+		int m_nPortCassetteType;
+		int m_nPortTransferMode;
+		int m_nPortEanbleMode;
+		int m_nPortTypeAutoChangeMode;
+	};
+}
+
diff --git a/SourceCode/Bond/Servo/CEqReadIntStep.cpp b/SourceCode/Bond/Servo/CEqReadIntStep.cpp
new file mode 100644
index 0000000..17174ae
--- /dev/null
+++ b/SourceCode/Bond/Servo/CEqReadIntStep.cpp
@@ -0,0 +1,83 @@
+#include "stdafx.h"
+#include "CEqReadIntStep.h"
+#include "Log.h"
+
+
+namespace SERVO {
+	CEqReadIntStep::CEqReadIntStep() : CReadStep()
+	{
+		m_nDataType = __INT16;
+		m_nValueDev = 0;
+		m_nValue = 0;
+	}
+
+	CEqReadIntStep::CEqReadIntStep(int dataType, int dev)
+	{
+		m_nDataType = dataType;
+		m_nValueDev = dev;
+		m_nValue = 0;
+	}
+
+	CEqReadIntStep::~CEqReadIntStep()
+	{
+
+	}
+
+	void CEqReadIntStep::getAttributeVector(CAttributeVector& attrubutes)
+	{
+		CReadStep::getAttributeVector(attrubutes);
+
+		std::string strTemp;
+		attrubutes.addAttribute(new CAttribute("Dev",
+			("W" + CToolUnits::toHexString(m_nValueDev, strTemp)).c_str(), ""));
+		attrubutes.addAttribute(new CAttribute("Value",
+			std::to_string(m_nValue).c_str(), ""));
+	}
+
+	int CEqReadIntStep::onReadData()
+	{
+		CReadStep::onReadData();
+
+
+		char szBuffer[32];
+		int nRet = m_pCclink->ReadData2(m_station, DeviceType::W, m_nValueDev,
+			m_nDataType == __INT16 ? 2 : 4, szBuffer);
+		if (0 != nRet) {
+			return -1;
+		}
+
+		if (m_nDataType == __INT16) {
+			m_nValue = (unsigned int)CToolUnits::toInt16(&szBuffer[0]);
+		}
+		else {
+			m_nValue = (unsigned int)CToolUnits::toInt32(&szBuffer[0]);
+		}
+
+		LOGI("<CEqReadIntStep>Value(%s) Changed<Dev:%d, Value:%d>\n",
+			m_strName.c_str(), m_nValueDev, m_nValue);
+
+		return 0;
+	}
+
+	int CEqReadIntStep::onComplete()
+	{
+		CReadStep::onComplete();
+		LOGI("<CEQPortChangeStep> onComplete.");
+
+		return 0;
+	}
+
+	int CEqReadIntStep::onTimeout()
+	{
+		CReadStep::onTimeout();
+		LOGI("<CEQPortChangeStep> onTimeout.");
+
+		return 0;
+	}
+
+	int CEqReadIntStep::getValue()
+	{
+		return m_nValue;
+	}
+}
+
diff --git a/SourceCode/Bond/Servo/CEqReadIntStep.h b/SourceCode/Bond/Servo/CEqReadIntStep.h
new file mode 100644
index 0000000..30f1337
--- /dev/null
+++ b/SourceCode/Bond/Servo/CEqReadIntStep.h
@@ -0,0 +1,28 @@
+#pragma once
+#include "CReadStep.h"
+
+namespace SERVO {
+constexpr auto __INT16 = 1;
+constexpr auto __INT32 = 2;
+
+	class CEqReadIntStep : public CReadStep
+	{
+	public:
+		CEqReadIntStep();
+		CEqReadIntStep(int dataType, int dev);
+		~CEqReadIntStep();
+
+	public:
+		virtual void getAttributeVector(CAttributeVector& attrubutes);
+		virtual int onReadData();
+		virtual int onComplete();
+		virtual int onTimeout();
+		int getValue();
+
+	private:
+		int m_nDataType;
+		int m_nValueDev;
+		int m_nValue;
+	};
+}
+
diff --git a/SourceCode/Bond/Servo/CEquipment.cpp b/SourceCode/Bond/Servo/CEquipment.cpp
index a52da00..fa4bb1a 100644
--- a/SourceCode/Bond/Servo/CEquipment.cpp
+++ b/SourceCode/Bond/Servo/CEquipment.cpp
@@ -366,12 +366,35 @@
 			}
 		}
 
-		index = 0x350;
-		bFlag = isBitOn(pszData, size, index);
-		pStep = getStep(index);
-		if (pStep != nullptr) {
-			((CWriteStep*)pStep)->onRecvSignal(bFlag);
-		}
+		// CIM Mode
+		checkStepSignalStepSignal(0x350, pszData, size);
+
+		// Port1 ~ Port4
+		checkStepSignalStepSignal(0x3e0, pszData, size);
+		checkStepSignalStepSignal(0x3e1, pszData, size);
+		checkStepSignalStepSignal(0x3e2, pszData, size);
+		checkStepSignalStepSignal(0x3e3, pszData, size);
+		checkStepSignalStepSignal(0x3e8, pszData, size);
+		checkStepSignalStepSignal(0x3e9, pszData, size);
+		checkStepSignalStepSignal(0x3ea, pszData, size);
+		checkStepSignalStepSignal(0x3eb, pszData, size);
+		checkStepSignalStepSignal(0x3f0, pszData, size);
+		checkStepSignalStepSignal(0x3f1, pszData, size);
+		checkStepSignalStepSignal(0x3f2, pszData, size);
+		checkStepSignalStepSignal(0x3f3, pszData, size);
+		checkStepSignalStepSignal(0x3f8, pszData, size);
+		checkStepSignalStepSignal(0x3f9, pszData, size);
+		checkStepSignalStepSignal(0x3fa, pszData, size);
+		checkStepSignalStepSignal(0x3fb, pszData, size);
+		checkStepSignalStepSignal(0x400, pszData, size);
+		checkStepSignalStepSignal(0x401, pszData, size);
+		checkStepSignalStepSignal(0x402, pszData, size);
+		checkStepSignalStepSignal(0x403, pszData, size);
+		checkStepSignalStepSignal(0x408, pszData, size);
+		checkStepSignalStepSignal(0x409, pszData, size);
+		checkStepSignalStepSignal(0x40a, pszData, size);
+		checkStepSignalStepSignal(0x40b, pszData, size);
+
 	}
 
 	BOOL CEquipment::isBitOn(const char* pszData, size_t size, int index)
@@ -614,6 +637,34 @@
 		}
 	}
 
+	BOOL CEquipment::removeClass(CGlass* pGlass)
+	{
+		Lock();
+		bool bExist = std::find(m_glassList.begin(), m_glassList.end(), pGlass) != m_glassList.end();
+		if (bExist) {
+			pGlass->addPath(EQ_ID_OPERATOR_REMOVE);
+			pGlass->release();
+			m_glassList.remove(pGlass);
+		}
+		Unlock();
+
+		if (bExist && m_listener.onDataChanged != nullptr) {
+			m_listener.onDataChanged(this, 0);
+		}
+
+		return bExist;
+	}
+
+	void CEquipment::getGlassList(std::list<CGlass*>& list)
+	{
+		Lock();
+		for (auto item : m_glassList) {
+			item->addRef();
+			list.push_back(item);
+		}
+		Unlock();
+	}
+
 	CGlass* CEquipment::getFrontGlass()
 	{
 		CGlass* pGlass = nullptr;
@@ -626,4 +677,13 @@
 
 		return pGlass;
 	}
+
+	void CEquipment::checkStepSignalStepSignal(unsigned int addr, const char* pszData, size_t size)
+	{
+		BOOL bFlag = isBitOn(pszData, size, addr);
+		SERVO::CStep* pStep = getStep(addr);
+		if (pStep != nullptr) {
+			((CWriteStep*)pStep)->onRecvSignal(bFlag);
+		}
+	}
 }
diff --git a/SourceCode/Bond/Servo/CEquipment.h b/SourceCode/Bond/Servo/CEquipment.h
index af939bf..e03061d 100644
--- a/SourceCode/Bond/Servo/CEquipment.h
+++ b/SourceCode/Bond/Servo/CEquipment.h
@@ -13,6 +13,8 @@
 #include "CEqCimMessageClearStep.h"
 #include "CEqDateTimeSetCmdStep.h"
 #include "CEqVCREnableStep.h"
+#include "CEqPortChangeStep.h"
+#include "CEqReadIntStep.h"
 #include <vector>
 #include <map>
 #include <list>
@@ -94,7 +96,9 @@
 		virtual BOOL glassWillArrive(CGlass* pGlass);
 		virtual int outputGlass(int port);
 		virtual int glassArrived(CGlass* pGlass);
+		void getGlassList(std::list<CGlass*>& list);
 		CGlass* getFrontGlass();
+		BOOL removeClass(CGlass* pGlass);
 
 	// 以下为从CC-Link读取到的Bit标志位检测函数
 	public:
@@ -110,6 +114,7 @@
 	private:
 		BOOL isBitOn(const char* pszData, size_t size, int index);
 		inline BOOL equalBool(BOOL b1, BOOL b2);
+		void checkStepSignalStepSignal(unsigned int addr, const char* pszData, size_t size);
 
 	protected:
 		inline void Lock() { EnterCriticalSection(&m_criticalSection); }
diff --git a/SourceCode/Bond/Servo/CEquipmentPage1.cpp b/SourceCode/Bond/Servo/CEquipmentPage1.cpp
index a6a80f4..30aa397 100644
--- a/SourceCode/Bond/Servo/CEquipmentPage1.cpp
+++ b/SourceCode/Bond/Servo/CEquipmentPage1.cpp
@@ -28,6 +28,9 @@
 
 
 BEGIN_MESSAGE_MAP(CEquipmentPage1, CHMPropertyPage)
+	ON_WM_CTLCOLOR()
+	ON_WM_DESTROY()
+	ON_WM_SIZE()
 END_MESSAGE_MAP()
 
 
@@ -35,7 +38,6 @@
 void CEquipmentPage1::OnApply()
 {
 	__super::OnApply();
-	AfxMessageBox("CEquipmentPage1::OnApply()");
 }
 
 void CEquipmentPage1::setEquipment(SERVO::CEquipment* pEquipment)
@@ -52,3 +54,27 @@
 	return TRUE;  // return TRUE unless you set the focus to a control
 				  // 寮傚父: OCX 灞炴�ч〉搴旇繑鍥� FALSE
 }
+
+HBRUSH CEquipmentPage1::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
+{
+	HBRUSH hbr = CHMPropertyPage::OnCtlColor(pDC, pWnd, nCtlColor);
+
+	// TODO:  鍦ㄦ鏇存敼 DC 鐨勪换浣曠壒鎬�
+
+	// TODO:  濡傛灉榛樿鐨勪笉鏄墍闇�鐢荤瑪锛屽垯杩斿洖鍙︿竴涓敾绗�
+	return hbr;
+}
+
+void CEquipmentPage1::OnDestroy()
+{
+	CHMPropertyPage::OnDestroy();
+
+	// TODO: 鍦ㄦ澶勬坊鍔犳秷鎭鐞嗙▼搴忎唬鐮�
+}
+
+void CEquipmentPage1::OnSize(UINT nType, int cx, int cy)
+{
+	CHMPropertyPage::OnSize(nType, cx, cy);
+
+	// TODO: 鍦ㄦ澶勬坊鍔犳秷鎭鐞嗙▼搴忎唬鐮�
+}
diff --git a/SourceCode/Bond/Servo/CEquipmentPage1.h b/SourceCode/Bond/Servo/CEquipmentPage1.h
index 994b0a0..91e4f90 100644
--- a/SourceCode/Bond/Servo/CEquipmentPage1.h
+++ b/SourceCode/Bond/Servo/CEquipmentPage1.h
@@ -30,4 +30,7 @@
 	DECLARE_MESSAGE_MAP()
 public:
 	virtual BOOL OnInitDialog();
+	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
+	afx_msg void OnDestroy();
+	afx_msg void OnSize(UINT nType, int cx, int cy);
 };
diff --git a/SourceCode/Bond/Servo/CEquipmentPage2.cpp b/SourceCode/Bond/Servo/CEquipmentPage2.cpp
index c79ab1a..ca4b445 100644
--- a/SourceCode/Bond/Servo/CEquipmentPage2.cpp
+++ b/SourceCode/Bond/Servo/CEquipmentPage2.cpp
@@ -24,10 +24,16 @@
 void CEquipmentPage2::DoDataExchange(CDataExchange* pDX)
 {
 	CHMPropertyPage::DoDataExchange(pDX);
+	DDX_Control(pDX, IDC_LIST1, m_listCtrl);
 }
 
 
 BEGIN_MESSAGE_MAP(CEquipmentPage2, CHMPropertyPage)
+	ON_WM_CTLCOLOR()
+	ON_WM_DESTROY()
+	ON_WM_SIZE()
+	ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, &CEquipmentPage2::OnLvnItemchangedList1)
+	ON_BN_CLICKED(IDC_BUTTON_REMOVE, &CEquipmentPage2::OnBnClickedButtonRemove)
 END_MESSAGE_MAP()
 
 
@@ -35,7 +41,6 @@
 void CEquipmentPage2::OnApply()
 {
 	__super::OnApply();
-	AfxMessageBox("CEquipmentPage2::OnApply()");
 }
 
 void CEquipmentPage2::setEquipment(SERVO::CEquipment* pEquipment)
@@ -48,8 +53,128 @@
 {
 	CHMPropertyPage::OnInitDialog();
 
-	AfxMessageBox(m_pEquipment->getClassName());
+	
+	// 璇诲嚭鍒楀
+	CString strIniFile, strItem;
+	strIniFile.Format(_T("%s\\configuration.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir);
+	int width[8] = { 0, 218, 180, 180, 180, 180, 180, 180 };
+	for (int i = 0; i < 8; i++) {
+		strItem.Format(_T("Col_%d_Width"), i);
+		width[i] = GetPrivateProfileInt("EquipmentPage2ListCtrl", strItem, width[i], strIniFile);
+	}
+
+
+	// 鎶ヨ〃鎺т欢
+	DWORD dwStyle = m_listCtrl.GetExtendedStyle();
+	dwStyle |= LVS_EX_FULLROWSELECT;
+	dwStyle |= LVS_EX_GRIDLINES;
+	m_listCtrl.SetExtendedStyle(dwStyle);
+
+	HIMAGELIST imageList = ImageList_Create(24, 24, ILC_COLOR24, 1, 1);
+	ListView_SetImageList(m_listCtrl.GetSafeHwnd(), imageList, LVSIL_SMALL);
+	m_listCtrl.InsertColumn(0, _T(""), LVCFMT_RIGHT, width[0]);
+	m_listCtrl.InsertColumn(1, _T("ID"), LVCFMT_LEFT, width[1]);
+	m_listCtrl.InsertColumn(2, _T("鏃堕棿"), LVCFMT_LEFT, width[2]);
+	m_listCtrl.SetColumnWidth(2, LVSCW_AUTOSIZE_USEHEADER);
+
+
+	ASSERT(m_pEquipment);
+	std::list<SERVO::CGlass*> list;
+	m_pEquipment->getGlassList(list);
+	for (auto item : list) {
+		item->addRef();				
+		item->release();		// 閲婃斁list涓殑寮曠敤
+		int index = m_listCtrl.InsertItem(m_listCtrl.GetItemCount(), _T(""));
+		m_listCtrl.SetItemData(index, (DWORD_PTR)item);
+		m_listCtrl.SetItemText(index, 1, item->getID().c_str());
+
+	}
 
 	return TRUE;  // return TRUE unless you set the focus to a control
 				  // 寮傚父: OCX 灞炴�ч〉搴旇繑鍥� FALSE
 }
+
+HBRUSH CEquipmentPage2::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
+{
+	HBRUSH hbr = CHMPropertyPage::OnCtlColor(pDC, pWnd, nCtlColor);
+
+	// TODO:  鍦ㄦ鏇存敼 DC 鐨勪换浣曠壒鎬�
+
+	// TODO:  濡傛灉榛樿鐨勪笉鏄墍闇�鐢荤瑪锛屽垯杩斿洖鍙︿竴涓敾绗�
+	return hbr;
+}
+
+void CEquipmentPage2::OnDestroy()
+{
+	CHMPropertyPage::OnDestroy();
+
+	// 淇濆瓨鍒楀
+	CString strIniFile, strItem, strTemp;
+	strIniFile.Format(_T("%s\\configuration.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir);
+	CHeaderCtrl* pHeader = m_listCtrl.GetHeaderCtrl();
+	for (int i = 0; i < pHeader->GetItemCount(); i++) {
+		RECT rect;
+		pHeader->GetItemRect(i, &rect);
+		strItem.Format(_T("Col_%d_Width"), i);
+		strTemp.Format(_T("%d"), rect.right - rect.left);
+		WritePrivateProfileString("EquipmentPage2ListCtrl", strItem, strTemp, strIniFile);
+	}
+
+	for (int i = 0; i < m_listCtrl.GetItemCount(); i++) {
+		SERVO::CGlass* pGlass = (SERVO::CGlass*)m_listCtrl.GetItemData(i);
+		pGlass->release();
+	}
+}
+
+void CEquipmentPage2::OnSize(UINT nType, int cx, int cy)
+{
+	CHMPropertyPage::OnSize(nType, cx, cy);
+	if (GetDlgItem(IDC_LIST1) == nullptr) return;
+
+	CWnd* pItem;
+	CRect rcClient, rcItem;
+	GetClientRect(&rcClient);
+
+	int x = 12;
+	int y2 = rcClient.bottom - 12;
+	pItem = GetDlgItem(IDC_BUTTON_REMOVE);
+	pItem->GetWindowRect(&rcItem);
+	pItem->MoveWindow(x, y2 - rcItem.Height(), rcItem.Width(), rcItem.Height());
+	y2 -= rcItem.Height();
+	y2 -= 8;
+
+	m_listCtrl.MoveWindow(x, 58, rcClient.Width() - 24, y2 - 58);
+}
+
+void CEquipmentPage2::OnLvnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)
+{
+	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
+
+	if (LVIF_STATE == pNMLV->uChanged) {
+		int nItem = pNMLV->iItem;
+		GetDlgItem(IDC_BUTTON_REMOVE)->EnableWindow(GetSelectedItemIndex() >= 0);
+	}
+
+
+	*pResult = 0;
+}
+
+int CEquipmentPage2::GetSelectedItemIndex()
+{
+	POSITION pos = m_listCtrl.GetFirstSelectedItemPosition();
+	return m_listCtrl.GetNextSelectedItem(pos);
+}
+
+void CEquipmentPage2::OnBnClickedButtonRemove()
+{
+	int index = GetSelectedItemIndex();
+	if (index >= 0) {
+		SERVO::CGlass* pGlass = (SERVO::CGlass*)m_listCtrl.GetItemData(index);
+		ASSERT(m_pEquipment);
+		BOOL bRet = m_pEquipment->removeClass(pGlass);
+		if (bRet) {
+			pGlass->release();
+			m_listCtrl.DeleteItem(index);
+		}
+	}
+}
diff --git a/SourceCode/Bond/Servo/CEquipmentPage2.h b/SourceCode/Bond/Servo/CEquipmentPage2.h
index 36a82ca..99a7596 100644
--- a/SourceCode/Bond/Servo/CEquipmentPage2.h
+++ b/SourceCode/Bond/Servo/CEquipmentPage2.h
@@ -1,6 +1,7 @@
 锘�#pragma once
 #include "CHMPropertyPage.h"
 #include "CEquipment.h"
+#include "ListCtrlEx.h"
 
 
 // CEpuipmentPage2 瀵硅瘽妗�
@@ -16,7 +17,11 @@
 	void setEquipment(SERVO::CEquipment* pEquipment);
 
 private:
+	int GetSelectedItemIndex();
+
+private:
 	SERVO::CEquipment* m_pEquipment;
+	CListCtrlEx m_listCtrl;
 
 
 // 瀵硅瘽妗嗘暟鎹�
@@ -30,4 +35,9 @@
 	DECLARE_MESSAGE_MAP()
 public:
 	virtual BOOL OnInitDialog();
+	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
+	afx_msg void OnDestroy();
+	afx_msg void OnSize(UINT nType, int cx, int cy);
+	afx_msg void OnLvnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult);
+	afx_msg void OnBnClickedButtonRemove();
 };
diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index 145531f..ba4be00 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -378,6 +378,230 @@
 			}
 		}
 
+		// Port1
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d1f);
+			pStep->setName(STEP_EQ_PORT1_TYPE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0x80);
+			if (pEquipment->addStep(0x3e0, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d20);
+			pStep->setName(STEP_EQ_PORT1_MODE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0x88);
+			if (pEquipment->addStep(0x3e8, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x4d21);
+			pStep->setName(STEP_EQ_PORT1_CASSETTE_TYPE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0x90);
+			if (pEquipment->addStep(0x3f0, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d23);
+			pStep->setName(STEP_EQ_PORT1_TRANSFER_MODE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0x98);
+			if (pEquipment->addStep(0x3f8, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d24);
+			pStep->setName(STEP_EQ_PORT1_ENABLE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0xa0);
+			if (pEquipment->addStep(0x400, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d25);
+			pStep->setName(STEP_EQ_PORT1_TYPE_ATUO);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0xa8);
+			if (pEquipment->addStep(0x408, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		// Port2
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d2f);
+			pStep->setName(STEP_EQ_PORT2_TYPE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0x81);
+			if (pEquipment->addStep(0x3e1, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d30);
+			pStep->setName(STEP_EQ_PORT2_MODE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0x89);
+			if (pEquipment->addStep(0x3e9, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x4d31);
+			pStep->setName(STEP_EQ_PORT2_CASSETTE_TYPE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0x91);
+			if (pEquipment->addStep(0x3f1, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d33);
+			pStep->setName(STEP_EQ_PORT2_TRANSFER_MODE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0x99);
+			if (pEquipment->addStep(0x3f9, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d34);
+			pStep->setName(STEP_EQ_PORT2_ENABLE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0xa1);
+			if (pEquipment->addStep(0x401, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d35);
+			pStep->setName(STEP_EQ_PORT2_TYPE_ATUO);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0xa9);
+			if (pEquipment->addStep(0x409, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		// Port3
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d3f);
+			pStep->setName(STEP_EQ_PORT3_TYPE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0x82);
+			if (pEquipment->addStep(0x3e2, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d40);
+			pStep->setName(STEP_EQ_PORT3_MODE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0x8a);
+			if (pEquipment->addStep(0x3ea, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x4d41);
+			pStep->setName(STEP_EQ_PORT3_CASSETTE_TYPE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0x92);
+			if (pEquipment->addStep(0x3f2, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d43);
+			pStep->setName(STEP_EQ_PORT3_TRANSFER_MODE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0x9a);
+			if (pEquipment->addStep(0x3fa, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d44);
+			pStep->setName(STEP_EQ_PORT3_ENABLE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0xa2);
+			if (pEquipment->addStep(0x402, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d45);
+			pStep->setName(STEP_EQ_PORT3_TYPE_ATUO);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0xaa);
+			if (pEquipment->addStep(0x40a, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		// Port4
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d4f);
+			pStep->setName(STEP_EQ_PORT4_TYPE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0x83);
+			if (pEquipment->addStep(0x3e3, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d50);
+			pStep->setName(STEP_EQ_PORT4_MODE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0x8b);
+			if (pEquipment->addStep(0x3eb, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x4d51);
+			pStep->setName(STEP_EQ_PORT4_CASSETTE_TYPE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0x93);
+			if (pEquipment->addStep(0x3f3, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d53);
+			pStep->setName(STEP_EQ_PORT4_TRANSFER_MODE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0x9b);
+			if (pEquipment->addStep(0x3fb, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d54);
+			pStep->setName(STEP_EQ_PORT4_ENABLE);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0xa3);
+			if (pEquipment->addStep(0x403, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d55);
+			pStep->setName(STEP_EQ_PORT4_TYPE_ATUO);
+			pStep->setListener(listener);
+			pStep->setWriteSignalDev(0xab);
+			if (pEquipment->addStep(0x40b, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
 		pEquipment->init();
 		LOGE("已添加“EFEM(ROBOT)”.");
 		return 0;
diff --git a/SourceCode/Bond/Servo/Common.h b/SourceCode/Bond/Servo/Common.h
index 3860990..4741d5e 100644
--- a/SourceCode/Bond/Servo/Common.h
+++ b/SourceCode/Bond/Servo/Common.h
@@ -50,35 +50,60 @@
 #define BTN_ALARM_BKGND_PRESS			RGB(133, 203, 225)
 
 /* Equipment ID */
-#define EQ_ID_EFEM			1
-#define EQ_ID_Bonder1		2
-#define EQ_ID_Bonder2		3
-#define EQ_ID_LOADPORT1		4
-#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
+#define EQ_ID_EFEM				1
+#define EQ_ID_Bonder1			2
+#define EQ_ID_Bonder2			3
+#define EQ_ID_LOADPORT1			4
+#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
+#define EQ_ID_OPERATOR_REMOVE	999
 
 
 /* step name */
-#define STEP_MODE				_T("EQMode")
-#define STEP_STATUS				_T("EQStatus")
-#define STEP_ALARM_START		_T("EQAlarm")
-#define STEP_ALARM_BLOCK1		_T("EQAlarm1")
-#define STEP_ALARM_BLOCK2		_T("EQAlarm2")
-#define STEP_ALARM_BLOCK3		_T("EQAlarm3")
-#define STEP_ALARM_BLOCK4		_T("EQAlarm4")
-#define STEP_ALARM_BLOCK5		_T("EQAlarm5")
-#define STEP_PROCESS			_T("EQProcess")
-#define STEP_CIM_MODE_CHANGE	_T("EQCimModeChange")
-#define STEP_EQ_MODE_CHANGE		_T("EQModeChange")
-#define STEP_CIM_MESSAGE_CMD	_T("EQCimMessageCmd")
-#define STEP_CIM_MESSAGE_CLEAR	_T("EQCimMessageClear")
-#define STEP_DATETIME_SET_CMD	_T("EQDateTimeSetCmd")
-#define STEP_EQ_VCR_ENABLE		_T("EQVCREnable")
+#define STEP_MODE						_T("EQMode")
+#define STEP_STATUS						_T("EQStatus")
+#define STEP_ALARM_START				_T("EQAlarm")
+#define STEP_ALARM_BLOCK1				_T("EQAlarm1")
+#define STEP_ALARM_BLOCK2				_T("EQAlarm2")
+#define STEP_ALARM_BLOCK3				_T("EQAlarm3")
+#define STEP_ALARM_BLOCK4				_T("EQAlarm4")
+#define STEP_ALARM_BLOCK5				_T("EQAlarm5")
+#define STEP_PROCESS					_T("EQProcess")
+#define STEP_CIM_MODE_CHANGE			_T("EQCimModeChange")
+#define STEP_EQ_MODE_CHANGE				_T("EQModeChange")
+#define STEP_CIM_MESSAGE_CMD			_T("EQCimMessageCmd")
+#define STEP_CIM_MESSAGE_CLEAR			_T("EQCimMessageClear")
+#define STEP_DATETIME_SET_CMD			_T("EQDateTimeSetCmd")
+#define STEP_EQ_VCR_ENABLE				_T("EQVCREnable")
+#define STEP_EQ_PORT1_TYPE				_T("EQPort1Type")
+#define STEP_EQ_PORT1_MODE				_T("EQPort1Mode")
+#define STEP_EQ_PORT1_CASSETTE_TYPE		_T("EQPort1CassetteType")
+#define STEP_EQ_PORT1_TRANSFER_MODE		_T("EQPort1TransferMode")
+#define STEP_EQ_PORT1_ENABLE			_T("EQPort1Enable")
+#define STEP_EQ_PORT1_TYPE_ATUO			_T("EQPort1TypeAuto")
+#define STEP_EQ_PORT2_TYPE				_T("EQPort2Type")
+#define STEP_EQ_PORT2_MODE				_T("EQPort2Mode")
+#define STEP_EQ_PORT2_CASSETTE_TYPE		_T("EQPort2CassetteType")
+#define STEP_EQ_PORT2_TRANSFER_MODE		_T("EQPort2TransferMode")
+#define STEP_EQ_PORT2_ENABLE			_T("EQPort2Enable")
+#define STEP_EQ_PORT2_TYPE_ATUO			_T("EQPort2TypeAuto")
+#define STEP_EQ_PORT3_TYPE				_T("EQPort3Type")
+#define STEP_EQ_PORT3_MODE				_T("EQPort3Mode")
+#define STEP_EQ_PORT3_CASSETTE_TYPE		_T("EQPort3CassetteType")
+#define STEP_EQ_PORT3_TRANSFER_MODE		_T("EQPort3TransferMode")
+#define STEP_EQ_PORT3_ENABLE			_T("EQPort3Enable")
+#define STEP_EQ_PORT3_TYPE_ATUO			_T("EQPort3TypeAuto")
+#define STEP_EQ_PORT4_TYPE				_T("EQPort4Type")
+#define STEP_EQ_PORT4_MODE				_T("EQPort4Mode")
+#define STEP_EQ_PORT4_CASSETTE_TYPE		_T("EQPort4CassetteType")
+#define STEP_EQ_PORT4_TRANSFER_MODE		_T("EQPort4TransferMode")
+#define STEP_EQ_PORT4_ENABLE			_T("EQPort4Enable")
+#define STEP_EQ_PORT4_TYPE_ATUO			_T("EQPort4TypeAuto")
 
 
 /* base alarm */
diff --git a/SourceCode/Bond/Servo/Servo.rc b/SourceCode/Bond/Servo/Servo.rc
index f8d9760..b533912 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 f76866d..2260705 100644
--- a/SourceCode/Bond/Servo/Servo.vcxproj
+++ b/SourceCode/Bond/Servo/Servo.vcxproj
@@ -213,7 +213,9 @@
     <ClInclude Include="CEqDateTimeSetCmdStep.h" />
     <ClInclude Include="CEqModeChangeStep.h" />
     <ClInclude Include="CEqModeStep.h" />
+    <ClInclude Include="CEqPortChangeStep.h" />
     <ClInclude Include="CEqProcessStep.h" />
+    <ClInclude Include="CEqReadIntStep.h" />
     <ClInclude Include="CEqStatusStep.h" />
     <ClInclude Include="CEquipmentPage1.h" />
     <ClInclude Include="CEquipmentPage2.h" />
@@ -286,7 +288,9 @@
     <ClCompile Include="CEqDateTimeSetCmdStep.cpp" />
     <ClCompile Include="CEqModeChangeStep.cpp" />
     <ClCompile Include="CEqModeStep.cpp" />
+    <ClCompile Include="CEqPortChangeStep.cpp" />
     <ClCompile Include="CEqProcessStep.cpp" />
+    <ClCompile Include="CEqReadIntStep.cpp" />
     <ClCompile Include="CEqStatusStep.cpp" />
     <ClCompile Include="CEquipmentPage1.cpp" />
     <ClCompile Include="CEquipmentPage2.cpp" />
diff --git a/SourceCode/Bond/Servo/Servo.vcxproj.filters b/SourceCode/Bond/Servo/Servo.vcxproj.filters
index 833b489..74279a7 100644
--- a/SourceCode/Bond/Servo/Servo.vcxproj.filters
+++ b/SourceCode/Bond/Servo/Servo.vcxproj.filters
@@ -79,6 +79,8 @@
     <ClCompile Include="CEquipmentPage2.cpp" />
     <ClCompile Include="CHMPropertyPage.cpp" />
     <ClCompile Include="CHMPropertyDlg.cpp" />
+    <ClCompile Include="CEqPortChangeStep.cpp" />
+    <ClCompile Include="CEqReadIntStep.cpp" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="AlarmManager.h" />
@@ -156,6 +158,8 @@
     <ClInclude Include="CEquipmentPage2.h" />
     <ClInclude Include="CHMPropertyPage.h" />
     <ClInclude Include="CHMPropertyDlg.h" />
+    <ClInclude Include="CEqPortChangeStep.h" />
+    <ClInclude Include="CEqReadIntStep.h" />
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="Servo.rc" />
diff --git a/SourceCode/Bond/Servo/resource.h b/SourceCode/Bond/Servo/resource.h
index 7fbb48e..a676416 100644
--- a/SourceCode/Bond/Servo/resource.h
+++ b/SourceCode/Bond/Servo/resource.h
Binary files differ

--
Gitblit v1.9.3