Преглед изворни кода

完成基本抄写工具,剩余显示抄写结果。

sat23 пре 4 година
родитељ
комит
4143913e2d

+ 2 - 13
TCLTools/TCLTools/TCLTools.cpp

@@ -50,19 +50,8 @@ BOOL CTCLToolsApp::InitInstance()
 
 	AfxEnableControlContainer();
 
-    TCLCommand tclCommand;
-    tclCommand.SetInternalCMDParams(BIN_CMD);
-    if ( tclCommand.Open(21, _T("baud=115200 parity=N data=8 stop=1")) )
-    {
-        CommandParam cmdpara;
-        tclCommand.SendCommand("EnterFactory", cmdpara);
-
-        tclCommand.SendCommand("GetProjectId", cmdpara);
-        tclCommand.SendCommand("GetSoftVersion", cmdpara);
-        tclCommand.SendCommand("GetDeviceId", cmdpara);
-
-        tclCommand.SendCommand("LeaveFactory", cmdpara);
-    }
+    g_tclCommand.SetInternalCMDParams(BIN_CMD);
+    g_tclCommand.SetExternalCMDParams("cmds.dat");
 
 	// 标准初始化
 	// 如果未使用这些功能并希望减小

+ 7 - 6
TCLTools/TCLTools/TCLTools.rc

@@ -85,21 +85,22 @@ FONT 9, "MS Shell Dlg", 0, 0, 0x1
 BEGIN
     DEFPUSHBUTTON   "确定",IDOK,215,179,50,14
     PUSHBUTTON      "取消",IDCANCEL,271,179,50,14
-    COMBOBOX        IDC_COMBO1,28,9,52,76,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_COMBO_PORTS,28,9,52,76,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
     LTEXT           "串口",IDC_STATIC,11,11,15,8
-    COMBOBOX        IDC_COMBO2,28,27,151,76,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_COMBO_CMDS,28,27,151,159,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     LTEXT           "指令",IDC_STATIC,11,29,15,8
     EDITTEXT        IDC_EDIT2,28,44,151,14,ES_AUTOHSCROLL
-    PUSHBUTTON      "打开key",IDC_BUTTON1,181,44,34,14
-    CONTROL         "Check1",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,219,46,39,10
-    CONTROL         "Check1",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,256,46,39,10
+    PUSHBUTTON      "打开key",BTN_OPEN_FILE,181,44,34,14
+    CONTROL         "HEX-BIN",IDC_CHECK_HB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,219,46,42,10
+    CONTROL         "BIN-HEX",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,259,46,42,10
     LTEXT           "文件",IDC_STATIC,11,47,15,8
     LTEXT           "状态:",IDC_STATIC,13,87,22,8
     EDITTEXT        IDC_EDIT1,108,88,51,12,ES_AUTOHSCROLL
     EDITTEXT        IDC_EDIT3,31,115,108,14,ES_AUTOHSCROLL
     LTEXT           "单字节:",IDC_STATIC,71,89,28,8
     EDITTEXT        IDC_EDIT4,30,134,108,33,ES_MULTILINE | ES_AUTOHSCROLL
-    PUSHBUTTON      "执行",IDC_BUTTON2,181,27,34,14
+    PUSHBUTTON      "执行",BTN_EXEC_CMD,181,27,34,14
+    PUSHBUTTON      "打开串口",BTN_OPEN_PORT,82,8,50,14
 END
 
 

+ 4 - 4
TCLTools/TCLTools/TCLTools.vcproj

@@ -231,10 +231,6 @@
 				RelativePath=".\targetver.h"
 				>
 			</File>
-			<File
-				RelativePath=".\TCLCommand.h"
-				>
-			</File>
 			<File
 				RelativePath=".\TCLTools.h"
 				>
@@ -304,5 +300,9 @@
 		</File>
 	</Files>
 	<Globals>
+		<Global
+			Name="RESOURCE_FILE"
+			Value="TCLTools.rc"
+		/>
 	</Globals>
 </VisualStudioProject>

+ 203 - 2
TCLTools/TCLTools/TCLToolsDlg.cpp

@@ -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);
+        }
+    }
+}

+ 12 - 0
TCLTools/TCLTools/TCLToolsDlg.h

@@ -3,6 +3,7 @@
 //
 
 #pragma once
+#include "afxwin.h"
 
 
 // CTCLToolsDlg ¶Ô»°¿ò
@@ -27,5 +28,16 @@ protected:
 	virtual BOOL OnInitDialog();
 	afx_msg void OnPaint();
 	afx_msg HCURSOR OnQueryDragIcon();
+    afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD_PTR dwData);
 	DECLARE_MESSAGE_MAP()
+
+public:
+    std::vector<std::string> m_vtPorts;
+    void InitSerialCombobox();
+    void InitCommandCombobox();
+    CComboBox m_cbSerial;
+    afx_msg void OnBnClickedOpenPort();
+    CComboBox m_cbCommands;
+    bool IsCommandExist(CommandParam &cmd, std::vector<CommandParam> &vtCMDParams);
+    afx_msg void OnBnClickedExecCmd();
 };

+ 7 - 6
TCLTools/TCLTools/resource.h

@@ -4,18 +4,19 @@
 //
 #define IDD_TCLTOOLS_DIALOG             102
 #define IDR_MAINFRAME                   128
-#define IDR_BIN1                        129
 #define BIN_CMD                         129
-#define IDC_COMBO1                      1001
-#define IDC_COMBO2                      1002
+#define IDC_COMBO_PORTS                 1001
+#define IDC_COMBO_CMDS                  1002
 #define IDC_EDIT2                       1003
-#define IDC_BUTTON1                     1004
+#define BTN_OPEN_FILE                   1004
 #define IDC_CHECK1                      1005
+#define IDC_CHECK_HB                    1005
 #define IDC_CHECK2                      1006
 #define IDC_EDIT1                       1007
 #define IDC_EDIT3                       1008
 #define IDC_EDIT4                       1009
-#define IDC_BUTTON2                     1010
+#define BTN_EXEC_CMD                    1010
+#define BTN_OPEN_PORT                   1011
 
 // Next default values for new objects
 // 
@@ -23,7 +24,7 @@
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_NEXT_RESOURCE_VALUE        130
 #define _APS_NEXT_COMMAND_VALUE         32771
-#define _APS_NEXT_CONTROL_VALUE         1011
+#define _APS_NEXT_CONTROL_VALUE         1012
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif

+ 1 - 0
TCLTools/TCLTools/stdafx.cpp

@@ -6,3 +6,4 @@
 #include "stdafx.h"
 
 
+TCLCommand g_tclCommand;

+ 2 - 2
TCLTools/TCLTools/stdafx.h

@@ -43,9 +43,9 @@
 #include "utils.h"
 #include "Command.h"
 
+#include <Dbt.h>	// É豸ͷÎļþ;
 
-
-
+extern TCLCommand g_tclCommand;
 
 
 #ifdef _UNICODE