From 6d71f1d8264b929ca71bf133246b894ed955c079 Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期四, 12 六月 2025 15:17:50 +0800
Subject: [PATCH] Merge branch 'master' into liuyang

---
 SourceCode/Bond/Servo/CPageLinkSignal.cpp |  180 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 180 insertions(+), 0 deletions(-)

diff --git a/SourceCode/Bond/Servo/CPageLinkSignal.cpp b/SourceCode/Bond/Servo/CPageLinkSignal.cpp
new file mode 100644
index 0000000..ca7ee40
--- /dev/null
+++ b/SourceCode/Bond/Servo/CPageLinkSignal.cpp
@@ -0,0 +1,180 @@
+锘�// CPageLinkSignal.cpp: 瀹炵幇鏂囦欢
+//
+
+#include "stdafx.h"
+#include "Servo.h"
+#include "CPageLinkSignal.h"
+#include "afxdialogex.h"
+
+
+#define FACECOLOR_ON		RGB(34, 177, 76)
+#define FACECOLOR_OFF		RGB(195, 195, 195)
+
+#define TIMER_ID_SIGNAL_UPDATE  1001
+#define TIMER_INTERVAL_MS       1000  // 姣� 1 绉掓洿鏂颁竴娆�
+
+// CPageLinkSignal 瀵硅瘽妗�
+
+IMPLEMENT_DYNAMIC(CPageLinkSignal, CHMPropertyPage)
+
+CPageLinkSignal::CPageLinkSignal(CWnd* pParent /*=nullptr*/)
+	: CHMPropertyPage(IDD_PAGE_LINK_SIGNAL, pParent)
+{
+	m_pEquipment = nullptr;
+}
+
+CPageLinkSignal::~CPageLinkSignal()
+{
+}
+
+void CPageLinkSignal::DoDataExchange(CDataExchange* pDX)
+{
+	CHMPropertyPage::DoDataExchange(pDX);
+}
+
+
+BEGIN_MESSAGE_MAP(CPageLinkSignal, CHMPropertyPage)
+	ON_WM_CTLCOLOR()
+	ON_WM_DESTROY()
+	ON_WM_SIZE()
+	ON_WM_TIMER()
+END_MESSAGE_MAP()
+
+
+// CPageLinkSignal 娑堟伅澶勭悊绋嬪簭
+
+void CPageLinkSignal::setEquipment(SERVO::CEquipment* pEquipment)
+{
+	m_pEquipment = pEquipment;
+}
+
+BOOL CPageLinkSignal::OnInitDialog()
+{
+	CHMPropertyPage::OnInitDialog();
+	CreateSignalButtons();
+
+
+	KillTimer(TIMER_ID_SIGNAL_UPDATE);
+	SetTimer(TIMER_ID_SIGNAL_UPDATE, TIMER_INTERVAL_MS, nullptr);
+
+	return TRUE;  // return TRUE unless you set the focus to a control
+				  // 寮傚父: OCX 灞炴�ч〉搴旇繑鍥� FALSE
+}
+
+
+HBRUSH CPageLinkSignal::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
+{
+	HBRUSH hbr = CHMPropertyPage::OnCtlColor(pDC, pWnd, nCtlColor);
+
+	// TODO:  鍦ㄦ鏇存敼 DC 鐨勪换浣曠壒鎬�
+
+	// TODO:  濡傛灉榛樿鐨勪笉鏄墍闇�鐢荤瑪锛屽垯杩斿洖鍙︿竴涓敾绗�
+	return hbr;
+}
+
+
+void CPageLinkSignal::OnDestroy()
+{
+	CHMPropertyPage::OnDestroy();
+
+	// 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;
+			}
+		}
+	}
+}
+
+
+void CPageLinkSignal::OnSize(UINT nType, int cx, int cy)
+{
+	CHMPropertyPage::OnSize(nType, cx, cy);
+
+	// TODO: 鍦ㄦ澶勬坊鍔犳秷鎭鐞嗙▼搴忎唬鐮�
+}
+
+#define BTN_X		98
+#define BTN_Y		80
+#define BTN_WIDTH	36
+void CPageLinkSignal::CreateSignalButtons()
+{
+	int x = 100;
+	int y = 100;
+	int marginx = 32;
+	int marginy = 12;
+	for (int row = 0; row < 8; row++) {
+		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));
+		}
+	}
+
+	CWnd* pItem;
+	CRect rcItem;
+	int idx[] = { IDC_LABEL_PATH1, IDC_LABEL_PATH2, IDC_LABEL_PATH3, IDC_LABEL_PATH4, IDC_LABEL_PATH5,
+		IDC_LABEL_PATH6, IDC_LABEL_PATH7, IDC_LABEL_PATH8};
+	for (int i = 0; i < 8; i++) {
+		pItem = GetDlgItem(idx[i]);
+		pItem->GetWindowRect(&rcItem);
+		pItem->MoveWindow(BTN_X - rcItem.Width() - 18,
+			BTN_Y + (36 - rcItem.Height()) / 2 + (BTN_WIDTH + marginy) * i,
+			rcItem.Width(), rcItem.Height());
+	}
+
+	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++) {
+		pItem = GetDlgItem(idy[i]);
+		pItem->GetWindowRect(&rcItem);
+		pItem->MoveWindow(BTN_X + (BTN_WIDTH + marginx) * i,
+			BTN_Y - 36,
+			rcItem.Width(), rcItem.Height());
+	}
+}
+
+void CPageLinkSignal::OnTimer(UINT_PTR nIDEvent)
+{
+	if (nIDEvent == TIMER_ID_SIGNAL_UPDATE) {
+		if (m_pEquipment) {
+			UpdateAllSignalStatesFromDevice();
+		}
+	}
+
+	CHMPropertyPage::OnTimer(nIDEvent);
+}
+
+void CPageLinkSignal::UpdateAllSignalStatesFromDevice()
+{
+	ASSERT(m_pEquipment);
+
+	for (int nRow = 0; nRow < 8; ++nRow) {
+		for (int nCol = 0; nCol < 8; ++nCol) {
+			BOOL bCurrentState = m_pEquipment->isLinkSignalOn(nRow, nCol);
+			UpdateSignalState(nRow, nCol, bCurrentState);
+		}
+	}
+}
+
+void CPageLinkSignal::UpdateSignalState(int nRow, int nCol, bool bNewState)
+{
+	if (!::IsWindow(m_pBtn[nRow][nCol]->GetSafeHwnd())) {
+		return;
+	}
+
+	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);
+	}
+}
+
+

--
Gitblit v1.9.3