| | |
| | | #include "InputDialog.h" |
| | | #include "ClientListDlg.h" |
| | | #include "CControlJobManagerDlg.h" |
| | | #include "AlarmManager.h" |
| | | #include "CUserManager2.h" |
| | | #include "CUserManager2Dlg.h" |
| | | #include "CUserXLogDlg.h" |
| | |
| | | m_pTopToolbar = nullptr; |
| | | m_pMyStatusbar = nullptr; |
| | | m_pRobotTaskDlg = nullptr; |
| | | m_pTab = nullptr; |
| | | m_pAlarmPopupDlg = nullptr; |
| | | } |
| | | |
| | | void CServoDlg::DoDataExchange(CDataExchange* pDX) |
| | |
| | | ON_UPDATE_COMMAND_UI(ID_MENU_FILE_SECSTEST, &CServoDlg::OnUpdateMenuFileSecsTest) |
| | | ON_COMMAND(ID_MENU_PROJECT_VARIABLE_LIST, &CServoDlg::OnMenuProjectVarialbleList) |
| | | ON_UPDATE_COMMAND_UI(ID_MENU_PROJECT_VARIABLE_LIST, &CServoDlg::OnUpdateMenuProjectVarialbleList) |
| | | ON_COMMAND(ID_MENU_TEST_ALARM_ON, &CServoDlg::OnMenuTestAlarmOn) |
| | | ON_UPDATE_COMMAND_UI(ID_MENU_TEST_ALARM_ON, &CServoDlg::OnUpdateMenuTestAlarmOn) |
| | | ON_COMMAND(ID_MENU_TEST_ALARM_OFF, &CServoDlg::OnMenuTestAlarmOff) |
| | | ON_UPDATE_COMMAND_UI(ID_MENU_TEST_ALARM_OFF, &CServoDlg::OnUpdateMenuTestAlarmOff) |
| | | ON_COMMAND(ID_MENU_TEST_MESSAGE_SET, &CServoDlg::OnMenuTestMessageSet) |
| | | ON_UPDATE_COMMAND_UI(ID_MENU_TEST_MESSAGE_SET, &CServoDlg::OnUpdateMenuTestMessageSet) |
| | | ON_COMMAND(ID_MENU_TEST_MESSAGE_CLEAR, &CServoDlg::OnMenuTestMessageClear) |
| | | ON_UPDATE_COMMAND_UI(ID_MENU_TEST_MESSAGE_CLEAR, &CServoDlg::OnUpdateMenuTestMessageClear) |
| | | ON_COMMAND(ID_MENU_TOOLS_CLIENT_LIST, &CServoDlg::OnMenuToolsClientList) |
| | | ON_UPDATE_COMMAND_UI(ID_MENU_TOOLS_CLIENT_LIST, &CServoDlg::OnUpdateMenuToolsClientList) |
| | | ON_COMMAND(ID_MENU_TOOLS_CURVE_EMPTY, &CServoDlg::OnMenuToolsCurveEmptyMode) |
| | | ON_UPDATE_COMMAND_UI(ID_MENU_TOOLS_CURVE_EMPTY, &CServoDlg::OnUpdateMenuToolsCurveEmptyMode) |
| | | ON_COMMAND(ID_MENU_TOOLS_CURVE_PRODUCTION, &CServoDlg::OnMenuToolsCurveProductionMode) |
| | | ON_UPDATE_COMMAND_UI(ID_MENU_TOOLS_CURVE_PRODUCTION, &CServoDlg::OnUpdateMenuToolsCurveProductionMode) |
| | | ON_COMMAND(ID_MENU_WND_TEST_PANEL, &CServoDlg::OnMenuWndTestPanel) |
| | | ON_UPDATE_COMMAND_UI(ID_MENU_WND_TEST_PANEL, &CServoDlg::OnUpdateMenuWndTestPanel) |
| | | ON_COMMAND(ID_MENU_WND_PRO_PANEL, &CServoDlg::OnMenuWndProPanel) |
| | |
| | | ASSERT(m_pPanelAttributes); |
| | | m_pPanelEquipment->loadDataFromEquipment(pEquipment); |
| | | m_pPanelAttributes->ShowWindow(SW_HIDE); |
| | | if (!m_pPanelEquipment->IsWindowVisible()) { |
| | | if (!m_pPanelEquipment->IsWindowVisible() && m_nLeftPanelType == 1) { |
| | | m_pPanelEquipment->ShowWindow(SW_SHOW); |
| | | Resize(); |
| | | } |
| | |
| | | CString text; |
| | | if (cj != nullptr) { |
| | | std::string st = cj->getStateText(); |
| | | text.Format(_T("ControlJob: %S (%S)"), cj->id().c_str(), st.c_str()); |
| | | text.Format(_T("ControlJob: %s (%s)"), cj->id().c_str(), st.c_str()); |
| | | if (cj->state() == SERVO::CJState::Paused) { |
| | | text += _T(" [Paused]"); |
| | | } |
| | |
| | | text = _T("ControlJob: None"); |
| | | } |
| | | if (m_pMyStatusbar != nullptr) { |
| | | m_pMyStatusbar->setRunTimeText((LPTSTR)(LPCTSTR)text); |
| | | m_pMyStatusbar->setJobText((LPTSTR)(LPCTSTR)text); |
| | | if (cj != nullptr && cj->state() == SERVO::CJState::Paused) { |
| | | m_pMyStatusbar->setBackgroundColor(STATUSBAR_BK_ALARM); |
| | | m_pMyStatusbar->setForegroundColor(RGB(0, 0, 0)); |
| | |
| | | //dlg.DoModal(); |
| | | } |
| | | } |
| | | else if (RX_CODE_ALARM_SET == code || RX_CODE_ALARM_CLEAR == code) { |
| | | RefreshAlarmBadge(); |
| | | } |
| | | |
| | | if (RX_CODE_PASSIVE_STATUS_CHANGED == code) { |
| | | int state = 0; |
| | |
| | | } |
| | | } |
| | | |
| | | void CServoDlg::RefreshAlarmBadge() |
| | | { |
| | | if (m_pTopToolbar == nullptr) return; |
| | | auto activeAlarms = AlarmManager::getInstance().getActiveAlarms(); |
| | | |
| | | // 维护未读列表:当前活跃且未在已读集合中的报警 |
| | | std::unordered_set<int> activeIds; |
| | | m_unreadAlarms.clear(); |
| | | for (const auto& alarm : activeAlarms) { |
| | | activeIds.insert(alarm.nId); |
| | | if (m_ackAlarms.find(alarm.nId) == m_ackAlarms.end()) { |
| | | m_unreadAlarms.push_back(alarm); |
| | | } |
| | | } |
| | | // 移除已读集合中已不再活跃的告警 |
| | | for (auto it = m_ackAlarms.begin(); it != m_ackAlarms.end(); ) { |
| | | if (activeIds.find(*it) == activeIds.end()) { |
| | | it = m_ackAlarms.erase(it); |
| | | } |
| | | else { |
| | | ++it; |
| | | } |
| | | } |
| | | |
| | | int count = static_cast<int>(m_unreadAlarms.size()); |
| | | |
| | | auto* pBtn = dynamic_cast<CBlButton*>(m_pTopToolbar->GetBtn(IDC_BUTTON_ALARM)); |
| | | if (pBtn != nullptr) { |
| | | if (count <= 0) { |
| | | pBtn->SetBadgeNumber(0); |
| | | pBtn->ShowDotBadge(FALSE, RGB(255, 0, 0)); |
| | | pBtn->StopFlash(); |
| | | } |
| | | else if (count <= 9) { |
| | | pBtn->ShowDotBadge(FALSE, RGB(255, 0, 0)); |
| | | pBtn->SetBadgeNumber(count); |
| | | if (!pBtn->IsFlash()) pBtn->Flash(600); |
| | | } |
| | | else { |
| | | pBtn->SetBadgeNumber(0); |
| | | pBtn->ShowDotBadge(TRUE, RGB(255, 0, 0)); |
| | | if (!pBtn->IsFlash()) pBtn->Flash(600); |
| | | } |
| | | pBtn->EnableWindow(TRUE); |
| | | } |
| | | } |
| | | |
| | | void CServoDlg::AckAlarm(int alarmId) |
| | | { |
| | | m_ackAlarms.insert(alarmId); |
| | | RefreshAlarmBadge(); |
| | | } |
| | | |
| | | void CServoDlg::RaiseTestAlarm() |
| | | { |
| | | theApp.m_model.raiseSoftAlarm(ALID_SOFTWARE_TEST_ALARM, "Test Alarm (Ctrl+Alt+T)"); |
| | | } |
| | | |
| | | void CServoDlg::ClearTestAlarm() |
| | | { |
| | | theApp.m_model.clearSoftAlarm(ALID_SOFTWARE_TEST_ALARM); |
| | | } |
| | | |
| | | void CServoDlg::MarkAlarmsRead() |
| | | { |
| | | auto* pBtn = dynamic_cast<CBlButton*>(m_pTopToolbar ? m_pTopToolbar->GetBtn(IDC_BUTTON_ALARM) : nullptr); |
| | | for (const auto& alarm : m_unreadAlarms) { |
| | | m_ackAlarms.insert(alarm.nId); |
| | | } |
| | | m_unreadAlarms.clear(); |
| | | if (pBtn != nullptr) { |
| | | pBtn->SetBadgeNumber(0); |
| | | pBtn->ShowDotBadge(FALSE, RGB(255, 0, 0)); |
| | | pBtn->StopFlash(); |
| | | } |
| | | } |
| | | |
| | | BOOL CServoDlg::OnInitDialog() |
| | | { |
| | | CDialogEx::OnInitDialog(); |
| | | const ULONGLONG boot_ui_begin = GetTickCount64(); |
| | | CWaitCursor wait; // 整个初始化期显示等待光标,避免用户误以为卡死 |
| | | |
| | | // 将“关于...”菜单项添加到系统菜单中。 |
| | | |
| | |
| | | |
| | | |
| | | // model init |
| | | const ULONGLONG boot_model_begin = GetTickCount64(); |
| | | theApp.m_model.init(); |
| | | LOGI("[BOOT][UI] m_model.init finished, cost=%llu ms (since OnInit start %llu ms)", |
| | | (unsigned long long)(GetTickCount64() - boot_model_begin), |
| | | (unsigned long long)(GetTickCount64() - boot_ui_begin)); |
| | | SetTimer(TIMER_ID_LOGIN, 1500, nullptr); |
| | | LOGI("[BOOT][UI] after model.init, elapsed=%llu ms", (unsigned long long)(GetTickCount64() - boot_ui_begin)); |
| | | |
| | | // 菜单 |
| | | CMenu menu; |
| | | menu.LoadMenu(IDR_MENU_APP); |
| | | SetMenu(&menu); |
| | | LOGI("[BOOT][UI] menu loaded, elapsed=%llu ms", (unsigned long long)(GetTickCount64() - boot_ui_begin)); |
| | | |
| | | |
| | | // toolbar |
| | |
| | | ASSERT(hMenu); |
| | | ::EnableMenuItem(hMenu, ID_OPEATOR_SWITCH, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); |
| | | m_pTopToolbar->GetBtn(IDC_BUTTON_JOBS)->EnableWindow(TRUE); |
| | | LOGI("[BOOT][UI] toolbar created, elapsed=%llu ms", (unsigned long long)(GetTickCount64() - boot_ui_begin)); |
| | | |
| | | |
| | | // Tab |
| | | const ULONGLONG boot_pages_begin = GetTickCount64(); |
| | | m_pPageGraph1 = new CPageGraph1(); |
| | | m_pPageGraph1->Create(IDD_PAGE_GRAPH1, this); |
| | | LOGI("[BOOT][UI] page Graph1 created, cost=%llu ms (elapsed=%llu ms)", |
| | | (unsigned long long)(GetTickCount64() - boot_pages_begin), |
| | | (unsigned long long)(GetTickCount64() - boot_ui_begin)); |
| | | m_pPageGraph2 = new CPageGraph2(); |
| | | m_pPageGraph2->Create(IDD_PAGE_GRAPH2, this); |
| | | LOGI("[BOOT][UI] page Graph2 created, cost=%llu ms (elapsed=%llu ms)", |
| | | (unsigned long long)(GetTickCount64() - boot_pages_begin), |
| | | (unsigned long long)(GetTickCount64() - boot_ui_begin)); |
| | | m_pPageGlassList = new CPageGlassList(); |
| | | m_pPageGlassList->Create(IDD_PAGE_GLASS_LIST, this); |
| | | LOGI("[BOOT][UI] page GlassList created, cost=%llu ms (elapsed=%llu ms)", |
| | | (unsigned long long)(GetTickCount64() - boot_pages_begin), |
| | | (unsigned long long)(GetTickCount64() - boot_ui_begin)); |
| | | m_pPageRecipe = new CPageRecipe(); |
| | | m_pPageRecipe->Create(IDD_PAGE_RECIPE, this); |
| | | LOGI("[BOOT][UI] page Recipe created, cost=%llu ms (elapsed=%llu ms)", |
| | | (unsigned long long)(GetTickCount64() - boot_pages_begin), |
| | | (unsigned long long)(GetTickCount64() - boot_ui_begin)); |
| | | m_pPageAlarm = new CPageAlarm(); |
| | | m_pPageAlarm->Create(IDD_DIALOG_ALARM, this); |
| | | LOGI("[BOOT][UI] page Alarm created, cost=%llu ms (elapsed=%llu ms)", |
| | | (unsigned long long)(GetTickCount64() - boot_pages_begin), |
| | | (unsigned long long)(GetTickCount64() - boot_ui_begin)); |
| | | m_pPageLog = new CPageLog(); |
| | | m_pPageLog->Create(IDD_DIALOG_LOG, this); |
| | | LOGI("[BOOT][UI] page Log created, cost=%llu ms (elapsed=%llu ms)", |
| | | (unsigned long long)(GetTickCount64() - boot_pages_begin), |
| | | (unsigned long long)(GetTickCount64() - boot_ui_begin)); |
| | | m_pPageTransferLog = new CPageTransferLog(); |
| | | m_pPageTransferLog->Create(IDD_PAGE_TRANSFER_LOG, this); |
| | | LOGI("[BOOT][UI] page TransferLog created, cost=%llu ms (elapsed=%llu ms)", |
| | | (unsigned long long)(GetTickCount64() - boot_pages_begin), |
| | | (unsigned long long)(GetTickCount64() - boot_ui_begin)); |
| | | |
| | | CHmTab* m_pTab = CHmTab::Hook(GetDlgItem(IDC_TAB1)->m_hWnd); |
| | | m_pTab = CHmTab::Hook(GetDlgItem(IDC_TAB1)->m_hWnd); |
| | | m_pTab->SetPaddingLeft(20); |
| | | m_pTab->SetItemMarginLeft(18); |
| | | m_pTab->AddItem("状态图", FALSE); |
| | |
| | | m_pTab->SetCurSel(0); |
| | | m_pTab->SetBkgndColor(RGB(222, 222, 222)); |
| | | ShowChildPage(0); |
| | | LOGI("[BOOT][UI] pages/tabs created, elapsed=%llu ms", (unsigned long long)(GetTickCount64() - boot_ui_begin)); |
| | | |
| | | // 读取面板宽 |
| | | CString strIniFile; |
| | |
| | | m_pPanelAttributes = new CPanelAttributes(); |
| | | m_pPanelAttributes->Create(IDD_PANEL_ATTRIBUTES, this); |
| | | |
| | | LOGI("[BOOT][UI] panels created, elapsed=%llu ms", (unsigned long long)(GetTickCount64() - boot_ui_begin)); |
| | | |
| | | // statusbar |
| | | m_pMyStatusbar = new CMyStatusbar(); |
| | | m_pMyStatusbar->Create(IDD_STATUSBAR, this); |
| | | m_pMyStatusbar->ShowWindow(SW_SHOW); |
| | | m_pMyStatusbar->setJobText("ControlJob: None"); |
| | | LOGI("[BOOT][UI] statusbar created, elapsed=%llu ms", (unsigned long long)(GetTickCount64() - boot_ui_begin)); |
| | | |
| | | |
| | | |
| | |
| | | InitRxWindows(); |
| | | Resize(); |
| | | |
| | | // 加载历史缓存提示 |
| | | { |
| | | CWaitCursor wait; |
| | | if (m_pMyStatusbar != nullptr) { |
| | | m_pMyStatusbar->setRunTimeText(_T("正在加载历史缓存...")); |
| | | m_pMyStatusbar->UpdateWindow(); |
| | | } |
| | | LOGI("[BOOT][UI] before master.init, elapsed=%llu ms", (unsigned long long)(GetTickCount64() - boot_ui_begin)); |
| | | |
| | | // 相当于延时调用master的初始化 |
| | | theApp.m_model.m_master.init(); |
| | | theApp.m_model.loadPortParams(); |
| | | // 相当于延时调用master的初始化 |
| | | const ULONGLONG boot_master_begin = GetTickCount64(); |
| | | theApp.m_model.m_master.init(); |
| | | LOGI("[BOOT][UI] m_master.init finished, cost=%llu ms (since OnInit start %llu ms)", |
| | | (unsigned long long)(GetTickCount64() - boot_master_begin), |
| | | (unsigned long long)(GetTickCount64() - boot_ui_begin)); |
| | | theApp.m_model.loadPortParams(); |
| | | } |
| | | |
| | | // 还原状态栏运行时间显示(避免一直停留在“正在加载历史缓存...”) |
| | | if (m_pMyStatusbar != nullptr) { |
| | | CString strText; |
| | | GetRuntimeFormatText(strText, ""); |
| | | m_pMyStatusbar->setRunTimeText((LPTSTR)(LPCTSTR)strText); |
| | | } |
| | | |
| | | |
| | | // 初始化master以后需要控件绑定数据 |
| | |
| | | |
| | | // 更新登录状态 |
| | | UpdateLoginStatus(); |
| | | // 初始化报警角标 |
| | | RefreshAlarmBadge(); |
| | | //SystemLogManager::getInstance.log(SystemLogManager::LogType::Info, _T("BondEq启动...")); |
| | | //SystemLogManager::getInstance. |
| | | |
| | | |
| | | LOGI("[BOOT][UI] OnInitDialog finished, total cost=%llu ms", |
| | | (unsigned long long)(GetTickCount64() - boot_ui_begin)); |
| | | |
| | | return TRUE; // 除非将焦点设置到控件,否则返回 TRUE |
| | | } |
| | |
| | | pCmdUI->Enable(TRUE); |
| | | } |
| | | |
| | | void CServoDlg::OnMenuTestAlarmOn() |
| | | { |
| | | RaiseTestAlarm(); |
| | | } |
| | | |
| | | void CServoDlg::OnUpdateMenuTestAlarmOn(CCmdUI* pCmdUI) |
| | | { |
| | | pCmdUI->Enable(TRUE); |
| | | } |
| | | |
| | | void CServoDlg::OnMenuTestAlarmOff() |
| | | { |
| | | ClearTestAlarm(); |
| | | } |
| | | |
| | | void CServoDlg::OnUpdateMenuTestAlarmOff(CCmdUI* pCmdUI) |
| | | { |
| | | pCmdUI->Enable(TRUE); |
| | | } |
| | | |
| | | void CServoDlg::OnMenuTestMessageSet() |
| | | { |
| | | SERVO::CEquipment* pEquipment = m_pPanelMaster->GetActiveEquipment(); |
| | |
| | | void CServoDlg::OnUpdateMenuToolsClientList(CCmdUI* pCmdUI) |
| | | { |
| | | pCmdUI->Enable(TRUE); |
| | | } |
| | | |
| | | void CServoDlg::OnMenuToolsCurveEmptyMode() |
| | | { |
| | | theApp.m_model.getMaster().setCurveMode(SERVO::CurveMode::EmptyChamber); |
| | | } |
| | | |
| | | void CServoDlg::OnUpdateMenuToolsCurveEmptyMode(CCmdUI* pCmdUI) |
| | | { |
| | | pCmdUI->Enable(TRUE); |
| | | pCmdUI->SetCheck(theApp.m_model.getMaster().getCurveMode() == SERVO::CurveMode::EmptyChamber); |
| | | } |
| | | |
| | | void CServoDlg::OnMenuToolsCurveProductionMode() |
| | | { |
| | | theApp.m_model.getMaster().setCurveMode(SERVO::CurveMode::Production); |
| | | } |
| | | |
| | | void CServoDlg::OnUpdateMenuToolsCurveProductionMode(CCmdUI* pCmdUI) |
| | | { |
| | | pCmdUI->Enable(TRUE); |
| | | pCmdUI->SetCheck(theApp.m_model.getMaster().getCurveMode() == SERVO::CurveMode::Production); |
| | | } |
| | | |
| | | void CServoDlg::OnMenuWndTestPanel() |
| | |
| | | m_pMyStatusbar->DestroyWindow(); |
| | | delete m_pMyStatusbar; |
| | | m_pMyStatusbar = nullptr; |
| | | } |
| | | |
| | | if (m_pAlarmPopupDlg != nullptr) { |
| | | m_pAlarmPopupDlg->DestroyWindow(); |
| | | delete m_pAlarmPopupDlg; |
| | | m_pAlarmPopupDlg = nullptr; |
| | | } |
| | | |
| | | if (m_pRobotTaskDlg != nullptr) { |
| | |
| | | dlg.SetEFEM(pEFEM); |
| | | dlg.DoModal(); |
| | | } |
| | | else if (id == IDC_BUTTON_ALARM) { |
| | | if (m_pAlarmPopupDlg == nullptr) { |
| | | m_pAlarmPopupDlg = new CAlarmPopupDlg(); |
| | | m_pAlarmPopupDlg->Create(IDD_DIALOG_POPUP_ALARM, this); |
| | | m_pAlarmPopupDlg->CenterWindow(); |
| | | } |
| | | m_pAlarmPopupDlg->RefreshContent(); |
| | | m_pAlarmPopupDlg->ShowWindow(SW_SHOW); |
| | | MarkAlarmsRead(); |
| | | } |
| | | else if (id == IDC_BUTTON_SETTINGS) { |
| | | SERVO::CEquipment* pEq = theApp.m_model.m_master.getEquipment(EQ_ID_EFEM); |
| | | ((SERVO::CEFEM*)pEq)->printDebugRobotState(); |
| | |
| | | return 0; |
| | | } |
| | | |
| | | BOOL CServoDlg::PreTranslateMessage(MSG* pMsg) |
| | | { |
| | | return CDialogEx::PreTranslateMessage(pMsg); |
| | | } |
| | | |
| | | CString& CServoDlg::GetRuntimeFormatText(CString& strText, const char* pszSuffix) |
| | | { |
| | | ULONGLONG ullRunTime = (ULONGLONG)(theApp.m_model.getMaster().getRunTime() * 0.001); |