// G1G2HardwareCheckerDlg.cpp: 实现文件 // #include "pch.h" #include "framework.h" #include "G1G2HardwareChecker.h" #include "G1G2HardwareCheckerDlg.h" #include "afxdialogex.h" #include "applog.h" #include "stringex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif static const char* loggername = "Dlg"; void string_replaceAll(std::string& str, const std::string& src, const std::string& dst) { std::string::size_type pos = 0; std::string::size_type srclen = src.size(); std::string::size_type dstlen = dst.size(); while ((pos = str.find(src, pos)) != std::string::npos) { str.replace(pos, srclen, dst); pos += dstlen; } } // CG1G2HardwareCheckerDlg 对话框 std::string StringToUtf(std::string strValue) { int nwLen = MultiByteToWideChar(CP_UTF8, 0, strValue.c_str(), -1, NULL, 0); wchar_t* pwBuf = new wchar_t[nwLen + 1];//加上末尾'\0' memset(pwBuf, 0, nwLen * 2 + 2); MultiByteToWideChar(CP_UTF8, 0, strValue.c_str(), strValue.length(), pwBuf, nwLen); int nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, NULL, NULL, NULL); char* pBuf = new char[nLen + 1]; memset(pBuf, 0, nLen + 1); WideCharToMultiByte(CP_ACP, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL); std::string retStr = pBuf; delete[]pBuf; delete[]pwBuf; return retStr; } CG1G2HardwareCheckerDlg::CG1G2HardwareCheckerDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_G1G2HARDWARECHECKER_DIALOG, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON_HG); LOG_INITX(logname); } void CG1G2HardwareCheckerDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_BTNCHK_RECOVERY, m_btn_check_recovery); SetBtnBgClr(&m_btn_check_recovery, BTNStatus::BTN_UNTESTED); DDX_Control(pDX, IDC_BTNCHK_POWER, m_btn_check_power); SetBtnBgClr(&m_btn_check_power, BTNStatus::BTN_UNTESTED); DDX_Control(pDX, IDC_BTNCHK_RESET, m_btn_ckeck_reset); SetBtnBgClr(&m_btn_ckeck_reset, BTNStatus::BTN_UNTESTED); DDX_Control(pDX, IDC_BTNCHK_POWERSUPPLY, m_btn_check_powersupply); SetBtnBgClr(&m_btn_check_powersupply, BTNStatus::BTN_UNTESTED); DDX_Control(pDX, IDC_BTNCHK_LED, m_btn_check_led); SetBtnBgClr(&m_btn_check_led, BTNStatus::BTN_UNTESTED); DDX_Control(pDX, IDC_BTNCHK_UART, m_btn_check_uart); SetBtnBgClr(&m_btn_check_uart, BTNStatus::BTN_UNTESTED); DDX_Control(pDX, IDC_BTNCHK_SWITCH, m_btn_check_switchs); SetBtnBgClr(&m_btn_check_switchs, BTNStatus::BTN_UNTESTED); DDX_Control(pDX, IDC_BTNCHK_IMAGE, m_btn_check_imgs); SetBtnBgClr(&m_btn_check_imgs, BTNStatus::BTN_UNTESTED); DDX_Control(pDX, IDC_BTNCHK_CAPACITY, m_btn_check_hw_capacity); SetBtnBgClr(&m_btn_check_hw_capacity, BTNStatus::BTN_UNTESTED); DDX_Control(pDX, IDC_BTNCHK_DISPLAY, m_btn_check_display); SetBtnBgClr(&m_btn_check_display, BTNStatus::BTN_UNTESTED); DDX_Control(pDX, IDC_CMB_DEVS, m_dev_cmbx); DDX_Control(pDX, IDC_LB_SHOWINFO, m_showinfo); m_showinfo.SetLimitText(0xfffffff); m_tile_font.CreatePointFont(125, _T("宋体")); m_info_font.CreatePointFont(120, _T("宋体")); GetDlgItem(IDC_LB_TITLE)->SetFont(&m_tile_font); GetDlgItem(IDC_LBL_CHECKINFO)->SetFont(&m_info_font); CRect rect; GetDlgItem(IDC_PIC_SHOW)->GetWindowRect(rect); GetDlgItem(IDC_PIC_SHOW)->MoveWindow(rect.left - 15, rect.top - 25, 370, 450, true); } BEGIN_MESSAGE_MAP(CG1G2HardwareCheckerDlg, CDialogEx) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BTN_REBOOT, &CG1G2HardwareCheckerDlg::OnBnClickedBtnReboot) ON_BN_CLICKED(IDC_BTN_POWEROFF, &CG1G2HardwareCheckerDlg::OnBnClickedBtnPoweroff) ON_BN_CLICKED(IDC_BTNCHK_RECOVERY, &CG1G2HardwareCheckerDlg::OnBnClickedBtnchkRecovery) ON_BN_CLICKED(IDC_BTNCHK_POWER, &CG1G2HardwareCheckerDlg::OnBnClickedBtnchkPower) ON_BN_CLICKED(IDC_BTNCHK_RESET, &CG1G2HardwareCheckerDlg::OnBnClickedBtnchkReset) ON_BN_CLICKED(IDC_BTNCHK_POWERSUPPLY, &CG1G2HardwareCheckerDlg::OnBnClickedBtnchkPowersupply) ON_BN_CLICKED(IDC_BTNCHK_LED, &CG1G2HardwareCheckerDlg::OnBnClickedBtnchkLed) ON_BN_CLICKED(IDC_BTNCHK_UART, &CG1G2HardwareCheckerDlg::OnBnClickedBtnchkUart) ON_BN_CLICKED(IDC_BTNCHK_SWITCH, &CG1G2HardwareCheckerDlg::OnBnClickedBtnchkSwitch) ON_BN_CLICKED(IDC_BTNCHK_IMAGE, &CG1G2HardwareCheckerDlg::OnBnClickedBtnchkImage) ON_BN_CLICKED(IDC_BTNCHK_CAPACITY, &CG1G2HardwareCheckerDlg::OnBnClickedBtnchkCapacity) ON_BN_CLICKED(IDC_BTN_CHECK, &CG1G2HardwareCheckerDlg::OnBnClickedBtnCheck) ON_BN_CLICKED(IDC_BTN_PASS, &CG1G2HardwareCheckerDlg::OnBnClickedBtnPass) ON_BN_CLICKED(IDC_BTN_NG, &CG1G2HardwareCheckerDlg::OnBnClickedBtnNg) ON_CBN_SELCHANGE(IDC_CMB_DEVS, &CG1G2HardwareCheckerDlg::OnCbxdevselect) ON_STN_DBLCLK(IDC_PIC_SHOW, &CG1G2HardwareCheckerDlg::OnStnDblclickPicShow) ON_BN_CLICKED(IDC_BTNCHK_FINISH, &CG1G2HardwareCheckerDlg::OnBnClickedBtnchkFinish) ON_BN_CLICKED(IDC_BTNCHK_DISPLAY, &CG1G2HardwareCheckerDlg::OnBnClickedBtnchkDisplay) ON_BN_CLICKED(IDC_BTN_OPENFLODER, &CG1G2HardwareCheckerDlg::OnBnClickedBtnOpenfloder) END_MESSAGE_MAP() // CG1G2HardwareCheckerDlg 消息处理程序 BOOL CG1G2HardwareCheckerDlg::OnInitDialog() { CDialogEx::OnInitDialog(); m_scn_manager.reset(new ScannerManager()); m_scn_manager->SetScannerEventCallback(&CG1G2HardwareCheckerDlg::OnScannerEvent, this); m_scn_manager->Init(); // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码s return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CG1G2HardwareCheckerDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CG1G2HardwareCheckerDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } void CG1G2HardwareCheckerDlg::SetBtnBgClr(CMFCButton* btn, BTNStatus status) { if (!btn) return; switch (status) { case BTN_UNTESTED: btn->SetFaceColor(RGB(255, 128, 0)); break; case BTN_PASS: btn->SetFaceColor(RGB(0, 255, 0)); break; case BTN_NG: btn->SetFaceColor(RGB(255, 0, 0)); break; default: break; } btn->m_bTransparent = FALSE; btn->m_bDontUseWinXPTheme = TRUE; btn->m_bDrawFocus = FALSE; } void CG1G2HardwareCheckerDlg::UpdateUI() { } int CG1G2HardwareCheckerDlg::OnScannerEvent(DevEvent dev, int from, int status, int data_type, int data_len, void* data, void* user) { CG1G2HardwareCheckerDlg* This = (CG1G2HardwareCheckerDlg*)user; if (This) { This->on_scanner_evt(dev, from, status, data_type, data_len, data); } return 1; } void CG1G2HardwareCheckerDlg::on_scanner_evt(DevEvent dev, int from, int status, int data_type, int data_len, void* data) { std::lock_guard mut(m_callback_mut); if (from == 0)//来自USB { if (dev.EvtCode == USB_EVENT_DEVICE_ARRIVED) { m_dev_cmbx.InsertString(dev.Index, CString(dev.Msg.c_str())); LOG_INFO(string_format("USB_EVENT_DEVICE_ARRIVED vid=%04x pid=%04x \n", dev.Vid, dev.Pid)); if (m_dev_cmbx.GetCount() == 1) { m_scn_manager->SetCurrentDevice(0); m_task_infos = m_scn_manager->GetCurSupTests(); } } else if (dev.EvtCode == USB_EVENT_DEVICE_LEFT) { LOG_INFO(string_format("USB_EVENT_DEVICE_LEFT vid=%04x pid=%04x \n", dev.Vid, dev.Pid)); m_dev_cmbx.DeleteString(dev.Index); m_showinfo.SetWindowText(_T("")); } } else if (from == 1)//来自 scanner 实例 { DATA_TYPE dt = (DATA_TYPE)data_type; switch (dt) { case DAT_UNKOWN: break; case DAT_INT: break; case DAT_DOUBLE: break; case DAT_STRING: { USES_CONVERSION; std::string info_s; info_s.resize(data_len); memcpy(&info_s[0], data, data_len); CString str = A2T(info_s.c_str()); m_showinfo.SetSel(m_showinfo.GetWindowTextLength(), m_showinfo.GetWindowTextLength()); m_showinfo.ReplaceSel(str); } break; case DAT_FLATINFO: { USES_CONVERSION; std::string info_s; info_s.resize(data_len); memcpy(&info_s[0], data, data_len); CString str = A2T(StringToUtf(info_s).c_str()); m_showinfo.SetSel(m_showinfo.GetWindowTextLength(), m_showinfo.GetWindowTextLength()); m_showinfo.ReplaceSel(str); } break; case DAT_USB: break; case DAT_IMAGE_PATH: { std::string img_path; img_path.resize(data_len); memcpy(&img_path[0], data, data_len); LOG_INFO(string_format("callback image path: %s \n",img_path.c_str())); CString path(img_path.c_str()); draw_picture(path); } default: break; } } { GetDlgItem(IDC_BTN_REBOOT)->EnableWindow(m_dev_cmbx.GetCount() == 0 ? FALSE : TRUE); GetDlgItem(IDC_BTN_POWEROFF)->EnableWindow(m_dev_cmbx.GetCount() == 0 ? FALSE : TRUE); } } void CG1G2HardwareCheckerDlg::update_task_info(TASKID id) { for (size_t i = 0; i < m_task_infos.size(); i++) { if (m_task_infos[i].id == id) { USES_CONVERSION; CString title = A2T(StringToUtf(m_task_infos[i].title).c_str()); GetDlgItem(IDC_LB_TITLE)->SetWindowText(title); title = A2T(StringToUtf(m_task_infos[i].info).c_str()); GetDlgItem(IDC_LBL_CHECKINFO)->SetWindowText(title); int en_human_check = m_task_infos[i].human_ajust; GetDlgItem(IDC_BTN_CHECK)->EnableWindow(en_human_check == 1 || en_human_check == 2); GetDlgItem(IDC_BTN_NG)->EnableWindow(en_human_check == 2 || en_human_check == 0); GetDlgItem(IDC_BTN_PASS)->EnableWindow(en_human_check == 2 || en_human_check == 0); } } } void CG1G2HardwareCheckerDlg::draw_picture(CString path) { if (path.GetLength() == 0) return; CImage img; img.Load(path); CRect rectf; int cx = img.GetWidth(); int cy = img.GetHeight(); if (cx == 0 || cy == 0) return; CWnd* pWnd = GetDlgItem(IDC_PIC_SHOW); pWnd->GetClientRect(&rectf); CDC* pDC = pWnd->GetDC(); SetStretchBltMode(pDC->m_hDC, STRETCH_HALFTONE); CPoint pos = rectf.TopLeft(); rectf = CRect(pos, CSize(370, 450)); img.Draw(pDC->m_hDC, rectf); ReleaseDC(pDC); img.Destroy(); m_bupdate_img = true; m_img_path = path; } void CG1G2HardwareCheckerDlg::OnBnClickedBtnReboot() { if (m_scn_manager.get()) { m_scn_manager->Reboot(0); } } void CG1G2HardwareCheckerDlg::OnBnClickedBtnPoweroff() { if (m_scn_manager.get()) { m_scn_manager->PowerOFF(); } } //外观检测 void CG1G2HardwareCheckerDlg::OnBnClickedBtnchkRecovery() { m_task_id = TASK_ID_CHECK_OUTLOOK; update_task_info(m_task_id); } //机械性能 void CG1G2HardwareCheckerDlg::OnBnClickedBtnchkPower() { m_task_id = TASK_ID_CHECK_MECHANICAL_PRP; update_task_info(m_task_id); } //装配校验 void CG1G2HardwareCheckerDlg::OnBnClickedBtnchkReset() { m_task_id = TASK_ID_CKECK_ASSEMBLE; update_task_info(m_task_id); } //电源供电 void CG1G2HardwareCheckerDlg::OnBnClickedBtnchkPowersupply() { m_task_id = TASK_ID_CHECK_POWERSUPPLY; update_task_info(m_task_id); } //PWR按键功能 void CG1G2HardwareCheckerDlg::OnBnClickedBtnchkLed() { m_task_id = TASK_ID_CHECK_PWRBTN; update_task_info(m_task_id); } //RESET和RECOVERY按键功能检查 void CG1G2HardwareCheckerDlg::OnBnClickedBtnchkUart() { m_task_id = TASK_ID_CHECK_RESET_RECOVERY_BTN; update_task_info(m_task_id); } //拨码开关检查 void CG1G2HardwareCheckerDlg::OnBnClickedBtnchkSwitch() { m_task_id = TASK_ID_CHECK_SWITCHS; update_task_info(m_task_id); } //内存和存储容量检查 void CG1G2HardwareCheckerDlg::OnBnClickedBtnchkImage() { m_task_id = TASK_ID_CHECK_HW_CAPACITY; update_task_info(m_task_id); } //图像检查 void CG1G2HardwareCheckerDlg::OnBnClickedBtnchkCapacity() { m_task_id = TASK_ID_CHECK_IMGS; update_task_info(m_task_id); } //液晶显示校验 void CG1G2HardwareCheckerDlg::OnBnClickedBtnchkDisplay() { // TODO: 在此添加控件通知处理程序代码 m_task_id = TASK_ID_CHECK_DISPLAY; update_task_info(m_task_id); } void CG1G2HardwareCheckerDlg::OnBnClickedBtnCheck() { if (m_scn_manager.get()) { for (size_t i = 0; i < m_task_infos.size(); i++) { if (m_task_infos[i].id == m_task_id && m_task_infos[i].human_ajust) { USES_CONVERSION; CString str = A2T(StringToUtf(m_task_infos[m_task_id].title).c_str()); str += +_T(" :自动校验中.....\r\n"); m_showinfo.SetSel(m_showinfo.GetWindowTextLength(), m_showinfo.GetWindowTextLength()); m_showinfo.ReplaceSel(str); m_scn_manager->AddTask(m_task_id); } } } } void CG1G2HardwareCheckerDlg::OnBnClickedBtnPass() { if (m_scn_manager.get()) { auto ret = m_scn_manager->UpdateTaskResult(m_task_id, "Pass"); USES_CONVERSION; CString str = A2T(StringToUtf(m_task_infos[m_task_id].title).c_str()); str += (ret == true ? _T(": 校验通过\r\n") : _T(": 校验更新失败\r\n")); m_showinfo.SetSel(m_showinfo.GetWindowTextLength(), m_showinfo.GetWindowTextLength()); m_showinfo.ReplaceSel(str); } } void CG1G2HardwareCheckerDlg::OnBnClickedBtnNg() { if (m_scn_manager.get()) { auto ret = m_scn_manager->UpdateTaskResult(m_task_id, "NG"); USES_CONVERSION; CString str = A2T(StringToUtf(m_task_infos[m_task_id].title).c_str()); str += (ret == true ? _T(": 校验不通过\r\n") : _T(": 校验更新失败\r\n")); m_showinfo.SetSel(m_showinfo.GetWindowTextLength(), m_showinfo.GetWindowTextLength()); m_showinfo.ReplaceSel(str); } } //void CG1G2HardwareCheckerDlg::OnBnClickedOk() //{ // // TODO: 在此添加控件通知处理程序代码 // CDialogEx::OnOK(); //} void CG1G2HardwareCheckerDlg::OnCbxdevselect() { int cur_select = m_dev_cmbx.GetCurSel(); m_scn_manager->SetCurrentDevice(cur_select); m_task_infos = m_scn_manager->GetCurSupTests(); } void CG1G2HardwareCheckerDlg::OnStnDblclickPicShow() { // TODO: 在此添加控件通知处理程序代码 if (!m_bupdate_img) return; ShellExecute(NULL, _T("open"), m_img_path, NULL, NULL, SW_SHOWNORMAL); } //完成校验 void CG1G2HardwareCheckerDlg::OnBnClickedBtnchkFinish() { if (m_scn_manager.get()) { bool btest = true; CString str_info = _T("当前 "); for (size_t i = 0; i < m_scn_manager->GetCurSupTests().size(); i++) { if (m_scn_manager->GetCurSupTests()[i].tested == "False") { USES_CONVERSION; btest = false; CString info = A2T(StringToUtf(m_task_infos[i].title).c_str()); str_info += info + _T(" "); } } if (btest) m_scn_manager->FinishTest(); else { str_info += _T("未检测,请检测完成后再更新"); MessageBox(str_info, _T("提示"), MB_OK | MB_ICONINFORMATION); } } } void CG1G2HardwareCheckerDlg::OnBnClickedBtnOpenfloder() { // TODO: 在此添加控件通知处理程序代码 TCHAR exeFullPath[MAX_PATH]; CString strPath; GetModuleFileName(NULL, exeFullPath, MAX_PATH); strPath = (CString)exeFullPath; int position = strPath.ReverseFind('\\'); strPath = strPath.Left(position + 1); strPath += "CacheImage"; ShellExecute(NULL, _T("open"), strPath, NULL, NULL, SW_SHOWNORMAL); }