From a61cdfb6cad0327c2fc794cbc70be37baf80c85d Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期六, 07 六月 2025 14:37:00 +0800
Subject: [PATCH] 1. 通过定时器更新Link Signal到界面
---
SourceCode/Bond/Servo/CEquipmentPage1.cpp | 88 ++++++++++++++++++++++++++++++--------------
1 files changed, 60 insertions(+), 28 deletions(-)
diff --git a/SourceCode/Bond/Servo/CEquipmentPage1.cpp b/SourceCode/Bond/Servo/CEquipmentPage1.cpp
index f410b17..56c8cbd 100644
--- a/SourceCode/Bond/Servo/CEquipmentPage1.cpp
+++ b/SourceCode/Bond/Servo/CEquipmentPage1.cpp
@@ -13,6 +13,9 @@
#define SIGNAL_GRID_COLS 8
#define SIGNAL_GRID_SIZE (SIGNAL_GRID_ROWS * SIGNAL_GRID_COLS)
+#define TIMER_ID_SIGNAL_UPDATE 1001
+#define TIMER_INTERVAL_MS 1000 // 姣� 1 绉掓洿鏂颁竴娆�
+
IMPLEMENT_DYNAMIC(CEquipmentPage1, CHMPropertyPage)
CEquipmentPage1::CEquipmentPage1(CWnd* pParent /*=nullptr*/)
@@ -36,6 +39,7 @@
ON_WM_CTLCOLOR()
ON_WM_DESTROY()
ON_WM_SIZE()
+ ON_WM_TIMER()
END_MESSAGE_MAP()
@@ -51,28 +55,9 @@
if (m_pEquipment != nullptr) {
InitSignalListForDevice(pEquipment->getID());
- LoadSignalPanelUI();
}
else {
- m_nCurrentDeviceID = 0;
- m_vSignalList.clear();
- m_ctrlSignalPanel.ClearAll();
- }
-}
-
-void CEquipmentPage1::LoadSignalPanelUI()
-{
- if (!::IsWindow(m_ctrlSignalPanel.GetSafeHwnd())) {
- return;
- }
-
- for (int i = 0; i < SIGNAL_GRID_SIZE; ++i) {
- int nRow = i / SIGNAL_GRID_COLS;
- int nCol = i % SIGNAL_GRID_COLS;
-
- const auto& signal = m_vSignalList[i];
- m_ctrlSignalPanel.SetSlotText(nRow, nCol, signal.strName);
- m_ctrlSignalPanel.SetSlotClickable(nRow, nCol, signal.bClickable);
+ ResetSignalPanel();
}
}
@@ -117,8 +102,8 @@
CString strSignalName = tokens[1];
bool bClickable = _ttoi(tokens[2]) ? TRUE : FALSE;
- if (nDeviceID <= 0 || strSignalName.IsEmpty()) {
- TRACE(_T("CSV 鏁版嵁鏃犳晥 [琛� %d]锛氳澶嘔D鎴栦俊鍙峰悕涓虹┖銆俓n"), nLineNum);
+ if (nDeviceID <= 0 || nDeviceID > 999 || strSignalName.IsEmpty()) {
+ TRACE(_T("CSV 琛� %d锛氭棤鏁堣澶嘔D=%d 鎴栦俊鍙峰悕涓虹┖\n"), nLineNum, nDeviceID);
continue;
}
@@ -138,7 +123,6 @@
auto it = m_mapSignalListByID.find(nDeviceID);
if (it != m_mapSignalListByID.end()) {
m_vSignalList = it->second;
- UpdateAllSignalStatesFromDevice();
}
else {
TRACE(_T("Warning: No signals found for DeviceID=%d\n"), nDeviceID);
@@ -148,6 +132,9 @@
while (m_vSignalList.size() < SIGNAL_GRID_SIZE) {
m_vSignalList.push_back({ _T(""), false, false });
}
+
+ InitSignalSlotTextAndClickable();
+ UpdateAllSignalStatesFromDevice();
}
void CEquipmentPage1::UpdateSignalState(int nRow, int nCol, bool bNewState)
@@ -161,10 +148,28 @@
return;
}
- m_vSignalList[nIndex].bCurrentState = bNewState;
- m_ctrlSignalPanel.SetSlotStatus(nRow, nCol, bNewState);
+ if (m_vSignalList[nIndex].bCurrentState != bNewState) {
+ m_vSignalList[nIndex].bCurrentState = bNewState;
+ m_ctrlSignalPanel.SetSlotStatus(nRow, nCol, bNewState);
- TRACE(_T("UpdateSignalState: [%d, %d] = %d\n"), nRow, nCol, bNewState);
+ TRACE(_T("[Device %d] UpdateSignalState: [%d, %d] = %d\n"), m_nCurrentDeviceID, nRow, nCol, bNewState);
+ }
+}
+
+void CEquipmentPage1::InitSignalSlotTextAndClickable()
+{
+ if (!::IsWindow(m_ctrlSignalPanel.GetSafeHwnd())) {
+ return;
+ }
+
+ for (int i = 0; i < SIGNAL_GRID_SIZE; ++i) {
+ int nRow = i / SIGNAL_GRID_COLS;
+ int nCol = i % SIGNAL_GRID_COLS;
+
+ const auto& signal = m_vSignalList[i];
+ m_ctrlSignalPanel.SetSlotText(nRow, nCol, signal.strName);
+ m_ctrlSignalPanel.SetSlotClickable(nRow, nCol, signal.bClickable);
+ }
}
void CEquipmentPage1::UpdateAllSignalStatesFromDevice()
@@ -179,6 +184,17 @@
UpdateSignalState(nRow, nCol, bCurrentState);
}
}
+}
+
+void CEquipmentPage1::ResetSignalPanel()
+{
+ if (!::IsWindow(m_ctrlSignalPanel.GetSafeHwnd())) {
+ return;
+ }
+
+ m_ctrlSignalPanel.ClearAll();
+ m_vSignalList.clear();
+ m_nCurrentDeviceID = 0;
}
BOOL CEquipmentPage1::OnInitDialog()
@@ -210,8 +226,10 @@
// 濡傛灉璁惧宸茶缃紝鍒欏垵濮嬪寲淇″彿鍒楄〃
if (m_pEquipment != nullptr) {
InitSignalListForDevice(m_pEquipment->getID());
- LoadSignalPanelUI();
}
+
+ 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
@@ -232,7 +250,10 @@
CHMPropertyPage::OnDestroy();
// TODO: 鍦ㄦ澶勬坊鍔犳秷鎭鐞嗙▼搴忎唬鐮�
- m_ctrlSignalPanel.DestroyWindow();
+ KillTimer(TIMER_ID_SIGNAL_UPDATE);
+ if (::IsWindow(m_ctrlSignalPanel.GetSafeHwnd())) {
+ m_ctrlSignalPanel.DestroyWindow();
+ }
}
void CEquipmentPage1::OnSize(UINT nType, int cx, int cy)
@@ -247,3 +268,14 @@
m_ctrlSignalPanel.MoveWindow(rc);
}
}
+
+void CEquipmentPage1::OnTimer(UINT_PTR nIDEvent)
+{
+ if (nIDEvent == TIMER_ID_SIGNAL_UPDATE) {
+ if (m_pEquipment && !m_vSignalList.empty()) {
+ UpdateAllSignalStatesFromDevice();
+ }
+ }
+
+ CHMPropertyPage::OnTimer(nIDEvent);
+}
\ No newline at end of file
--
Gitblit v1.9.3