LAPTOP-SNT8I5JK\Boounion
2025-07-28 bfe14e41fa5b07771d78af4511ba18d706bc23cc
SourceCode/Bond/BondEq/AlarmPopupDlg.cpp
@@ -16,14 +16,24 @@
CAlarmPopupDlg::CAlarmPopupDlg(CWnd* pParent /*=NULL*/)
   : CDialogEx(IDD_DIALOG_POPUP_ALARM, pParent)
{
   m_pPLC = nullptr;
   m_crBkgnd = RGB(225, 225, 225);
   m_hbrBkgnd = nullptr;
   m_pActiveAlarm = nullptr;
   m_pObserver = nullptr;
}
CAlarmPopupDlg::~CAlarmPopupDlg()
{
}
void CAlarmPopupDlg::SetPLC(CPLC* pPLC)
{
   ASSERT(pPLC);
   m_pPLC = pPLC;
}
void CAlarmPopupDlg::DoDataExchange(CDataExchange* pDX)
{
@@ -36,11 +46,42 @@
   ON_WM_DESTROY()
   ON_WM_SIZE()
   ON_BN_CLICKED(IDC_BUTTON_CLOSE, &CAlarmPopupDlg::OnBnClickedButtonClose)
   ON_BN_CLICKED(IDC_BUTTON_SOUND_OFF, &CAlarmPopupDlg::OnBnClickedButtonSoundOff)
   ON_BN_CLICKED(IDC_BUTTON_ALARM_OFF, &CAlarmPopupDlg::OnBnClickedButtonAlarmOff)
END_MESSAGE_MAP()
// CAlarmPopupDlg 消息处理程序
void CAlarmPopupDlg::InitRxWindows()
{
   /* code */
   // 订阅数据
   IRxWindows* pRxWindows = RX_GetRxWindows();
   pRxWindows->enableLog(5);
   if (m_pObserver == NULL) {
      m_pObserver = pRxWindows->allocObserver([&](IAny* pAny) -> void {
         // onNext
         pAny->addRef();
         int code = pAny->getCode();
         if (RX_CODE_BONDER_BEEP == code) {
            bool bMute = theApp.m_model.getBonder().isMute();
            SetButtonBackgroundColors(bMute);
            TRACE("RX_CODE_BONDER_BEEP %s\n", bMute ? "1" : "0");
         }
         pAny->release();
      }, [&]() -> void {
         // onComplete
      }, [&](IThrowable* pThrowable) -> void {
         // onErrorm
         pThrowable->printf();
      });
      theApp.m_model.getObservable()->observeOn(pRxWindows->mainThread())
         ->subscribe(m_pObserver);
   }
}
BOOL CAlarmPopupDlg::OnInitDialog()
{
@@ -115,14 +156,12 @@
   // 静音按钮
   bool bMute = theApp.m_model.getBonder().isMute();
   m_btnSoundOff.SubclassDlgItem(IDC_BUTTON_SOUND_OFF, this);
   m_btnSoundOff.SetFrameColor(BS_NORMAL, BTN_SOUND_OFF_FRAME_NORMAL);
   m_btnSoundOff.SetFrameColor(BS_HOVER, BTN_SOUND_OFF_FRAME_HOVER);
   m_btnSoundOff.SetFrameColor(BS_PRESS, BTN_SOUND_OFF_FRAME_PRESS);
   m_btnSoundOff.SetBkgndColor(BS_NORMAL, BTN_SOUND_OFF_BKGND_NORMAL);
   m_btnSoundOff.SetBkgndColor(BS_HOVER, BTN_SOUND_OFF_BKGND_HOVER);
   m_btnSoundOff.SetBkgndColor(BS_PRESS, BTN_SOUND_OFF_BKGND_PRESS);
   SetButtonBackgroundColors(bMute);
   // 横线1
   CHorizontalLine* pLine = CHorizontalLine::Hook(GetDlgItem(IDC_LINE1)->m_hWnd);
@@ -134,6 +173,7 @@
   pLine->SetLineColor(RGB(168, 168, 168));
   InitRxWindows();
   return TRUE;  // return TRUE unless you set the focus to a control
              // 异常: OCX 属性页应返回 FALSE
}
@@ -167,6 +207,11 @@
   if (m_pActiveAlarm != nullptr) {
      m_pActiveAlarm->release();
      m_pActiveAlarm = nullptr;
   }
   if (m_pObserver != nullptr) {
      m_pObserver->unsubscribe();
      m_pObserver = NULL;
   }
}
@@ -202,15 +247,84 @@
   }
   CString strText;
   CAlarmMonitor* pAlarmMonitor = (CAlarmMonitor*)theApp.m_model.getBonder().GetComponent("警告信息");
   CAlarmMonitor* pAlarmMonitor = (CAlarmMonitor*)theApp.m_model.getBonder().GetComponent(ALARM_MONITOR);
   m_pActiveAlarm = pAlarmMonitor->getActiveAlarm();
   if (m_pActiveAlarm != nullptr) {
      m_pActiveAlarm->addRef();
      SetDlgItemText(IDC_LABEL_NAME, pAlarmMonitor->getAlarmText(m_pActiveAlarm->getId()));
      strText.Format(_T("ID: %d"), m_pActiveAlarm->getId());
      SetDlgItemText(IDC_LABEL_LEVEL, strText);      
      ShowWindow(SW_SHOW);
   }
   else {
      ShowWindow(SW_HIDE);
   }
}
void CAlarmPopupDlg::SetButtonBackgroundColors(bool bMute)
{
   if (!bMute) {
      m_btnSoundOff.SetBkgndColor(BS_NORMAL, BTN_SOUND_OFF_BKGND_NORMAL);
      m_btnSoundOff.SetBkgndColor(BS_HOVER, BTN_SOUND_OFF_BKGND_HOVER);
      m_btnSoundOff.SetBkgndColor(BS_PRESS, BTN_SOUND_OFF_BKGND_PRESS);
      m_btnSoundOff.Invalidate();
   }
   else {
      m_btnSoundOff.SetBkgndColor(BS_NORMAL, BTN_SOUND_ON_BKGND_NORMAL);
      m_btnSoundOff.SetBkgndColor(BS_HOVER, BTN_SOUND_ON_BKGND_HOVER);
      m_btnSoundOff.SetBkgndColor(BS_PRESS, BTN_SOUND_ON_BKGND_PRESS);
      m_btnSoundOff.Invalidate();
   }
}
void CAlarmPopupDlg::OnBnClickedButtonSoundOff()
{
   // TODO: 在此添加控件通知处理程序代码
   if (m_pPLC == nullptr || !m_pPLC->isConnected()) {
      return;
   }
   // 向 PLC 写入信号
   bool bMute = theApp.m_model.getBonder().isMute();
   char szWrite[4] = { 0x1, 0x0, 0x0, 0x0 };
   szWrite[0] = !bMute;
   m_pPLC->writeData(MC::M, 1003, szWrite, 2, [](IMcChannel* pChannel, int nAddr, DWORD nValue, int nFlag) {
      if (nFlag == 0) {
         TRACE("操作成功:地址=1003\n",  nAddr);
      }
      else {
         TRACE("操作失败:地址=1003,错误码=%d\n", nFlag);
      }
   });
}
void CAlarmPopupDlg::OnBnClickedButtonAlarmOff()
{
   // TODO: 在此添加控件通知处理程序代码
   if (m_pPLC == nullptr || !m_pPLC->isConnected()) {
      return;
   }
   // 向 PLC 写入信号
   char szWrite[4] = { 0x1, 0x0, 0x0, 0x0 };
   m_pPLC->writeData(MC::M, 1009, szWrite, 2, [](IMcChannel* pChannel, int nAddr, DWORD nValue, int nFlag) {
      if (nFlag == 0) {
         TRACE("操作成功:地址=1009\n", nAddr);
      }
      else {
         TRACE("操作失败:地址=1009,错误码=%d\n", nFlag);
      }
   });
   Sleep(500);
   szWrite[0] = 0x0;
   m_pPLC->writeData(MC::M, 1009, szWrite, 2, [](IMcChannel* pChannel, int nAddr, DWORD nValue, int nFlag) {
      if (nFlag == 0) {
         TRACE("操作成功:地址=1009\n", nAddr);
      }
      else {
         TRACE("操作失败:地址=1009,错误码=%d\n", nFlag);
      }
   });
}