From 7203ac92219156addaa0d4b6e6a9d81b5ffe8a13 Mon Sep 17 00:00:00 2001
From: Darker <mr.darker@163.com>
Date: 星期三, 26 二月 2025 09:56:59 +0800
Subject: [PATCH] 1. 添加报警对话框的按钮 2. 接受报警消息,并获取数据添加到数据库和显示在界面列表

---
 SourceCode/Bond/Servo/AlarmDlg.h            |    1 
 SourceCode/Bond/Servo/Servo.vcxproj.filters |    2 
 SourceCode/Bond/Servo/CEqAlarmStep.h        |   27 ++++++
 SourceCode/Bond/Servo/resource.h            |    0 
 SourceCode/Bond/Servo/AlarmDlg.cpp          |   71 ++++++++++++++---
 SourceCode/Bond/Servo/CEqAlarmStep.cpp      |   71 +++++++++++++++++
 SourceCode/Bond/Servo/Servo.rc              |    0 
 SourceCode/Bond/Servo/ServoDlg.cpp          |   29 +++++++
 SourceCode/Bond/Servo/Common.h              |    8 ++
 SourceCode/Bond/Servo/ServoDlg.h            |    4 +
 10 files changed, 197 insertions(+), 16 deletions(-)

diff --git a/SourceCode/Bond/Servo/AlarmDlg.cpp b/SourceCode/Bond/Servo/AlarmDlg.cpp
index 4da1912..121451a 100644
--- a/SourceCode/Bond/Servo/AlarmDlg.cpp
+++ b/SourceCode/Bond/Servo/AlarmDlg.cpp
@@ -6,6 +6,7 @@
 #include "afxdialogex.h"
 #include "AlarmDlg.h"
 #include "AlarmManager.h"
+#include "Common.h"
 
 #define PAGE_SIZE						10
 #define PAGE_BACKGROUND_COLOR			RGB(252, 252, 255)
@@ -48,18 +49,41 @@
 			// onNext
 			pAny->addRef();
 			int code = pAny->getCode();
-			//if (RX_CODE_ALARM_ON == code) {
-			//	CAlarm* pAlarm;
-			//	if (pAny->getObject("obj", (IRxObject*&)pAlarm)) {
-			//		AddAlarm(nullptr, pAlarm);
-			//	}
-			//}
-			//else if (RX_CODE_ALARM_OFF == code) {
-			//	CAlarm* pAlarm;
-			//	if (pAny->getObject("obj", (IRxObject*&)pAlarm)) {
-			//		UpdateAlarm(nullptr, pAlarm);
-			//	}
-			//}
+
+			if (RX_CODE_STEP_EVENT_READDATA == code) {
+				LOGI("<CAlarmDlg> Accept RX_CODE_STEP_EVENT_READDATA successfully!");
+				// 閫氱煡璁惧鐘舵��
+				SERVO::CEqAlarmStep* pStep = nullptr;
+				if (pAny->getPtrValue("ptr", (void*&)pStep)) {
+					if (pStep != nullptr) {
+						// 鑾峰彇 AlarmManager 鍗曚緥
+						AlarmManager& alarmManager = AlarmManager::getInstance();
+
+						// 浠� pStep 鑾峰彇闇�瑕佺殑鍙傛暟锛屽亣璁捐繖浜涘�兼槸浠� pStep 涓幏鍙栫殑
+						std::string id = std::to_string(pStep->getAlarmId());
+						std::string deviceName = std::to_string(pStep->getUnitId());
+						std::string description = pStep->getText();
+						std::string startTime = "2025-02-25 10:00";
+						std::string endTime = "2025-02-25 12:00";
+
+						// 鎻掑叆鍒楄〃鎺т欢
+						CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_ALARM);
+						if (pListCtrl != nullptr) {
+							InsertAlarmData(pListCtrl, id.c_str(), deviceName.c_str(), description.c_str(), startTime.c_str(), endTime.c_str());
+						}
+
+						// 璋冪敤 addAlarm 娣诲姞鏂扮殑 Alarm
+						bool result = alarmManager.addAlarm(id, deviceName, description, startTime, endTime);
+						if (result) {
+							LOGI("<CAlarmDlg> Alarm added successfully!");
+						}
+						else {
+							LOGI("<CAlarmDlg> Failed to add alarm.");
+						}
+					}
+				}
+			}
+
 
 		pAny->release();
 		}, [&]() -> void {
@@ -174,6 +198,29 @@
 	}
 }
 
+void CAlarmDlg::InsertAlarmData(CListCtrl* pListCtrl, const CString& alarmId, const CString& deviceName, const CString& description, const CString& startTime, const CString& endTime)
+{
+	int nRowCount = pListCtrl->GetItemCount();
+	if (nRowCount >= PAGE_SIZE) {
+		pListCtrl->DeleteItem(nRowCount - 1);
+	}
+
+	int nNewItem = pListCtrl->InsertItem(0, _T(""));
+	pListCtrl->SetItemText(nNewItem, 1, alarmId);       // 璀﹀憡ID
+	pListCtrl->SetItemText(nNewItem, 2, deviceName);    // 璁惧鍚嶇О
+	pListCtrl->SetItemText(nNewItem, 3, description);   // 鎻忚堪
+	pListCtrl->SetItemText(nNewItem, 4, startTime);     // 鍙戠敓鏃堕棿
+	pListCtrl->SetItemText(nNewItem, 5, endTime);       // 瑙i櫎鏃堕棿
+
+	// 閲嶆柊璋冩暣鍒楀
+	pListCtrl->SetColumnWidth(0, LVSCW_AUTOSIZE);
+	pListCtrl->SetColumnWidth(1, LVSCW_AUTOSIZE);
+	pListCtrl->SetColumnWidth(2, LVSCW_AUTOSIZE);
+	pListCtrl->SetColumnWidth(3, LVSCW_AUTOSIZE);
+	pListCtrl->SetColumnWidth(4, LVSCW_AUTOSIZE);
+	pListCtrl->SetColumnWidth(5, LVSCW_AUTOSIZE);
+}
+
 void CAlarmDlg::DoDataExchange(CDataExchange* pDX)
 {
 	DDX_Control(pDX, IDC_DATETIMEPICKER_START, m_dateTimeStart);
diff --git a/SourceCode/Bond/Servo/AlarmDlg.h b/SourceCode/Bond/Servo/AlarmDlg.h
index 7b305cb..67aefe0 100644
--- a/SourceCode/Bond/Servo/AlarmDlg.h
+++ b/SourceCode/Bond/Servo/AlarmDlg.h
@@ -22,6 +22,7 @@
 	void UpdatePageData();
 	void UpdatePageControls();
 	void FillDataToListCtrl(CListCtrl* pListCtrl, const std::vector<std::vector<std::string>>& vecData);
+	void InsertAlarmData(CListCtrl* pListCtrl, const CString& alarmId, const CString& deviceName, const CString& description, const CString& startTime, const CString& endTime);
 
 private:
 	COLORREF m_crBkgnd;
diff --git a/SourceCode/Bond/Servo/CEqAlarmStep.cpp b/SourceCode/Bond/Servo/CEqAlarmStep.cpp
index 307f814..0b42394 100644
--- a/SourceCode/Bond/Servo/CEqAlarmStep.cpp
+++ b/SourceCode/Bond/Servo/CEqAlarmStep.cpp
@@ -59,10 +59,75 @@
 		return 0;
 	}
 
-	void CEqAlarmStep::setAlarmDev(int nDev)
-	{
-		m_nAlarmDev = nDev;
+	// 获取和设置 AlarmDev
+	int CEqAlarmStep::getAlarmDev() const {
+		return m_nAlarmDev;
 	}
 
+	void CEqAlarmStep::setAlarmDev(int nAlarmDev) {
+		m_nAlarmDev = nAlarmDev;
+	}
 
+	// 获取和设置 AlarmState
+	int CEqAlarmStep::getAlarmState() const {
+		return m_nAlarmState;
+	}
+
+	void CEqAlarmStep::setAlarmState(int nAlarmState) {
+		m_nAlarmState = nAlarmState;
+	}
+
+	// 获取和设置 UnitId
+	int CEqAlarmStep::getUnitId() const {
+		return m_nUnitId;
+	}
+
+	void CEqAlarmStep::setUnitId(int nUnitId) {
+		m_nUnitId = nUnitId;
+	}
+
+	// 获取和设置 AlarmLevel
+	int CEqAlarmStep::getAlarmLevel() const {
+		return m_nAlarmLevel;
+	}
+
+	void CEqAlarmStep::setAlarmLevel(int nAlarmLevel) {
+		m_nAlarmLevel = nAlarmLevel;
+	}
+
+	// 获取和设置 AlarmCode
+	int CEqAlarmStep::getAlarmCode() const {
+		return m_nAlarmCode;
+	}
+
+	void CEqAlarmStep::setAlarmCode(int nAlarmCode) {
+		m_nAlarmCode = nAlarmCode;
+	}
+
+	// 获取和设置 AlarmId
+	int CEqAlarmStep::getAlarmId() const {
+		return m_nAlarmId;
+	}
+
+	void CEqAlarmStep::setAlarmId(int nAlarmId) {
+		m_nAlarmId = nAlarmId;
+	}
+
+	// 获取和设置 Text
+	std::string CEqAlarmStep::getText() const {
+		return m_strText;
+	}
+
+	void CEqAlarmStep::setText(const std::string& strText) {
+		m_strText = strText;
+	}
+
+	// 获取和设置 Description
+	std::string CEqAlarmStep::getDescription() const {
+		return m_strDescription;
+	}
+
+	void CEqAlarmStep::setDescription(const std::string& strDescription) {
+		m_strDescription = strDescription;
+	}
 }
diff --git a/SourceCode/Bond/Servo/CEqAlarmStep.h b/SourceCode/Bond/Servo/CEqAlarmStep.h
index 45510bf..98cc3bc 100644
--- a/SourceCode/Bond/Servo/CEqAlarmStep.h
+++ b/SourceCode/Bond/Servo/CEqAlarmStep.h
@@ -13,7 +13,32 @@
 		virtual int onReadData();
 		virtual int onComplete();
 		virtual int onTimeout();
-		void setAlarmDev(int nDev);
+
+		// Getter 和 Setter 声明
+		int getAlarmDev() const;
+		void setAlarmDev(int nAlarmDev);
+
+		int getAlarmState() const;
+		void setAlarmState(int nAlarmState);
+
+		int getUnitId() const;
+		void setUnitId(int nUnitId);
+
+		int getAlarmLevel() const;
+		void setAlarmLevel(int nAlarmLevel);
+
+		int getAlarmCode() const;
+		void setAlarmCode(int nAlarmCode);
+
+		int getAlarmId() const;
+		void setAlarmId(int nAlarmId);
+
+		std::string getText() const;
+		void setText(const std::string& strText);
+
+		std::string getDescription() const;
+		void setDescription(const std::string& strDescription);
+
 
 	private:
 		int m_nAlarmDev;
diff --git a/SourceCode/Bond/Servo/Common.h b/SourceCode/Bond/Servo/Common.h
index 22cd941..7aeb6aa 100644
--- a/SourceCode/Bond/Servo/Common.h
+++ b/SourceCode/Bond/Servo/Common.h
@@ -27,6 +27,14 @@
 #define BTN_LOG_BKGND_HOVER				RGB(153, 217, 234)
 #define BTN_LOG_BKGND_PRESS				RGB(133, 203, 225)
 
+/* ALARM BTN */
+#define BTN_ALARM_FRAME_NORMAL			RGB(88, 88, 88)
+#define BTN_ALARM_FRAME_HOVER			RGB(88, 88, 88)
+#define BTN_ALARM_FRAME_PRESS			RGB(88, 88, 88)
+#define BTN_ALARM_BKGND_NORMAL			RGB(232, 232, 232)
+#define BTN_ALARM_BKGND_HOVER			RGB(153, 217, 234)
+#define BTN_ALARM_BKGND_PRESS			RGB(133, 203, 225)
+
 /* Equipment ID */
 #define EQ_ID_EFEM			1
 #define EQ_ID_Bonder1		2
diff --git a/SourceCode/Bond/Servo/Servo.rc b/SourceCode/Bond/Servo/Servo.rc
index d5864f9..228ffdd 100644
--- a/SourceCode/Bond/Servo/Servo.rc
+++ b/SourceCode/Bond/Servo/Servo.rc
Binary files differ
diff --git a/SourceCode/Bond/Servo/Servo.vcxproj.filters b/SourceCode/Bond/Servo/Servo.vcxproj.filters
index 842dad9..06cd13e 100644
--- a/SourceCode/Bond/Servo/Servo.vcxproj.filters
+++ b/SourceCode/Bond/Servo/Servo.vcxproj.filters
@@ -40,6 +40,7 @@
     <ClCompile Include="CEqModeStep.cpp" />
     <ClCompile Include="CEqStatusStep.cpp" />
     <ClCompile Include="CEqAlarmStep.cpp" />
+    <ClCompile Include="AlarmDlg.cpp" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="AlarmManager.h" />
@@ -78,6 +79,7 @@
     <ClInclude Include="CEqModeStep.h" />
     <ClInclude Include="CEqStatusStep.h" />
     <ClInclude Include="CEqAlarmStep.h" />
+    <ClInclude Include="AlarmDlg.h" />
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="Servo.rc" />
diff --git a/SourceCode/Bond/Servo/ServoDlg.cpp b/SourceCode/Bond/Servo/ServoDlg.cpp
index 1e29081..f6b355c 100644
--- a/SourceCode/Bond/Servo/ServoDlg.cpp
+++ b/SourceCode/Bond/Servo/ServoDlg.cpp
@@ -9,6 +9,7 @@
 #include "Common.h"
 #include "Log.h"
 #include "SecsTestDlg.h"
+#include "AlarmDlg.h"
 #include <chrono>
 #include <thread>
 #include <cmath>
@@ -84,6 +85,7 @@
 	m_crBkgnd = APPDLG_BACKGROUND_COLOR;
 	m_hbrBkgnd = nullptr;
 	m_bShowLogWnd = FALSE;
+	m_bShowAlarmWnd = FALSE;
 	m_bIsRobotMoving = FALSE;
 	m_pLogDlg = nullptr;
 	m_pTerminalDisplayDlg = nullptr;
@@ -94,6 +96,7 @@
 {
 	CDialogEx::DoDataExchange(pDX);
 	DDX_Control(pDX, IDC_BUTTON_LOG, m_btnLog);
+	DDX_Control(pDX, IDC_BUTTON_ALARM, m_btnAlarm);
 }
 
 BEGIN_MESSAGE_MAP(CServoDlg, CDialogEx)
@@ -122,6 +125,7 @@
 	ON_WM_INITMENUPOPUP()
 	ON_WM_TIMER()
 	ON_WM_ERASEBKGND()
+	ON_BN_CLICKED(IDC_BUTTON_ALARM, &CServoDlg::OnBnClickedButtonAlarm)
 END_MESSAGE_MAP()
 
 
@@ -307,6 +311,7 @@
 	InitRxWindows();
 	OnBnClickedButtonLog();
 	UpdateLogBtn();
+	UpdateAlarmBtn();
 	Resize();
 
 
@@ -567,6 +572,17 @@
 	m_btnLog.Invalidate();
 }
 
+void CServoDlg::UpdateAlarmBtn()
+{
+	m_btnAlarm.SetFrameColor(BS_NORMAL, BTN_ALARM_FRAME_NORMAL);
+	m_btnAlarm.SetFrameColor(BS_HOVER, BTN_ALARM_FRAME_HOVER);
+	m_btnAlarm.SetFrameColor(BS_PRESS, BTN_ALARM_FRAME_PRESS);
+	m_btnAlarm.SetBkgndColor(BS_NORMAL, m_bShowAlarmWnd ? BTN_ALARM_BKGND_PRESS : BTN_ALARM_BKGND_NORMAL);
+	m_btnAlarm.SetBkgndColor(BS_HOVER, BTN_ALARM_BKGND_HOVER);
+	m_btnAlarm.SetBkgndColor(BS_PRESS, BTN_ALARM_BKGND_PRESS);
+	m_btnAlarm.Invalidate();
+}
+
 void CServoDlg::UpdateRobotPosition(float percentage)
 {
 	// 限制百分比范围在 [0, 1] 之间
@@ -725,6 +741,11 @@
 	pItem = GetDlgItem(IDC_BUTTON_LOG);
 	pItem->GetClientRect(&rcItem);
 	pItem->MoveWindow(x, rcClient.bottom - 8 - rcItem.Height(), rcItem.Width(), rcItem.Height());
+
+	x = 20 + rcItem.Width();
+	pItem = GetDlgItem(IDC_BUTTON_ALARM);
+	pItem->GetClientRect(&rcItem);
+	pItem->MoveWindow(x, rcClient.bottom - 8 - rcItem.Height(), rcItem.Width(), rcItem.Height());
 }
 
 void CServoDlg::OnClose()
@@ -799,3 +820,11 @@
 	
 	return CDialogEx::OnEraseBkgnd(pDC);
 }
+
+
+void CServoDlg::OnBnClickedButtonAlarm()
+{
+	// TODO: 在此添加控件通知处理程序代码
+	CAlarmDlg dlg;
+	dlg.DoModal();
+}
diff --git a/SourceCode/Bond/Servo/ServoDlg.h b/SourceCode/Bond/Servo/ServoDlg.h
index 88ed43d..ab71ed2 100644
--- a/SourceCode/Bond/Servo/ServoDlg.h
+++ b/SourceCode/Bond/Servo/ServoDlg.h
@@ -28,6 +28,7 @@
 	void InitRxWindows();
 	void Resize();
 	void UpdateLogBtn();
+	void UpdateAlarmBtn();
 	void UpdateRobotPosition(float percentage);
 	void RotateRobot(float angleInDegrees);
 	void UpdateDeviceStatus(int id, DeviceStatus status);
@@ -36,6 +37,7 @@
 private:
 	IObserver* m_pObserver;
 	BOOL m_bShowLogWnd;
+	BOOL m_bShowAlarmWnd;
 	CLogDlg* m_pLogDlg;
 	CTerminalDisplayDlg* m_pTerminalDisplayDlg;
 
@@ -59,6 +61,7 @@
 	COLORREF m_crBkgnd;
 	HBRUSH m_hbrBkgnd;
 	CBlButton m_btnLog;
+	CBlButton m_btnAlarm;
 
 
 	// 生成的消息映射函数
@@ -90,4 +93,5 @@
 	afx_msg void OnMenuHelpAbout();
 	afx_msg void OnTimer(UINT_PTR nIDEvent);
 	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
+	afx_msg void OnBnClickedButtonAlarm();
 };
diff --git a/SourceCode/Bond/Servo/resource.h b/SourceCode/Bond/Servo/resource.h
index faada95..2afa563 100644
--- a/SourceCode/Bond/Servo/resource.h
+++ b/SourceCode/Bond/Servo/resource.h
Binary files differ

--
Gitblit v1.9.3