|
@@ -10,10 +10,58 @@
|
|
|
#define new DEBUG_NEW
|
|
|
#endif
|
|
|
|
|
|
-
|
|
|
// CTCLToolsDlg 对话框
|
|
|
|
|
|
|
|
|
+BOOL GetSysSerialPort(std::vector<std::string>& vtports)
|
|
|
+{
|
|
|
+ HKEY hKey;
|
|
|
+ LSTATUS lReg = 0;
|
|
|
+ DWORD dwMaxValLen = 0;
|
|
|
+ DWORD dwValNum = 0;
|
|
|
+ lReg = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_QUERY_VALUE, &hKey);
|
|
|
+ if (lReg != ERROR_SUCCESS)
|
|
|
+ {
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ lReg = RegQueryInfoKeyA(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwValNum, &dwMaxValLen, NULL, NULL, NULL);
|
|
|
+ if (lReg != ERROR_SUCCESS)
|
|
|
+ {
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (vtports.size())
|
|
|
+ {
|
|
|
+ vtports.clear();
|
|
|
+ }
|
|
|
+
|
|
|
+ LPSTR lpValName, lpComNum;
|
|
|
+ DWORD dwValName, dwValSize = 6;
|
|
|
+ for (DWORD i = 0; i < dwValNum; i++)
|
|
|
+ {
|
|
|
+ dwValName = dwMaxValLen + 1;
|
|
|
+ dwValSize = 6;
|
|
|
+ lpValName = (LPSTR)VirtualAlloc(NULL, dwValName, MEM_COMMIT, PAGE_READWRITE);
|
|
|
+ lReg = RegEnumValueA(hKey, i, lpValName, &dwValName, NULL, NULL, NULL, NULL);
|
|
|
+ if ((lReg != ERROR_SUCCESS) && (lReg != ERROR_NO_MORE_ITEMS))
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ lpComNum = (LPSTR)VirtualAlloc(NULL, 6, MEM_COMMIT, PAGE_READWRITE);
|
|
|
+ lReg = RegQueryValueExA(hKey, lpValName, NULL, NULL, (LPBYTE)lpComNum, &dwValSize);
|
|
|
+ if (lReg != ERROR_SUCCESS)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ vtports.push_back(lpComNum);
|
|
|
+ VirtualFree(lpValName, 0, MEM_RELEASE);
|
|
|
+ VirtualFree(lpComNum, 0, MEM_RELEASE);
|
|
|
+ }
|
|
|
+
|
|
|
+ return TRUE;
|
|
|
+}
|
|
|
|
|
|
|
|
|
CTCLToolsDlg::CTCLToolsDlg(CWnd* pParent /*=NULL*/)
|
|
@@ -24,13 +72,18 @@ CTCLToolsDlg::CTCLToolsDlg(CWnd* pParent /*=NULL*/)
|
|
|
|
|
|
void CTCLToolsDlg::DoDataExchange(CDataExchange* pDX)
|
|
|
{
|
|
|
- CDialog::DoDataExchange(pDX);
|
|
|
+ CDialog::DoDataExchange(pDX);
|
|
|
+ DDX_Control(pDX, IDC_COMBO_PORTS, m_cbSerial);
|
|
|
+ DDX_Control(pDX, IDC_COMBO_CMDS, m_cbCommands);
|
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CTCLToolsDlg, CDialog)
|
|
|
ON_WM_PAINT()
|
|
|
ON_WM_QUERYDRAGICON()
|
|
|
+ ON_WM_DEVICECHANGE()
|
|
|
//}}AFX_MSG_MAP
|
|
|
+ ON_BN_CLICKED(BTN_OPEN_PORT, &CTCLToolsDlg::OnBnClickedOpenPort)
|
|
|
+ ON_BN_CLICKED(BTN_EXEC_CMD, &CTCLToolsDlg::OnBnClickedExecCmd)
|
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
|
|
@@ -46,6 +99,12 @@ BOOL CTCLToolsDlg::OnInitDialog()
|
|
|
SetIcon(m_hIcon, FALSE); // 设置小图标
|
|
|
|
|
|
// TODO: 在此添加额外的初始化代码
|
|
|
+ GetSysSerialPort(m_vtPorts);
|
|
|
+ InitSerialCombobox();
|
|
|
+ m_cbSerial.SetCurSel(0);
|
|
|
+
|
|
|
+ InitCommandCombobox();
|
|
|
+ m_cbCommands.SetCurSel(0);
|
|
|
|
|
|
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
|
|
|
}
|
|
@@ -86,3 +145,145 @@ HCURSOR CTCLToolsDlg::OnQueryDragIcon()
|
|
|
return static_cast<HCURSOR>(m_hIcon);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+BOOL CTCLToolsDlg::OnDeviceChange(UINT nEventType, DWORD_PTR dwData)
|
|
|
+{
|
|
|
+ switch (nEventType)
|
|
|
+ {
|
|
|
+ // 串口拨掉;
|
|
|
+ case DBT_DEVICEREMOVECOMPLETE:
|
|
|
+ break;
|
|
|
+ // 串口插入;
|
|
|
+ case DBT_DEVICEARRIVAL:
|
|
|
+ {
|
|
|
+ GetSysSerialPort(m_vtPorts);
|
|
|
+ InitSerialCombobox();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return TRUE;
|
|
|
+}
|
|
|
+
|
|
|
+void CTCLToolsDlg::InitSerialCombobox()
|
|
|
+{
|
|
|
+ m_cbSerial.ResetContent();
|
|
|
+ for (std::vector<std::string>::iterator it = m_vtPorts.begin(); it != m_vtPorts.end(); it++)
|
|
|
+ {
|
|
|
+ m_cbSerial.AddString(it->c_str());
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void CTCLToolsDlg::InitCommandCombobox()
|
|
|
+{
|
|
|
+ m_cbCommands.ResetContent();
|
|
|
+ std::vector<CommandParam> ExternalCMDParams = g_tclCommand.GetExternalCMDParams();
|
|
|
+ std::vector<CommandParam> InternalCMDParams = g_tclCommand.GetInternalCMDParams();
|
|
|
+ std::vector<CommandParam> CMDParams(ExternalCMDParams);
|
|
|
+
|
|
|
+ for ( std::vector<CommandParam>::iterator it = InternalCMDParams.begin(); it != InternalCMDParams.end(); it++ )
|
|
|
+ {
|
|
|
+ if ( !IsCommandExist(*it, CMDParams) )
|
|
|
+ {
|
|
|
+ CMDParams.push_back(*it);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for ( std::vector<CommandParam>::iterator it = CMDParams.begin(); it != CMDParams.end(); it++ )
|
|
|
+ {
|
|
|
+ m_cbCommands.AddString(it->name.c_str());
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void CTCLToolsDlg::OnBnClickedOpenPort()
|
|
|
+{
|
|
|
+ // TODO: 在此添加控件通知处理程序代码
|
|
|
+ CString strText;
|
|
|
+ GetDlgItemText(BTN_OPEN_PORT, strText);
|
|
|
+ if ( strText.Compare(_T("打开串口")) == 0 )
|
|
|
+ {
|
|
|
+ int nCurSel = m_cbSerial.GetCurSel();
|
|
|
+ if ( nCurSel != CB_ERR ) {
|
|
|
+ m_cbSerial.GetLBText(nCurSel,strText);
|
|
|
+
|
|
|
+ if ( g_tclCommand.IsOpen())
|
|
|
+ g_tclCommand.Close();
|
|
|
+
|
|
|
+ if ( g_tclCommand.Open(atol(strText.Mid(3).GetString()), 115200) )
|
|
|
+ {
|
|
|
+ SetDlgItemText(BTN_OPEN_PORT, _T("关闭串口"));
|
|
|
+ m_cbSerial.EnableWindow(FALSE);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ MessageBox("打开串口失败", "错误!", MB_ICONEXCLAMATION);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ MessageBox("请选择串口", "错误!", MB_ICONEXCLAMATION);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SetDlgItemText(BTN_OPEN_PORT, _T("打开串口"));
|
|
|
+ m_cbSerial.EnableWindow();
|
|
|
+
|
|
|
+ if ( g_tclCommand.IsOpen())
|
|
|
+ g_tclCommand.Close();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+bool CTCLToolsDlg::IsCommandExist(CommandParam &cmd, std::vector<CommandParam> &vtCMDParams)
|
|
|
+{
|
|
|
+ bool bExist = false;
|
|
|
+ for (std::vector<CommandParam>::iterator it = vtCMDParams.begin(); it != vtCMDParams.end(); it++ ) {
|
|
|
+ if ( _tcsicmp(it->name.c_str(), cmd.name.c_str()) == 0 ) {
|
|
|
+ bExist = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return bExist;
|
|
|
+}
|
|
|
+
|
|
|
+void CTCLToolsDlg::OnBnClickedExecCmd()
|
|
|
+{
|
|
|
+ // TODO: 在此添加控件通知处理程序代码
|
|
|
+ CString strText;
|
|
|
+ int nCurSel = m_cbCommands.GetCurSel();
|
|
|
+ if ( nCurSel != CB_ERR ) {
|
|
|
+ if ( g_tclCommand.IsOpen() ) {
|
|
|
+ CommandParam cmdpara;
|
|
|
+ m_cbCommands.GetLBText(nCurSel, strText);
|
|
|
+ g_tclCommand.GetCommandParams(strText.GetString(), cmdpara);
|
|
|
+ if ( cmdpara.nOption == CMDOPT_Set )
|
|
|
+ {
|
|
|
+ // 需要选择文件;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if ( g_tclCommand.SendCommand(strText.GetString(), cmdpara) ) {
|
|
|
+ // 设置状态;
|
|
|
+ if ( cmdpara._rtnStatus == 0x0A )
|
|
|
+ {
|
|
|
+ // 正确;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // 出错;
|
|
|
+ }
|
|
|
+ // 设置单字节值;
|
|
|
+
|
|
|
+ // 设置16进制字符串显示;
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ MessageBox("串口未打开", "错误!", MB_ICONEXCLAMATION);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|