| | |
| | | #include "afxdialogex.h" |
| | | #include "Common.h" |
| | | #include "Log.h" |
| | | #include "SecsTestDlg.h" |
| | | #include <chrono> |
| | | #include <thread> |
| | | #include <cmath> |
| | | |
| | | |
| | | #ifdef _DEBUG |
| | | #define new DEBUG_NEW |
| | | #endif |
| | | |
| | | // Image |
| | | #define IMAGE_ROBOT 2 |
| | | |
| | | #define INDICATE_BONDER1 1 |
| | | #define INDICATE_BONDER2 2 |
| | |
| | | #define INDICATE_VACUUM_BAKE 11 |
| | | #define INDICATE_BAKE_COOLING 12 |
| | | #define INDICATE_MEASUREMENT 13 |
| | | |
| | | |
| | | /* 创建终端的定时器 */ |
| | | #define TIMER_ID_CREATE_TERMINAL 1 |
| | | |
| | | |
| | | // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 |
| | |
| | | m_crBkgnd = APPDLG_BACKGROUND_COLOR; |
| | | m_hbrBkgnd = nullptr; |
| | | m_bShowLogWnd = FALSE; |
| | | m_bShowAlarmWnd = FALSE; |
| | | m_bIsRobotMoving = FALSE; |
| | | m_pLogDlg = nullptr; |
| | | m_pAlarmDlg = nullptr; |
| | | m_pTerminalDisplayDlg = nullptr; |
| | | m_pObserver = nullptr; |
| | | } |
| | | |
| | | void CServoDlg::DoDataExchange(CDataExchange* pDX) |
| | | { |
| | | 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_SIZE() |
| | | ON_WM_CLOSE() |
| | | ON_MESSAGE(ID_MSG_LOGDLG_HIDE, &CServoDlg::OnLogDlgHide) |
| | | ON_MESSAGE(ID_MSG_ALARMDLG_HIDE, &CServoDlg::OnAlarmDlgHide) |
| | | ON_WM_MOVING() |
| | | ON_WM_MOVE() |
| | | ON_COMMAND(ID_MENU_FILE_EXIT, &CServoDlg::OnMenuFileExit) |
| | | ON_UPDATE_COMMAND_UI(ID_MENU_FILE_EXIT, &CServoDlg::OnUpdateMenuFileExit) |
| | | ON_COMMAND(ID_MENU_FILE_SETTINGS, &CServoDlg::OnMenuFileSettings) |
| | | ON_UPDATE_COMMAND_UI(ID_MENU_FILE_SETTINGS, &CServoDlg::OnUpdateMenuFileSettings) |
| | | ON_COMMAND(ID_MENU_FILE_SECSTEST, &CServoDlg::OnMenuFileSecsTest) |
| | | ON_UPDATE_COMMAND_UI(ID_MENU_FILE_SECSTEST, &CServoDlg::OnUpdateMenuFileSecsTest) |
| | | ON_COMMAND(ID_MENU_WND_LOG, &CServoDlg::OnMenuWndLog) |
| | | ON_UPDATE_COMMAND_UI(ID_MENU_WND_LOG, &CServoDlg::OnUpdateMenuWndLog) |
| | | ON_COMMAND(ID_MENU_HELP_ABOUT, &CServoDlg::OnMenuHelpAbout) |
| | | ON_WM_INITMENUPOPUP() |
| | | ON_WM_TIMER() |
| | | ON_WM_ERASEBKGND() |
| | | ON_BN_CLICKED(IDC_BUTTON_ALARM, &CServoDlg::OnBnClickedButtonAlarm) |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | | // CServoDlg 消息处理程序 |
| | | |
| | | void CServoDlg::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_HSMS_TERMINAL_TEXT == code) { |
| | | const char* pszText; |
| | | if (pAny->getStringValue("text", pszText)) { |
| | | ShowTerminalText(pszText); |
| | | } |
| | | } |
| | | else if (RX_CODE_EQ_ALIVE == code) { |
| | | // 通知设备状态 |
| | | SERVO::CEquipment* pEquipment = nullptr; |
| | | if (pAny->getPtrValue("ptr", (void*&)pEquipment)) { |
| | | if (pEquipment != nullptr) { |
| | | int nID = pEquipment->getID(); |
| | | BOOL bAlive = pEquipment->isAlive(); |
| | | if (EQ_ID_EFEM == nID) { |
| | | DeviceStatus status = bAlive ? DeviceStatus::ONLINE : DeviceStatus::OFFLINE; |
| | | UpdateDeviceStatus(INDICATE_ROBOT_ARM1, status); |
| | | UpdateDeviceStatus(INDICATE_ROBOT_ARM2, status); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | pAny->release(); |
| | | }, [&]() -> void { |
| | | // onComplete |
| | | }, [&](IThrowable* pThrowable) -> void { |
| | | // onErrorm |
| | | pThrowable->printf(); |
| | | }); |
| | | |
| | | theApp.m_model.getObservable()->observeOn(pRxWindows->mainThread()) |
| | | ->subscribe(m_pObserver); |
| | | } |
| | | } |
| | | |
| | | BOOL CServoDlg::OnInitDialog() |
| | | { |
| | |
| | | SetIcon(m_hIcon, FALSE); // 设置小图标 |
| | | |
| | | |
| | | // 菜单 |
| | | CMenu menu; |
| | | menu.LoadMenu(IDR_MENU_APP); |
| | | SetMenu(&menu); |
| | | |
| | | |
| | | |
| | | // ͼʾ |
| | | m_pGraph = CServoGraph::Hook(GetDlgItem(IDC_SERVO_GRAPH1)->GetSafeHwnd()); |
| | | CString strPath; |
| | | strPath.Format(_T("%s\\res\\Servo001.bmp"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir); |
| | | m_pGraph->AddImage(1, (LPTSTR)(LPCTSTR)strPath, 0, 0); |
| | | |
| | | strPath.Format(_T("%s\\res\\Robot001.bmp"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir); |
| | | m_pGraph->AddImage(IMAGE_ROBOT, (LPTSTR)(LPCTSTR)strPath, 170, 270); |
| | | |
| | | // 添加指示器 |
| | | // Bonder |
| | |
| | | |
| | | |
| | | // Robot |
| | | m_pGraph->AddIndicateBox(INDICATE_ROBOT_ARM1, 620, 294, 48, RGB(22, 22, 22), |
| | | m_pGraph->AddIndicateBox(INDICATE_ROBOT_ARM1, 190, 294, 48, RGB(22, 22, 22), |
| | | RGB(255, 127, 39), RGB(0, 176, 80)); |
| | | m_pGraph->SetBoxText(INDICATE_ROBOT_ARM1, "5", "Robot"); |
| | | m_pGraph->AddIndicateBox(INDICATE_ROBOT_ARM2, 673, 294, 48, RGB(22, 22, 22), |
| | | m_pGraph->AddIndicateBox(INDICATE_ROBOT_ARM2, 243, 294, 48, RGB(22, 22, 22), |
| | | RGB(255, 127, 39), RGB(0, 176, 80)); |
| | | m_pGraph->SetBoxText(INDICATE_ROBOT_ARM2, "6", "Robot"); |
| | | |
| | |
| | | theApp.m_model.init(); |
| | | |
| | | |
| | | SetTimer(TIMER_ID_CREATE_TERMINAL, 3000, nullptr); |
| | | InitRxWindows(); |
| | | OnBnClickedButtonLog(); |
| | | UpdateLogBtn(); |
| | | UpdateAlarmBtn(); |
| | | Resize(); |
| | | |
| | | |
| | | // 相当于延时调用master的初始化 |
| | | theApp.m_model.m_master.init(); |
| | | |
| | | |
| | | return TRUE; // 除非将焦点设置到控件,否则返回 TRUE |
| | | } |
| | | |
| | |
| | | return static_cast<HCURSOR>(m_hIcon); |
| | | } |
| | | |
| | | void CServoDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) |
| | | { |
| | | ASSERT(pPopupMenu != NULL); |
| | | |
| | | CCmdUI state; |
| | | state.m_pMenu = pPopupMenu; |
| | | ASSERT(state.m_pOther == NULL); |
| | | ASSERT(state.m_pParentMenu == NULL); |
| | | |
| | | HMENU hParentMenu; |
| | | if (AfxGetThreadState()->m_hTrackingMenu == pPopupMenu->m_hMenu) |
| | | state.m_pParentMenu = pPopupMenu; |
| | | else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL) |
| | | { |
| | | CWnd* pParent = this; |
| | | if (pParent != NULL && |
| | | (hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL) |
| | | { |
| | | int nIndexMax = ::GetMenuItemCount(hParentMenu); |
| | | for (int nIndex = 0; nIndex < nIndexMax; nIndex++) |
| | | { |
| | | if (::GetSubMenu(hParentMenu, nIndex) == pPopupMenu->m_hMenu) |
| | | { |
| | | state.m_pParentMenu = CMenu::FromHandle(hParentMenu); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | state.m_nIndexMax = pPopupMenu->GetMenuItemCount(); |
| | | for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax; |
| | | state.m_nIndex++) |
| | | { |
| | | state.m_nID = pPopupMenu->GetMenuItemID(state.m_nIndex); |
| | | if (state.m_nID == 0) |
| | | continue; |
| | | |
| | | ASSERT(state.m_pOther == NULL); |
| | | ASSERT(state.m_pMenu != NULL); |
| | | if (state.m_nID == (UINT)-1) |
| | | { |
| | | state.m_pSubMenu = pPopupMenu->GetSubMenu(state.m_nIndex); |
| | | if (state.m_pSubMenu == NULL || |
| | | (state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 || |
| | | state.m_nID == (UINT)-1) |
| | | { |
| | | continue; |
| | | } |
| | | state.DoUpdate(this, TRUE); |
| | | } |
| | | else |
| | | { |
| | | state.m_pSubMenu = NULL; |
| | | state.DoUpdate(this, FALSE); |
| | | } |
| | | |
| | | UINT nCount = pPopupMenu->GetMenuItemCount(); |
| | | if (nCount < state.m_nIndexMax) |
| | | { |
| | | state.m_nIndex -= (state.m_nIndexMax - nCount); |
| | | while (state.m_nIndex < nCount && |
| | | pPopupMenu->GetMenuItemID(state.m_nIndex) == state.m_nID) |
| | | { |
| | | state.m_nIndex++; |
| | | } |
| | | } |
| | | state.m_nIndexMax = nCount; |
| | | } |
| | | } |
| | | |
| | | void CServoDlg::OnMenuFileSettings() |
| | | { |
| | | |
| | | } |
| | | |
| | | void CServoDlg::OnUpdateMenuFileSettings(CCmdUI* pCmdUI) |
| | | { |
| | | pCmdUI->Enable(TRUE); |
| | | } |
| | | |
| | | void CServoDlg::OnMenuFileSecsTest() |
| | | { |
| | | CSecsTestDlg dlg; |
| | | dlg.DoModal(); |
| | | } |
| | | |
| | | void CServoDlg::OnUpdateMenuFileSecsTest(CCmdUI* pCmdUI) |
| | | { |
| | | pCmdUI->Enable(TRUE); |
| | | } |
| | | |
| | | void CServoDlg::OnMenuWndLog() |
| | | { |
| | | OnBnClickedButtonLog(); |
| | | } |
| | | |
| | | void CServoDlg::OnUpdateMenuWndLog(CCmdUI* pCmdUI) |
| | | { |
| | | pCmdUI->SetCheck(m_bShowLogWnd); |
| | | } |
| | | |
| | | void CServoDlg::OnMenuFileExit() |
| | | { |
| | | PostMessage(WM_CLOSE); |
| | | } |
| | | |
| | | void CServoDlg::OnUpdateMenuFileExit(CCmdUI* pCmdUI) |
| | | { |
| | | pCmdUI->Enable(TRUE); |
| | | } |
| | | |
| | | void CServoDlg::OnMenuHelpAbout() |
| | | { |
| | | CAboutDlg dlgAbout; |
| | | dlgAbout.DoModal(); |
| | | } |
| | | |
| | | void CServoDlg::OnBnClickedOk() |
| | | { |
| | |
| | | m_pLogDlg = nullptr; |
| | | } |
| | | |
| | | if (m_pAlarmDlg != nullptr) { |
| | | m_pAlarmDlg->DestroyWindow(); |
| | | delete m_pAlarmDlg; |
| | | m_pAlarmDlg = nullptr; |
| | | } |
| | | |
| | | if (m_pTerminalDisplayDlg != nullptr) { |
| | | m_pTerminalDisplayDlg->DestroyWindow(); |
| | | delete m_pTerminalDisplayDlg; |
| | | m_pTerminalDisplayDlg = nullptr; |
| | | } |
| | | |
| | | if (m_hbrBkgnd != nullptr) { |
| | | ::DeleteObject(m_hbrBkgnd); |
| | | } |
| | | |
| | | if (m_pObserver != nullptr) { |
| | | m_pObserver->unsubscribe(); |
| | | m_pObserver = NULL; |
| | | } |
| | | |
| | | } |
| | | |
| | | void CServoDlg::OnBnClickedButtonLog() |
| | | { |
| | | m_bShowLogWnd = !m_bShowLogWnd; |
| | | |
| | | // 如果要显示日志窗口,则隐藏报警窗口 |
| | | if (m_bShowLogWnd) { |
| | | m_bShowAlarmWnd = false; |
| | | if (m_pAlarmDlg != nullptr) { |
| | | m_pAlarmDlg->ShowWindow(SW_HIDE); |
| | | UpdateAlarmBtn(); |
| | | } |
| | | } |
| | | |
| | | if (m_pLogDlg == nullptr) { |
| | | m_pLogDlg = new CLogDlg(); |
| | | m_pLogDlg->Create(IDD_DIALOG_LOG, this); |
| | |
| | | } |
| | | ASSERT(m_pLogDlg); |
| | | m_pLogDlg->ShowWindow(m_bShowLogWnd ? SW_SHOW : SW_HIDE); |
| | | LOGE("OnBnClickedButtonLog"); |
| | | |
| | | UpdateLogBtn(); |
| | | } |
| | |
| | | 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] 之间 |
| | | if (percentage < 0.0f) percentage = 0.0f; |
| | | if (percentage > 1.0f) percentage = 1.0f; |
| | | |
| | | // 根据百分比计算目标 X 坐标 |
| | | int startX = m_pGraph->GetImage(IMAGE_ROBOT)->x; |
| | | int endX = static_cast<int>(170 + percentage * (700 - 170)); |
| | | |
| | | int arm1Offset = 20; // 从图片到ARM1的偏移 |
| | | int arm2Offset = 73; // 从图片到ARM2的偏移 |
| | | |
| | | // 计算移动所需的时间 |
| | | int distance = abs(endX - startX); |
| | | int duration = static_cast<int>((distance / 100.0) * 1000); |
| | | |
| | | auto startTime = std::chrono::steady_clock::now(); |
| | | auto endTime = startTime + std::chrono::milliseconds(duration); |
| | | |
| | | // 开始移动,设置标记 |
| | | m_bIsRobotMoving = TRUE; |
| | | |
| | | // 开始平滑移动 |
| | | while (std::chrono::steady_clock::now() < endTime) { |
| | | auto currentTime = std::chrono::steady_clock::now(); |
| | | float progress = std::chrono::duration<float, std::milli>(currentTime - startTime).count() / duration; |
| | | progress = min(progress, 1.0f); |
| | | |
| | | // 根据进度计算当前位置 |
| | | int currentX = static_cast<int>(startX + progress * (endX - startX)); |
| | | m_pGraph->UpdateImageCoordinates(IMAGE_ROBOT, currentX, 270); |
| | | m_pGraph->UpdateIndicateBoxCoordinates(INDICATE_ROBOT_ARM1, currentX + arm1Offset, 294); |
| | | m_pGraph->UpdateIndicateBoxCoordinates(INDICATE_ROBOT_ARM2, currentX + arm2Offset, 294); |
| | | |
| | | // 刷新界面 |
| | | Invalidate(); |
| | | UpdateWindow(); |
| | | |
| | | // 控制帧率约为 60 FPS |
| | | std::this_thread::sleep_for(std::chrono::milliseconds(16)); |
| | | } |
| | | |
| | | // 确保最后位置精确到目标位置 |
| | | m_pGraph->UpdateImageCoordinates(IMAGE_ROBOT, endX, 270); |
| | | m_pGraph->UpdateIndicateBoxCoordinates(INDICATE_ROBOT_ARM1, endX + arm1Offset, 294); |
| | | m_pGraph->UpdateIndicateBoxCoordinates(INDICATE_ROBOT_ARM2, endX + arm2Offset, 294); |
| | | |
| | | // 界面重绘 |
| | | Invalidate(); |
| | | |
| | | // 动画结束,设置标记 |
| | | m_bIsRobotMoving = FALSE; |
| | | } |
| | | |
| | | void CServoDlg::RotateRobot(float angleInDegrees) |
| | | { |
| | | // 将角度转换为弧度 |
| | | float angleInRadians = static_cast<float>(std::acos(-1)) / 180.0f * angleInDegrees; |
| | | |
| | | // 获取机器人图片的当前坐标和中心 |
| | | auto* pImage = m_pGraph->GetImage(IMAGE_ROBOT); |
| | | if (!pImage) return; |
| | | |
| | | // 更新 Rotate 图片的角度,确保角度保持在 [0, 360) 范围内 |
| | | m_pGraph->UpdateImageAngle(IMAGE_ROBOT, static_cast<float>(fmod(pImage->angle + angleInDegrees + 360, 360))); |
| | | |
| | | int cx = pImage->x + pImage->bmWidth / 2; // 图片中心 X |
| | | int cy = pImage->y + pImage->bmHeight / 2; // 图片中心 Y |
| | | |
| | | // 旋转指示框的坐标 |
| | | auto* pRobot1 = m_pGraph->GetIndicateBox(INDICATE_ROBOT_ARM1); |
| | | auto* pRobot2 = m_pGraph->GetIndicateBox(INDICATE_ROBOT_ARM2); |
| | | |
| | | if (pRobot1 && pRobot2) { |
| | | int newArmX1 = pImage->x + 20; |
| | | int newArmY1 = 294; |
| | | |
| | | int newArmX2 = pImage->x + 73; |
| | | int newArmY2 = 294; |
| | | |
| | | if (angleInDegrees != 0.0f) { |
| | | // 计算指示框1的新坐标 |
| | | newArmX1 = static_cast<int>(cx + (pRobot1->x - cx) * cos(angleInRadians) - (pRobot1->y - cy) * sin(angleInRadians)); |
| | | newArmY1 = static_cast<int>(cy + (pRobot1->x - cx) * sin(angleInRadians) + (pRobot1->y - cy) * cos(angleInRadians)); |
| | | |
| | | // 计算指示框2的新坐标 |
| | | newArmX2 = static_cast<int>(cx + (pRobot2->x - cx) * cos(angleInRadians) - (pRobot2->y - cy) * sin(angleInRadians)); |
| | | newArmY2 = static_cast<int>(cy + (pRobot2->x - cx) * sin(angleInRadians) + (pRobot2->y - cy) * cos(angleInRadians)); |
| | | } |
| | | |
| | | // 更新指示框的位置 |
| | | m_pGraph->UpdateIndicateBoxCoordinates(INDICATE_ROBOT_ARM1, newArmX1, newArmY1); |
| | | m_pGraph->UpdateIndicateBoxCoordinates(INDICATE_ROBOT_ARM2, newArmX2, newArmY2); |
| | | } |
| | | |
| | | // 强制重绘界面 |
| | | Invalidate(); |
| | | } |
| | | |
| | | void CServoDlg::UpdateDeviceStatus(int id, DeviceStatus status) |
| | | { |
| | | // 根据状态设置颜色 |
| | | COLORREF newBackgroundColor; |
| | | COLORREF newFrameColor1; |
| | | COLORREF newFrameColor2; |
| | | |
| | | switch (status) { |
| | | case ONLINE: |
| | | newBackgroundColor = RGB(0, 255, 0); |
| | | newFrameColor1 = RGB(22, 22, 22); |
| | | newFrameColor2 = RGB(255, 127, 39); |
| | | break; |
| | | case OFFLINE: |
| | | newBackgroundColor = RGB(255, 0, 0); |
| | | newFrameColor1 = RGB(22, 22, 22); |
| | | newFrameColor2 = RGB(255, 127, 39); |
| | | break; |
| | | default: |
| | | newBackgroundColor = RGB(255, 255, 255); // 默认白色背景 |
| | | newFrameColor1 = RGB(0, 0, 0); // 默认黑色框架1 |
| | | newFrameColor2 = RGB(0, 0, 0); // 默认黑色框架2 |
| | | break; |
| | | } |
| | | |
| | | m_pGraph->UpdateIndicateBox1Colors(id, newBackgroundColor, newFrameColor1, newFrameColor2); |
| | | |
| | | // 刷新界面 |
| | | Invalidate(); |
| | | UpdateWindow(); |
| | | } |
| | | |
| | | void CServoDlg::OnSize(UINT nType, int cx, int cy) |
| | | { |
| | | CDialogEx::OnSize(nType, cx, cy); |
| | |
| | | CRect rcClient, rcItem; |
| | | CWnd* pItem = nullptr; |
| | | int x, y; |
| | | GetClientRect(&rcClient); |
| | | |
| | | x = 0; |
| | | y = 0; |
| | |
| | | x = 8; |
| | | pItem = GetDlgItem(IDC_BUTTON_LOG); |
| | | pItem->GetClientRect(&rcItem); |
| | | pItem->MoveWindow(x, y, rcItem.Width(), rcItem.Height()); |
| | | 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() |
| | |
| | | m_bShowLogWnd = FALSE; |
| | | UpdateLogBtn(); |
| | | LOGE("OnLogDlgHide"); |
| | | |
| | | unsigned int DATAID, RPTID; |
| | | DATAID = 111; |
| | | RPTID = 1001; |
| | | std::vector<std::string> v; |
| | | v.push_back("abc"); |
| | | v.push_back("def"); |
| | | theApp.m_model.m_hsmsPassive.requestEventReportSend(DATAID, RPTID, v); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | LRESULT CServoDlg::OnAlarmDlgHide(WPARAM wParam, LPARAM lParam) |
| | | { |
| | | m_bShowAlarmWnd = FALSE; |
| | | UpdateAlarmBtn(); |
| | | LOGE("OnAlarmDlgHide"); |
| | | |
| | | return 0; |
| | | } |
| | |
| | | m_pLogDlg->MoveWindow(rcWnd.left, rcWnd.bottom - 8, rcWnd.Width(), 200); |
| | | } |
| | | |
| | | if (m_pAlarmDlg != nullptr && !m_pAlarmDlg->IsZoomed()) { |
| | | CRect rcWnd; |
| | | GetWindowRect(&rcWnd); |
| | | m_pAlarmDlg->MoveWindow(rcWnd.left, rcWnd.bottom - 8, rcWnd.Width(), 200); |
| | | } |
| | | |
| | | CDialogEx::OnMove(x, y); |
| | | } |
| | | |
| | | void CServoDlg::ShowTerminalText(const char* pszText, unsigned int duration/* = -1*/) |
| | | { |
| | | ASSERT(m_pTerminalDisplayDlg); |
| | | m_pTerminalDisplayDlg->ShowText(pszText, duration); |
| | | } |
| | | |
| | | void CServoDlg::OnTimer(UINT_PTR nIDEvent) |
| | | { |
| | | if (TIMER_ID_CREATE_TERMINAL == nIDEvent) { |
| | | // 预先创建终端窗口 |
| | | KillTimer(TIMER_ID_CREATE_TERMINAL); |
| | | char szBuffer[MAX_PATH]; |
| | | sprintf_s(szBuffer, MAX_PATH, "%s\\RES\\TeminalMsg.html", (LPTSTR)(LPCTSTR)theApp.m_strAppDir); |
| | | m_pTerminalDisplayDlg = new CTerminalDisplayDlg(); |
| | | m_pTerminalDisplayDlg->SetTemplateHtml(szBuffer); |
| | | m_pTerminalDisplayDlg->Create(IDD_DIALOG_TERMINAL_DISPLAY, this); |
| | | } |
| | | |
| | | CDialogEx::OnTimer(nIDEvent); |
| | | } |
| | | |
| | | |
| | | BOOL CServoDlg::OnEraseBkgnd(CDC* pDC) |
| | | { |
| | | // TODO: 在此添加消息处理程序代码和/或调用默认值 |
| | | if (m_bIsRobotMoving) { |
| | | // 禁止刷新背景,避免闪烁 |
| | | return TRUE; |
| | | } |
| | | |
| | | return CDialogEx::OnEraseBkgnd(pDC); |
| | | } |
| | | |
| | | |
| | | void CServoDlg::OnBnClickedButtonAlarm() |
| | | { |
| | | // TODO: 在此添加控件通知处理程序代码 |
| | | m_bShowAlarmWnd = !m_bShowAlarmWnd; |
| | | |
| | | // 如果要显示报警窗口,则隐藏日志窗口 |
| | | if (m_bShowAlarmWnd) { |
| | | m_bShowLogWnd = false; |
| | | if (m_pLogDlg != nullptr) { |
| | | m_pLogDlg->ShowWindow(SW_HIDE); |
| | | UpdateLogBtn(); |
| | | } |
| | | } |
| | | |
| | | if (m_pAlarmDlg == nullptr) { |
| | | m_pAlarmDlg = new CAlarmDlg(); |
| | | m_pAlarmDlg->Create(IDD_DIALOG_ALARM, this); |
| | | |
| | | CRect rcWnd; |
| | | GetWindowRect(&rcWnd); |
| | | m_pAlarmDlg->MoveWindow(rcWnd.left, rcWnd.bottom - 8, rcWnd.Width(), 200); |
| | | } |
| | | ASSERT(m_pAlarmDlg); |
| | | m_pAlarmDlg->ShowWindow(m_bShowAlarmWnd ? SW_SHOW : SW_HIDE); |
| | | |
| | | UpdateAlarmBtn(); |
| | | } |