From 6dc80508b1c0f431007f8a8c947c152ec00c3d15 Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期一, 08 九月 2025 09:24:05 +0800
Subject: [PATCH] Merge branch 'clh' into liuyang

---
 SourceCode/Bond/Servo/CPageLinkSignal.cpp |  122 +++++++++++++++++++++++++++++++++-------
 1 files changed, 99 insertions(+), 23 deletions(-)

diff --git a/SourceCode/Bond/Servo/CPageLinkSignal.cpp b/SourceCode/Bond/Servo/CPageLinkSignal.cpp
index b06b015..6be6563 100644
--- a/SourceCode/Bond/Servo/CPageLinkSignal.cpp
+++ b/SourceCode/Bond/Servo/CPageLinkSignal.cpp
@@ -19,6 +19,7 @@
 
 CPageLinkSignal::CPageLinkSignal(CWnd* pParent /*=nullptr*/)
 	: CHMPropertyPage(IDD_PAGE_LINK_SIGNAL, pParent)
+	, m_bEnable(TRUE)
 {
 	m_pEquipment = nullptr;
 }
@@ -30,6 +31,7 @@
 void CPageLinkSignal::DoDataExchange(CDataExchange* pDX)
 {
 	CHMPropertyPage::DoDataExchange(pDX);
+	DDX_Check(pDX, IDC_CHECK_ENABLE, m_bEnable);
 }
 
 
@@ -38,6 +40,7 @@
 	ON_WM_DESTROY()
 	ON_WM_SIZE()
 	ON_WM_TIMER()
+	ON_BN_CLICKED(IDC_CHECK_ENABLE, &CPageLinkSignal::OnClickedCheckEnable)
 END_MESSAGE_MAP()
 
 
@@ -56,6 +59,12 @@
 
 	KillTimer(TIMER_ID_SIGNAL_UPDATE);
 	SetTimer(TIMER_ID_SIGNAL_UPDATE, TIMER_INTERVAL_MS, nullptr);
+
+
+	if (m_pEquipment) {
+		m_bEnable = m_pEquipment->IsEnabled();
+		UpdateData(FALSE);
+	}
 
 	return TRUE;  // return TRUE unless you set the focus to a control
 				  // 寮傚父: OCX 灞炴�ч〉搴旇繑鍥� FALSE
@@ -80,10 +89,20 @@
 	// TODO: 鍦ㄦ澶勬坊鍔犳秷鎭鐞嗙▼搴忎唬鐮�
 	for (int i = 0; i < 8; i++) {
 		for (int j = 0; j < 8; j++) {
-			if (m_pBtn[i][j] != nullptr) {
-				m_pBtn[i][j]->DestroyWindow();
-				delete m_pBtn[i][j];
-				m_pBtn[i][j] = nullptr;
+			if (m_pBtnUpstream[i][j] != nullptr) {
+				m_pBtnUpstream[i][j]->DestroyWindow();
+				delete m_pBtnUpstream[i][j];
+				m_pBtnUpstream[i][j] = nullptr;
+			}
+		}
+	}
+
+	for (int i = 0; i < 8; i++) {
+		for (int j = 0; j < 4; j++) {
+			if (m_pBtnDwonstream[i][j] != nullptr) {
+				m_pBtnDwonstream[i][j]->DestroyWindow();
+				delete m_pBtnDwonstream[i][j];
+				m_pBtnDwonstream[i][j] = nullptr;
 			}
 		}
 	}
@@ -110,11 +129,28 @@
 		y = BTN_Y + (BTN_WIDTH + marginy) * row;
 		for (int col = 0; col < 8; col++) {
 			x = BTN_X + (BTN_WIDTH + marginx) * col;
-			m_pBtn[row][col] = new CBlButton();
-			m_pBtn[row][col]->Create("", WS_VISIBLE, { x, y, x + 36, y + 36 }, this, 1000);
-			m_pBtn[row][col]->SetFaceColor(FACECOLOR_OFF);
-			m_pBtn[row][col]->SetFrameColor(RGB(28, 28, 28));
-			m_pBtn[row][col]->SetTextColor(RGB(238, 238, 238));
+			m_pBtnUpstream[row][col] = new CBlButton();
+			m_pBtnUpstream[row][col]->Create("", WS_VISIBLE, { x, y, x + 36, y + 36 }, this, 1000);
+			m_pBtnUpstream[row][col]->SetFaceColor(FACECOLOR_OFF);
+			m_pBtnUpstream[row][col]->SetFrameColor(RGB(28, 28, 28));
+			m_pBtnUpstream[row][col]->SetTextColor(RGB(238, 238, 238));
+		}
+	}
+
+	CRect rcLine;
+	GetDlgItem(IDC_LINE1)->GetWindowRect(&rcLine);
+	GetDlgItem(IDC_LINE1)->MoveWindow(BTN_X + (BTN_WIDTH + marginx) * 8 - marginx / 2, BTN_Y,
+		rcLine.Width(), (BTN_WIDTH + marginy) * 7 + BTN_WIDTH);
+
+	for (int row = 0; row < 8; row++) {
+		y = BTN_Y + (BTN_WIDTH + marginy) * row;
+		for (int col = 0; col < 4; col++) {
+			x = BTN_X + (BTN_WIDTH + marginx) * (col + 8);
+			m_pBtnDwonstream[row][col] = new CBlButton();
+			m_pBtnDwonstream[row][col]->Create("", WS_VISIBLE, { x, y, x + 36, y + 36 }, this, 1000);
+			m_pBtnDwonstream[row][col]->SetFaceColor(FACECOLOR_OFF);
+			m_pBtnDwonstream[row][col]->SetFrameColor(RGB(28, 28, 28));
+			m_pBtnDwonstream[row][col]->SetTextColor(RGB(238, 238, 238));
 		}
 	}
 
@@ -131,13 +167,22 @@
 	}
 
 	int idy[] = { IDC_LABEL_NAME1, IDC_LABEL_NAME2, IDC_LABEL_NAME3, IDC_LABEL_NAME4, IDC_LABEL_NAME5,
-		IDC_LABEL_NAME6, IDC_LABEL_NAME7, IDC_LABEL_NAME8 };
-	for (int i = 0; i < 8; i++) {
+		IDC_LABEL_NAME6, IDC_LABEL_NAME7, IDC_LABEL_NAME8, IDC_LABEL_NAME9, IDC_LABEL_NAME10, 
+		IDC_LABEL_NAME11, IDC_LABEL_NAME12};
+	for (int i = 0; i < sizeof(idy) / sizeof(int); i++) {
 		pItem = GetDlgItem(idy[i]);
 		pItem->GetWindowRect(&rcItem);
 		pItem->MoveWindow(BTN_X + (BTN_WIDTH + marginx) * i,
 			BTN_Y - 36,
 			rcItem.Width(), rcItem.Height());
+	}
+
+	pItem = GetDlgItem(IDC_CHECK_ENABLE);
+	if (pItem) {
+		int nCheckboxX = max(0, BTN_X - 50);
+		int nCheckboxY = max(0, BTN_Y - rcItem.Height() - 30);
+		pItem->GetWindowRect(&rcItem);
+		pItem->MoveWindow(nCheckboxX, nCheckboxY, rcItem.Width(), rcItem.Height());
 	}
 }
 
@@ -145,36 +190,67 @@
 {
 	if (nIDEvent == TIMER_ID_SIGNAL_UPDATE) {
 		if (m_pEquipment) {
-			UpdateAllSignalStatesFromDevice();
+			UpdateAllUpstreamSignalStatesFromDevice();
+			UpdateAllDownstreamSignalStatesFromDevice();
 		}
 	}
 
 	CHMPropertyPage::OnTimer(nIDEvent);
 }
 
-void CPageLinkSignal::UpdateAllSignalStatesFromDevice()
+void CPageLinkSignal::UpdateAllUpstreamSignalStatesFromDevice()
 {
 	ASSERT(m_pEquipment);
 
 	for (int nRow = 0; nRow < 8; ++nRow) {
 		for (int nCol = 0; nCol < 8; ++nCol) {
-			BOOL bCurrentState = m_pEquipment->isLinkSignalUpstreamOn(nRow, nCol);
-			UpdateSignalState(nRow, nCol, bCurrentState);
+			BOOL bCurrentState = m_pEquipment->isLinkSignalUpstreamOn(nRow, nCol) && m_pEquipment->IsEnabled();
+			UpdateUpstreamSignalState(nRow, nCol, bCurrentState);
 		}
 	}
 }
 
-void CPageLinkSignal::UpdateSignalState(int nRow, int nCol, bool bNewState)
+void CPageLinkSignal::UpdateAllDownstreamSignalStatesFromDevice()
 {
-	if (!::IsWindow(m_pBtn[nRow][nCol]->GetSafeHwnd())) {
-		return;
-	}
+	ASSERT(m_pEquipment);
 
-	bool bState = ::GetProp(m_pBtn[nRow][nCol]->GetSafeHwnd(), _T("State")) == (void*)1;
-	if (bState != bNewState) {
-		m_pBtn[nRow][nCol]->SetFaceColor(bNewState ? FACECOLOR_ON : FACECOLOR_OFF);
-		::SetProp(m_pBtn[nRow][nCol]->GetSafeHwnd(), _T("State"), bNewState ? (void*)1 : (void*)0);
+	for (int nRow = 0; nRow < 8; ++nRow) {
+		for (int nCol = 0; nCol < 4; ++nCol) {
+			BOOL bCurrentState = m_pEquipment->isLinkSignalDownstreamOn(nRow, nCol) && m_pEquipment->IsEnabled();
+			UpdateDownstreamSignalState(nRow, nCol, bCurrentState);
+		}
 	}
 }
 
+void CPageLinkSignal::UpdateUpstreamSignalState(int nRow, int nCol, bool bNewState)
+{
+	if (!::IsWindow(m_pBtnUpstream[nRow][nCol]->GetSafeHwnd())) {
+		return;
+	}
 
+	bool bState = ::GetProp(m_pBtnUpstream[nRow][nCol]->GetSafeHwnd(), _T("State")) == (void*)1;
+	if (bState != bNewState) {
+		m_pBtnUpstream[nRow][nCol]->SetFaceColor(bNewState ? FACECOLOR_ON : FACECOLOR_OFF);
+		::SetProp(m_pBtnUpstream[nRow][nCol]->GetSafeHwnd(), _T("State"), bNewState ? (void*)1 : (void*)0);
+	}
+}
+
+void CPageLinkSignal::UpdateDownstreamSignalState(int nRow, int nCol, bool bNewState)
+{
+	if (!::IsWindow(m_pBtnDwonstream[nRow][nCol]->GetSafeHwnd())) {
+		return;
+	}
+
+	bool bState = ::GetProp(m_pBtnDwonstream[nRow][nCol]->GetSafeHwnd(), _T("State")) == (void*)1;
+	if (bState != bNewState) {
+		m_pBtnDwonstream[nRow][nCol]->SetFaceColor(bNewState ? FACECOLOR_ON : FACECOLOR_OFF);
+		::SetProp(m_pBtnDwonstream[nRow][nCol]->GetSafeHwnd(), _T("State"), bNewState ? (void*)1 : (void*)0);
+	}
+}
+
+void CPageLinkSignal::OnClickedCheckEnable()
+{
+	// TODO: 鍦ㄦ娣诲姞鎺т欢閫氱煡澶勭悊绋嬪簭浠g爜
+	UpdateData(TRUE);
+	m_pEquipment->SetEnable(m_bEnable);
+}

--
Gitblit v1.9.3