Procházet zdrojové kódy

修改命令为多个下拉框选择。

jianfeng1.wang před 2 roky
rodič
revize
f9166cc739

+ 29 - 20
TCLTools/TCLTools/TCLTools.rc

@@ -77,37 +77,46 @@ IDR_MAINFRAME           ICON                    "res\\TCLTools.ico"
 // Dialog
 //
 
-IDD_TCLTOOLS_DIALOG DIALOGEX 0, 0, 511, 323
+IDD_TCLTOOLS_DIALOG DIALOGEX 0, 0, 511, 345
 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 EXSTYLE WS_EX_APPWINDOW
-CAPTION "抄写工具"
+CAPTION "研发抄写测试工具"
 FONT 9, "MS Shell Dlg", 0, 0, 0x1
 BEGIN
     COMBOBOX        IDC_COMBO_PORTS,39,11,45,76,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
     LTEXT           "串口:",IDC_STATIC,15,13,22,8
     COMBOBOX        IDC_COMBO_CMDS,39,27,144,159,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "指令:",IDC_STATIC,15,29,22,8
-    EDITTEXT        IDC_EDIT_KEY,39,43,198,14,ES_AUTOHSCROLL | ES_READONLY
-    PUSHBUTTON      "打开key",BTN_OPEN_FILE,243,43,34,14
-    CONTROL         "HEX-BIN",IDC_CHECK_HB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,283,45,36,10
-    CONTROL         "BIN-HEX",IDC_CHECK_BH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,328,45,37,10
-    LTEXT           "文件:",IDC_STATIC,15,45,22,8
-    LTEXT           "状态:",IDC_STATIC,22,75,22,8
-    EDITTEXT        IDC_EDIT_INT,49,90,74,12,ES_AUTOHSCROLL | ES_READONLY
-    EDITTEXT        IDC_EDIT_STR,49,106,451,87,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL
-    LTEXT           "单字节:",IDC_STATIC,16,90,28,8
-    EDITTEXT        IDC_EDIT_HEX,49,197,451,115,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL
+    LTEXT           "设置:",IDC_STATIC,15,29,22,8
+    EDITTEXT        IDC_EDIT_KEY,39,96,198,14,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "打开key",BTN_OPEN_FILE,243,96,34,14
+    CONTROL         "HEX-BIN",IDC_CHECK_HB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,283,98,36,10
+    CONTROL         "BIN-HEX",IDC_CHECK_BH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,328,98,37,10
+    LTEXT           "文件:",IDC_STATIC,15,98,22,8
+    LTEXT           "状态:",IDC_STATIC,22,126,22,8
+    EDITTEXT        IDC_EDIT_INT,49,141,74,12,ES_AUTOHSCROLL | ES_READONLY
+    EDITTEXT        IDC_EDIT_STR,49,156,451,87,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL
+    LTEXT           "单字节:",IDC_STATIC,16,141,28,8
+    EDITTEXT        IDC_EDIT_HEX,49,245,451,89,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL
     PUSHBUTTON      "执行",BTN_EXEC_CMD,189,26,40,14
     PUSHBUTTON      "打开串口",BTN_OPEN_PORT,189,10,50,14
-    LTEXT           "发送:",IDC_STATIC,22,108,22,8
-    LTEXT           "返回:",IDC_STATIC,22,197,22,8
-    EDITTEXT        IDC_EDIT_STATUS,49,73,74,14,ES_AUTOHSCROLL | ES_READONLY
-    GROUPBOX        "结果",IDC_STATIC_RESULT,7,60,497,256
-    LTEXT           "错误:",IDC_STATIC,131,74,22,8
-    EDITTEXT        IDC_EDIT_ERROR,153,73,348,31,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL
+    LTEXT           "发送:",IDC_STATIC,22,158,22,8
+    LTEXT           "返回:",IDC_STATIC,20,247,22,8
+    EDITTEXT        IDC_EDIT_STATUS,49,124,74,14,ES_AUTOHSCROLL | ES_READONLY
+    GROUPBOX        "结果",IDC_STATIC_RESULT,7,112,497,227
+    LTEXT           "错误:",IDC_STATIC,131,125,22,8
+    EDITTEXT        IDC_EDIT_ERROR,153,124,348,31,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL
     PUSHBUTTON      "重新加载命令",BTN_RELOAD_CMD,242,10,50,14
     COMBOBOX        IDC_COMBO_BUADRATE,124,11,58,123,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     LTEXT           "波特率:",IDC_STATIC,96,13,28,8
+    COMBOBOX        IDC_COMBO_CMDS2,39,44,144,159,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    LTEXT           "读取:",IDC_STATIC,15,46,22,8
+    PUSHBUTTON      "执行",BTN_EXEC_CMD2,189,43,40,14
+    COMBOBOX        IDC_COMBO_CMDS3,39,61,144,159,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    LTEXT           "检验:",IDC_STATIC,15,63,22,8
+    PUSHBUTTON      "执行",BTN_EXEC_CMD3,189,60,40,14
+    COMBOBOX        IDC_COMBO_CMDS4,39,78,144,159,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    LTEXT           "写入:",IDC_STATIC,15,80,22,8
+    PUSHBUTTON      "执行",BTN_EXEC_CMD4,189,77,40,14
 END
 
 
@@ -163,7 +172,7 @@ BEGIN
         LEFTMARGIN, 7
         RIGHTMARGIN, 504
         TOPMARGIN, 7
-        BOTTOMMARGIN, 316
+        BOTTOMMARGIN, 338
     END
 END
 #endif    // APSTUDIO_INVOKED

+ 192 - 102
TCLTools/TCLTools/TCLToolsDlg.cpp

@@ -104,6 +104,9 @@ void CTCLToolsDlg::DoDataExchange(CDataExchange* pDX)
     CDialog::DoDataExchange(pDX);
     DDX_Control(pDX, IDC_COMBO_PORTS, m_cbSerial);
     DDX_Control(pDX, IDC_COMBO_CMDS, m_cbCommands);
+	DDX_Control(pDX, IDC_COMBO_CMDS2, m_cbCommands2);
+	DDX_Control(pDX, IDC_COMBO_CMDS3, m_cbCommands3);
+	DDX_Control(pDX, IDC_COMBO_CMDS4, m_cbCommands4);
     DDX_Control(pDX, IDC_COMBO_BUADRATE, m_cb_baudrate);
 }
 
@@ -118,6 +121,9 @@ BEGIN_MESSAGE_MAP(CTCLToolsDlg, CDialog)
     ON_BN_CLICKED(BTN_RELOAD_CMD, &CTCLToolsDlg::OnBnClickedReloadCmd)
 	ON_BN_CLICKED(IDC_CHECK_HB, &CTCLToolsDlg::OnBnClickedCheckHb)
 	ON_BN_CLICKED(IDC_CHECK_BH, &CTCLToolsDlg::OnBnClickedCheckBh)
+	ON_BN_CLICKED(BTN_EXEC_CMD2, &CTCLToolsDlg::OnBnClickedExecCmd2)
+	ON_BN_CLICKED(BTN_EXEC_CMD3, &CTCLToolsDlg::OnBnClickedExecCmd3)
+	ON_BN_CLICKED(BTN_EXEC_CMD4, &CTCLToolsDlg::OnBnClickedExecCmd4)
 END_MESSAGE_MAP()
 
 
@@ -155,9 +161,8 @@ BOOL CTCLToolsDlg::OnInitDialog()
     m_cb_baudrate.AddString(_T("38400"));
     m_cb_baudrate.AddString(_T("57600"));
     m_cb_baudrate.AddString(_T("115200"));
-    m_cb_baudrate.AddString(_T("460800"));
-    m_cb_baudrate.AddString(_T("921600"));
-    m_cb_baudrate.AddString(_T("230400"));
+    m_cb_baudrate.AddString(_T("128000"));
+    m_cb_baudrate.AddString(_T("256000"));
 
     m_cb_baudrate.SelectString(0, _T("115200"));
 
@@ -237,6 +242,21 @@ void CTCLToolsDlg::InitCommandCombobox()
     if ( nCurSel != CB_ERR )
         m_cbCommands.GetLBText(nCurSel, strText);
 
+	CString strText2;
+	nCurSel = m_cbCommands2.GetCurSel();
+	if ( nCurSel != CB_ERR )
+		m_cbCommands2.GetLBText(nCurSel, strText2);
+
+	CString strText3;
+	nCurSel = m_cbCommands3.GetCurSel();
+	if ( nCurSel != CB_ERR )
+		m_cbCommands3.GetLBText(nCurSel, strText3);
+
+	CString strText4;
+	nCurSel = m_cbCommands4.GetCurSel();
+	if ( nCurSel != CB_ERR )
+		m_cbCommands4.GetLBText(nCurSel, strText4);
+
     // 清空;
     m_cbCommands.ResetContent();
     std::vector<CommandParam> ExternalCMDParams = g_tclCommand.GetExternalCMDParams();
@@ -253,12 +273,31 @@ void CTCLToolsDlg::InitCommandCombobox()
 
     for ( std::vector<CommandParam>::iterator it = CMDParams.begin(); it != CMDParams.end(); it++ )
     {
-        m_cbCommands.AddString(it->name.c_str());
+		if ( it->nOption == CMDOPT_None )
+			m_cbCommands.AddString(it->name.c_str());
+		else if (it->nOption == CMDOPT_Read)
+			m_cbCommands2.AddString(it->name.c_str());
+		else if (it->nOption == CMDOPT_Check)
+			m_cbCommands3.AddString(it->name.c_str());
+		else if (it->nOption == CMDOPT_Write)
+			m_cbCommands4.AddString(it->name.c_str());
     }
 
     nCurSel = m_cbCommands.SelectString(0, strText);
     if ( nCurSel == CB_ERR )
         m_cbCommands.SetCurSel(0);
+
+	nCurSel = m_cbCommands2.SelectString(0, strText2);
+	if ( nCurSel == CB_ERR )
+		m_cbCommands2.SetCurSel(0);
+
+	nCurSel = m_cbCommands3.SelectString(0, strText3);
+	if ( nCurSel == CB_ERR )
+		m_cbCommands3.SetCurSel(0);
+
+	nCurSel = m_cbCommands4.SelectString(0, strText4);
+	if ( nCurSel == CB_ERR )
+		m_cbCommands4.SetCurSel(0);
 }
 
 void CTCLToolsDlg::OnBnClickedOpenPort()
@@ -332,104 +371,8 @@ void CTCLToolsDlg::OnBnClickedExecCmd()
     if ( nCurSel != CB_ERR ) {
         CString strCMDName;
         m_cbCommands.GetLBText(nCurSel, strCMDName);
-        SetDlgItemText(IDC_STATIC_RESULT, strCMDName + _T("->执行结果:"));
-        if ( g_tclCommand.IsOpen() ) {
-            bool bStatus = false;
-            CommandParam cmdpara;
-            g_tclCommand.GetCommandParams(strCMDName.GetString(), cmdpara);
-            if ( cmdpara.nOption == CMDOPT_Set )
-            {
-                // 需要选择文件;
-				GetDlgItemText(IDC_EDIT_KEY, strText);
-				if ( !PathFileExists(strText) )
-				{
-					if ( MessageBox("Set指令没有选择Key文件,是否继续?", "警告!", MB_ICONWARNING|MB_YESNO) == IDNO )
-						return;
-					bStatus = g_tclCommand.SendCommand(strCMDName.GetString(), cmdpara);
-				}	
-				else
-				{
-					std::string data;
-					if ( ReadKeyFromFile(strText.GetString(), data) )
-					{
-						// 默认读取内容;
-						BOOL bCheckHB = ((CButton*)GetDlgItem(IDC_CHECK_HB))->GetCheck();
-						BOOL bCheckBH = ((CButton*)GetDlgItem(IDC_CHECK_BH))->GetCheck();
-						if ( !bCheckBH && !bCheckHB )
-						{// 原始文件内容;
-							g_tclCommand.SendCommand(strCMDName.GetString(), cmdpara, (LPVOID)data.c_str(), data.size());
-						}
-						else if ( !bCheckBH && bCheckHB )
-						{// 将文件内容按十六进制转字节;
-							// 去除所有空格;
-							utils::trim(data);
-							std::string strBytes = utils::HexStringToBytes(data,2);
-							g_tclCommand.SendCommand(strCMDName.GetString(), cmdpara, (LPVOID)strBytes.c_str(), strBytes.size());
-						}
-						else if ( bCheckBH && !bCheckHB )
-						{// 将文件内容按字节转十六进制;
-
-						}
-					}
-				}
-			}
-            else
-            {
-                bStatus = g_tclCommand.SendCommand(strCMDName.GetString(), cmdpara);
-            }
-
-
-            // 设置状态;
-            if ( cmdpara._rtnStatus == 0x0A )
-            {
-                SetDlgItemText(IDC_EDIT_STATUS, "成功");
-            }
-            else if ( cmdpara._rtnStatus == 0x0E )
-            {
-                SetDlgItemText(IDC_EDIT_STATUS, "命令错误或不可执行");
-            }
-            else if ( cmdpara._rtnStatus == 0x0F )
-            {
-                SetDlgItemText(IDC_EDIT_STATUS, "链路层数据错误");
-            }
-            else
-            {
-                SetDlgItemText(IDC_EDIT_STATUS, "不可识别的错误");
-            }
-
-            // 设置原字符串显示;
-            SetDlgItemText(IDC_EDIT_ERROR, cmdpara._rtnError.c_str());
-
-            // 设置单字节值;
-            if ( cmdpara.nOption == CMDOPT_Get && cmdpara._rtnData.size() < 3)
-            {
-                if ( cmdpara._rtnData.size() == 1)
-                    SetDlgItemInt(IDC_EDIT_INT, (byte)cmdpara._rtnData[0]);
-                else if ( cmdpara._rtnData.size() == 2)
-                    SetDlgItemInt(IDC_EDIT_INT, (byte)cmdpara._rtnData[0] << 8 | (byte)cmdpara._rtnData[1]);
-            }
-
-#if 0
-            // 设置原字符串显示;
-            if ( cmdpara.nOption == CMDOPT_Get )
-            {
-                SetDlgItemText(IDC_EDIT_STR, cmdpara._rtnData.c_str());
-            }
-
-            // 设置16进制字符串显示;
-            if ( cmdpara.nOption == CMDOPT_Get )
-            {
-                SetDlgItemText(IDC_EDIT_HEX, utils::BytesToHexString((byte*)cmdpara._rtnData.c_str(), cmdpara._rtnData.size(), ' ').c_str());
-            }
-#else
-            SetDlgItemText(IDC_EDIT_STR, utils::BytesToHexString((byte*)cmdpara._cmdContext.c_str(), cmdpara._cmdContext.size(), ' ').c_str());
-            SetDlgItemText(IDC_EDIT_HEX, utils::BytesToHexString((byte*)cmdpara._rtnContext.c_str(), cmdpara._rtnContext.size(), ' ').c_str());
-#endif
-        }
-        else
-        {
-            MessageBox("串口未打开", "错误!", MB_ICONEXCLAMATION);
-        }
+        SetDlgItemText(IDC_STATIC_RESULT, strCMDName + _T("->执行结果:"));   
+		ExecuteCommand(strCMDName);
     }
 }
 
@@ -504,3 +447,150 @@ void CTCLToolsDlg::OnBnClickedCheckBh()
 		((CButton*)GetDlgItem(IDC_CHECK_HB))->SetCheck(FALSE);
 	}
 }
+
+void CTCLToolsDlg::OnBnClickedExecCmd2()
+{
+	// TODO: 在此添加控件通知处理程序代码
+	ClearEdit();
+	CString strText;
+	int nCurSel = m_cbCommands2.GetCurSel();
+	if ( nCurSel != CB_ERR ) {
+		CString strCMDName;
+		m_cbCommands2.GetLBText(nCurSel, strCMDName);
+		SetDlgItemText(IDC_STATIC_RESULT, strCMDName + _T("->执行结果:")); 
+		ExecuteCommand(strCMDName);
+	}
+}
+
+void CTCLToolsDlg::OnBnClickedExecCmd3()
+{
+	// TODO: 在此添加控件通知处理程序代码
+	ClearEdit();
+	CString strText;
+	int nCurSel = m_cbCommands3.GetCurSel();
+	if ( nCurSel != CB_ERR ) {
+		CString strCMDName;
+		m_cbCommands3.GetLBText(nCurSel, strCMDName);
+		SetDlgItemText(IDC_STATIC_RESULT, strCMDName + _T("->执行结果:"));    
+		ExecuteCommand(strCMDName);
+	}
+}
+
+void CTCLToolsDlg::OnBnClickedExecCmd4()
+{
+	// TODO: 在此添加控件通知处理程序代码
+	ClearEdit();
+	CString strText;
+	int nCurSel = m_cbCommands4.GetCurSel();
+	if ( nCurSel != CB_ERR ) {
+		CString strCMDName;
+		m_cbCommands4.GetLBText(nCurSel, strCMDName);
+		SetDlgItemText(IDC_STATIC_RESULT, strCMDName + _T("->执行结果:"));      
+		ExecuteCommand(strCMDName);
+	}
+}
+
+
+void CTCLToolsDlg::ExecuteCommand(CString strCMDName)
+{
+	if ( g_tclCommand.IsOpen() ) 
+	{
+		CString strText;
+		bool bStatus = false;
+		CommandParam cmdpara;
+		g_tclCommand.GetCommandParams(strCMDName.GetString(), cmdpara);
+		if ( cmdpara.nOption == CMDOPT_Write)
+		{
+			// 需要选择文件;
+			GetDlgItemText(IDC_EDIT_KEY, strText);
+			if ( !PathFileExists(strText) )
+			{
+				if ( MessageBox("Set指令没有选择Key文件,是否继续?", "警告!", MB_ICONWARNING|MB_YESNO) == IDNO )
+					return;
+				bStatus = g_tclCommand.SendCommand(strCMDName.GetString(), cmdpara);
+			}	
+			else
+			{
+				std::string data;
+				if ( ReadKeyFromFile(strText.GetString(), data) )
+				{
+					// 默认读取内容;
+					BOOL bCheckHB = ((CButton*)GetDlgItem(IDC_CHECK_HB))->GetCheck();
+					BOOL bCheckBH = ((CButton*)GetDlgItem(IDC_CHECK_BH))->GetCheck();
+					if ( !bCheckBH && !bCheckHB )
+					{// 原始文件内容;
+						g_tclCommand.SendCommand(strCMDName.GetString(), cmdpara, (LPVOID)data.c_str(), data.size());
+					}
+					else if ( !bCheckBH && bCheckHB )
+					{// 将文件内容按十六进制转字节;
+						// 去除所有空格;
+						utils::trim(data);
+						std::string strBytes = utils::HexStringToBytes(data,2);
+						g_tclCommand.SendCommand(strCMDName.GetString(), cmdpara, (LPVOID)strBytes.c_str(), strBytes.size());
+					}
+					else if ( bCheckBH && !bCheckHB )
+					{// 将文件内容按字节转十六进制;
+						std::string strBytes = utils::BytesToHexString((const unsigned char *)data.c_str(), data.size());
+						g_tclCommand.SendCommand(strCMDName.GetString(), cmdpara, (LPVOID)strBytes.c_str(), strBytes.size());
+					}
+				}
+			}
+		}
+		else
+		{
+			bStatus = g_tclCommand.SendCommand(strCMDName.GetString(), cmdpara);
+		}
+
+
+		// 设置状态;
+		if ( cmdpara._rtnStatus == 0x0A )
+		{
+			SetDlgItemText(IDC_EDIT_STATUS, "成功");
+		}
+		else if ( cmdpara._rtnStatus == 0x0E )
+		{
+			SetDlgItemText(IDC_EDIT_STATUS, "命令错误或不可执行");
+		}
+		else if ( cmdpara._rtnStatus == 0x0F )
+		{
+			SetDlgItemText(IDC_EDIT_STATUS, "链路层数据错误");
+		}
+		else
+		{
+			SetDlgItemText(IDC_EDIT_STATUS, "不可识别的错误");
+		}
+
+		// 设置原字符串显示;
+		SetDlgItemText(IDC_EDIT_ERROR, cmdpara._rtnError.c_str());
+
+		// 设置单字节值;
+		if ( cmdpara.nOption == CMDOPT_Read && cmdpara._rtnData.size() < 3)
+		{
+			if ( cmdpara._rtnData.size() == 1)
+				SetDlgItemInt(IDC_EDIT_INT, (byte)cmdpara._rtnData[0]);
+			else if ( cmdpara._rtnData.size() == 2)
+				SetDlgItemInt(IDC_EDIT_INT, (byte)cmdpara._rtnData[0] << 8 | (byte)cmdpara._rtnData[1]);
+		}
+
+#if 0
+		// 设置原字符串显示;
+		if ( cmdpara.nOption == CMDOPT_Read )
+		{
+			SetDlgItemText(IDC_EDIT_STR, cmdpara._rtnData.c_str());
+		}
+
+		// 设置16进制字符串显示;
+		if ( cmdpara.nOption == CMDOPT_Read )
+		{
+			SetDlgItemText(IDC_EDIT_HEX, utils::BytesToHexString((byte*)cmdpara._rtnData.c_str(), cmdpara._rtnData.size(), ' ').c_str());
+		}
+#else
+		SetDlgItemText(IDC_EDIT_STR, utils::BytesToHexString((byte*)cmdpara._cmdContext.c_str(), cmdpara._cmdContext.size(), ' ').c_str());
+		SetDlgItemText(IDC_EDIT_HEX, utils::BytesToHexString((byte*)cmdpara._rtnContext.c_str(), cmdpara._rtnContext.size(), ' ').c_str());
+#endif
+	}
+	else
+	{
+		MessageBox("串口未打开", "错误!", MB_ICONEXCLAMATION);
+	}
+}

+ 9 - 0
TCLTools/TCLTools/TCLToolsDlg.h

@@ -38,6 +38,9 @@ public:
     CComboBox m_cbSerial;
     afx_msg void OnBnClickedOpenPort();
     CComboBox m_cbCommands;
+	CComboBox m_cbCommands2;
+	CComboBox m_cbCommands3;
+	CComboBox m_cbCommands4;
     bool IsCommandExist(CommandParam &cmd, std::vector<CommandParam> &vtCMDParams);
     afx_msg void OnBnClickedExecCmd();
     void ClearEdit();
@@ -50,4 +53,10 @@ public:
     CComboBox m_cb_baudrate;
 	afx_msg void OnBnClickedCheckHb();
 	afx_msg void OnBnClickedCheckBh();
+	afx_msg void OnBnClickedExecCmd2();
+	afx_msg void OnBnClickedExecCmd3();
+	afx_msg void OnBnClickedExecCmd4();
+
+	// Ö´ÐÐÃüÁî;
+	void ExecuteCommand(CString strCMDName);
 };

+ 6 - 0
TCLTools/TCLTools/resource.h

@@ -25,6 +25,12 @@
 #define IDC_STATIC_RESULT               1015
 #define IDC_COMBO1                      1016
 #define IDC_COMBO_BUADRATE              1016
+#define IDC_COMBO_CMDS2                 1017
+#define BTN_EXEC_CMD2                   1018
+#define IDC_COMBO_CMDS3                 1019
+#define BTN_EXEC_CMD3                   1020
+#define IDC_COMBO_CMDS4                 1021
+#define BTN_EXEC_CMD4                   1022
 
 // Next default values for new objects
 //