1. 添加报警对话框的按钮
2. 接受报警消息,并获取数据添加到数据库和显示在界面列表
| | |
| | | #include "afxdialogex.h" |
| | | #include "AlarmDlg.h" |
| | | #include "AlarmManager.h" |
| | | #include "Common.h" |
| | | |
| | | #define PAGE_SIZE 10 |
| | | #define PAGE_BACKGROUND_COLOR RGB(252, 252, 255) |
| | |
| | | // 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 { |
| | |
| | | } |
| | | } |
| | | |
| | | 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); // 解除时间 |
| | | |
| | | // 重新调整列宽 |
| | | 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); |
| | |
| | | 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; |
| | |
| | | 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; |
| | | } |
| | | } |
| | |
| | | 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; |
| | |
| | | #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 |
| | |
| | | <ClCompile Include="CEqModeStep.cpp" /> |
| | | <ClCompile Include="CEqStatusStep.cpp" /> |
| | | <ClCompile Include="CEqAlarmStep.cpp" /> |
| | | <ClCompile Include="AlarmDlg.cpp" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ClInclude Include="AlarmManager.h" /> |
| | |
| | | <ClInclude Include="CEqModeStep.h" /> |
| | | <ClInclude Include="CEqStatusStep.h" /> |
| | | <ClInclude Include="CEqAlarmStep.h" /> |
| | | <ClInclude Include="AlarmDlg.h" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ResourceCompile Include="Servo.rc" /> |
| | |
| | | #include "Common.h" |
| | | #include "Log.h" |
| | | #include "SecsTestDlg.h" |
| | | #include "AlarmDlg.h" |
| | | #include <chrono> |
| | | #include <thread> |
| | | #include <cmath> |
| | |
| | | m_crBkgnd = APPDLG_BACKGROUND_COLOR; |
| | | m_hbrBkgnd = nullptr; |
| | | m_bShowLogWnd = FALSE; |
| | | m_bShowAlarmWnd = FALSE; |
| | | m_bIsRobotMoving = FALSE; |
| | | m_pLogDlg = nullptr; |
| | | m_pTerminalDisplayDlg = nullptr; |
| | |
| | | { |
| | | CDialogEx::DoDataExchange(pDX); |
| | | DDX_Control(pDX, IDC_BUTTON_LOG, m_btnLog); |
| | | DDX_Control(pDX, IDC_BUTTON_ALARM, m_btnAlarm); |
| | | } |
| | | |
| | | BEGIN_MESSAGE_MAP(CServoDlg, CDialogEx) |
| | |
| | | ON_WM_INITMENUPOPUP() |
| | | ON_WM_TIMER() |
| | | ON_WM_ERASEBKGND() |
| | | ON_BN_CLICKED(IDC_BUTTON_ALARM, &CServoDlg::OnBnClickedButtonAlarm) |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | |
| | | InitRxWindows(); |
| | | OnBnClickedButtonLog(); |
| | | UpdateLogBtn(); |
| | | UpdateAlarmBtn(); |
| | | Resize(); |
| | | |
| | | |
| | |
| | | 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] 之间 |
| | |
| | | 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() |
| | |
| | | |
| | | return CDialogEx::OnEraseBkgnd(pDC); |
| | | } |
| | | |
| | | |
| | | void CServoDlg::OnBnClickedButtonAlarm() |
| | | { |
| | | // TODO: 在此添加控件通知处理程序代码 |
| | | CAlarmDlg dlg; |
| | | dlg.DoModal(); |
| | | } |
| | |
| | | void InitRxWindows(); |
| | | void Resize(); |
| | | void UpdateLogBtn(); |
| | | void UpdateAlarmBtn(); |
| | | void UpdateRobotPosition(float percentage); |
| | | void RotateRobot(float angleInDegrees); |
| | | void UpdateDeviceStatus(int id, DeviceStatus status); |
| | |
| | | private: |
| | | IObserver* m_pObserver; |
| | | BOOL m_bShowLogWnd; |
| | | BOOL m_bShowAlarmWnd; |
| | | CLogDlg* m_pLogDlg; |
| | | CTerminalDisplayDlg* m_pTerminalDisplayDlg; |
| | | |
| | |
| | | COLORREF m_crBkgnd; |
| | | HBRUSH m_hbrBkgnd; |
| | | CBlButton m_btnLog; |
| | | CBlButton m_btnAlarm; |
| | | |
| | | |
| | | // 生成的消息映射函数 |
| | |
| | | afx_msg void OnMenuHelpAbout(); |
| | | afx_msg void OnTimer(UINT_PTR nIDEvent); |
| | | afx_msg BOOL OnEraseBkgnd(CDC* pDC); |
| | | afx_msg void OnBnClickedButtonAlarm(); |
| | | }; |