From e8a27bb203fe2aff70390a5eca002d7438da9b0f Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期三, 22 十月 2025 14:24:34 +0800
Subject: [PATCH] Merge branch 'clh' into liuyang

---
 SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp |  203 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 197 insertions(+), 6 deletions(-)

diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp
index ecdface..ae284a7 100644
--- a/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp
@@ -17,6 +17,7 @@
 #define DeviceID 0
 
 // 鎵樼洏鍥炬爣 ID 涓庢秷鎭畯
+#define ID_TRAY_OPEN_DIR	   2000				// 鎵撳紑鐩綍
 #define ID_TRAY_RESTORE		   2001				// 鎭㈠绐楀彛
 #define ID_TRAY_EXIT		   2002				// 閫�鍑虹▼搴�
 #define WM_TRAY_ICON_NOTIFY    (WM_USER + 1000) // 鎵樼洏鍥炬爣鍥炶皟娑堟伅 ID
@@ -94,6 +95,7 @@
 	, m_nTrayIconID(0)
 	, m_bTrayIconCreated(FALSE)
 	, m_bExitingFromTray(FALSE)
+	, m_nAutoStart(TRUE)
 {
 	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
 }
@@ -131,6 +133,9 @@
 	}
 
 	m_plcListener.Stop();
+
+	// 淇濆瓨閰嶇疆鏂囦欢
+	SaveConfig(GetConfigPath());
 
 	DestroyWindow();
 	CDialogEx::OnClose();
@@ -301,6 +306,149 @@
 			strLine.Empty();
 		}
 	}
+}
+
+CString CSGMeasurementDlg::GetAppDirectory()
+{
+	TCHAR szPath[MAX_PATH] = { 0 };
+	GetModuleFileName(NULL, szPath, MAX_PATH);
+
+	CString strPath = szPath;
+	int pos = strPath.ReverseFind('\\');
+	if (pos != -1) {
+		strPath = strPath.Left(pos + 1);
+	}
+
+	return strPath;
+}
+
+CString CSGMeasurementDlg::GetConfigPath()
+{
+	return GetAppDirectory() + _T("SGConfig.ini");
+}
+
+bool CSGMeasurementDlg::LoadConfig(const CString& strFile)
+{
+	CString strSection = _T("StorageConfig");
+	TCHAR buf[256];
+
+	GetPrivateProfileString(strSection, _T("UseTrigger"), _T("0"), buf, 256, strFile);
+	m_nUseTrigger = _ttoi(buf);
+
+	GetPrivateProfileString(strSection, _T("SavePointCount"), _T("100000"), buf, 256, strFile);
+	m_nSavePointCount = _ttoi(buf);
+
+	// 杈撳嚭绔彛
+	GetPrivateProfileString(strSection, _T("OutputPort"), _T("OUT1"), buf, 256, strFile);
+	{
+		int idx = m_comboOutputPort.FindStringExact(-1, buf);
+		if (idx != CB_ERR) {
+			m_comboOutputPort.SetCurSel(idx);
+		}
+		else {
+			m_comboOutputPort.SetCurSel(0);
+		}
+	}
+
+	// 璺冲彉妫�娴嬪弬鏁�
+	GetPrivateProfileString(strSection, _T("JumpThreshold"), _T("0.2"), buf, 256, strFile);
+	m_fJumpThreshold = static_cast<float>(_tstof(buf));
+
+	GetPrivateProfileString(strSection, _T("JumpWindow"), _T("3"), buf, 256, strFile);
+	m_nJumpWindow = _ttoi(buf);
+
+	GetPrivateProfileString(strSection, _T("ValleyMargin"), _T("0"), buf, 256, strFile);
+	m_nValleyMargin = _ttoi(buf);
+
+	GetPrivateProfileString(strSection, _T("MinGlass1Count"), _T("10"), buf, 256, strFile);
+	m_nMinGlass1Count = _ttoi(buf);
+
+	// 绋冲畾鍖哄煙鍙傛暟
+	GetPrivateProfileString(strSection, _T("FixedCount"), _T("5"), buf, 256, strFile);
+	m_nFixedCount = _ttoi(buf);
+
+	GetPrivateProfileString(strSection, _T("MaxDelta"), _T("0.05"), buf, 256, strFile);
+	m_fMaxDelta = static_cast<float>(_tstof(buf));
+
+	// 鑷惎鍔�
+	GetPrivateProfileString(strSection, _T("AutoStart"), _T("1"), buf, 256, strFile);
+	m_nAutoStart = _ttoi(buf);
+
+	return true;
+}
+
+bool CSGMeasurementDlg::SaveConfig(const CString& strFile)
+{
+	CString strSection = _T("StorageConfig");
+
+	WritePrivateProfileString(strSection, _T("UseTrigger"), std::to_wstring(m_nUseTrigger).c_str(), strFile);
+	WritePrivateProfileString(strSection, _T("SavePointCount"), std::to_wstring(m_nSavePointCount).c_str(), strFile);
+
+	// 杈撳嚭绔彛涓嬫媺妗�
+	CString strPort;
+	m_comboOutputPort.GetWindowText(strPort);
+	WritePrivateProfileString(strSection, _T("OutputPort"), strPort, strFile);
+
+	// 璺冲彉妫�娴�
+	WritePrivateProfileString(strSection, _T("JumpThreshold"), std::to_wstring(m_fJumpThreshold).c_str(), strFile);
+	WritePrivateProfileString(strSection, _T("JumpWindow"), std::to_wstring(m_nJumpWindow).c_str(), strFile);
+	WritePrivateProfileString(strSection, _T("ValleyMargin"), std::to_wstring(m_nValleyMargin).c_str(), strFile);
+	WritePrivateProfileString(strSection, _T("MinGlass1Count"), std::to_wstring(m_nMinGlass1Count).c_str(), strFile);
+
+	// 绋冲畾鍖�
+	WritePrivateProfileString(strSection, _T("FixedCount"), std::to_wstring(m_nFixedCount).c_str(), strFile);
+	WritePrivateProfileString(strSection, _T("MaxDelta"), std::to_wstring(m_fMaxDelta).c_str(), strFile);
+
+	// 鑷惎鍔�
+	WritePrivateProfileString(strSection, _T("AutoStart"), std::to_wstring(m_nAutoStart).c_str(), strFile);
+
+	return true;
+}
+
+bool CSGMeasurementDlg::SetAutoStart(bool bEnable)
+{
+	// 鑾峰彇褰撳墠绋嬪簭璺緞
+	TCHAR szPath[MAX_PATH] = { 0 };
+	GetModuleFileName(NULL, szPath, MAX_PATH);
+	CString strAppPath = szPath;
+
+	// 鑾峰彇搴旂敤绋嬪簭鍚嶇О
+	CString strAppName = ::PathFindFileName(strAppPath);
+	strAppName = strAppName.Left(strAppName.ReverseFind('.'));
+
+	HKEY hKey;
+	LONG lRet = RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_READ | KEY_WRITE, &hKey);
+
+	if (lRet != ERROR_SUCCESS) { 
+		return false;
+	}
+
+	DWORD dwType = 0;
+	TCHAR szValue[MAX_PATH] = { 0 };
+	DWORD dwSize = sizeof(szValue);
+	lRet = RegQueryValueEx(hKey, strAppName, 0, &dwType, (LPBYTE)szValue, &dwSize);
+
+	if (bEnable) {
+		if (lRet != ERROR_SUCCESS || _tcsicmp(szValue, strAppPath) != 0) {
+			// 璁剧疆鑷惎
+			lRet = RegSetValueEx(hKey, strAppName, 0, REG_SZ, (BYTE*)(LPCTSTR)strAppPath, (strAppPath.GetLength() + 1) * sizeof(TCHAR));
+		}
+		else {
+			lRet = ERROR_SUCCESS;
+		}
+	}
+	else {
+		if (lRet == ERROR_SUCCESS) {
+			// 鍙栨秷鑷惎
+			lRet = RegDeleteValue(hKey, strAppName);
+		}
+		else {
+			lRet = ERROR_SUCCESS;
+		}
+	}
+
+	RegCloseKey(hKey);
+	return (lRet == ERROR_SUCCESS);
 }
 
 bool CSGMeasurementDlg::ConnectToDevice()
@@ -815,6 +963,7 @@
 	ON_WM_DRAWITEM()
 	ON_WM_CLOSE()
 	ON_MESSAGE(WM_TRAY_ICON_NOTIFY, &CSGMeasurementDlg::OnTrayIconClick)
+	ON_COMMAND(ID_TRAY_OPEN_DIR, &CSGMeasurementDlg::OnTrayOpenDir)
 	ON_COMMAND(ID_TRAY_RESTORE, &CSGMeasurementDlg::OnTrayRestore)
 	ON_COMMAND(ID_TRAY_EXIT, &CSGMeasurementDlg::OnTrayExit)
 	ON_BN_CLICKED(IDC_BUTTON_CONNECT, &CSGMeasurementDlg::OnBnClickedButtonConnect)
@@ -942,6 +1091,27 @@
 	});
 	m_plcListener.Start();
 
+	// 鍔犺浇閰嶇疆鏂囦欢
+	if (LoadConfig(GetConfigPath())) {
+		AppendLogLineRichStyled(_T("閰嶇疆宸蹭粠 SGConfig.ini 鍔犺浇鎴愬姛"), LOG_COLOR_SUCCESS);
+	}
+	else {
+		AppendLogLineRichStyled(_T("閰嶇疆鍔犺浇澶辫触锛屼娇鐢ㄩ粯璁ゅ弬鏁�"), LOG_COLOR_WARNING);
+	}
+
+	// 璁剧疆鑷姩鍚姩
+	if (SetAutoStart(m_nAutoStart)) {
+		if (m_nAutoStart) {
+			AppendLogLineRichStyled(_T("宸插惎鐢ㄥ紑鏈鸿嚜鍚姩"), LOG_COLOR_SUCCESS);
+		}
+		else {
+			AppendLogLineRichStyled(_T("宸插彇娑堝紑鏈鸿嚜鍚姩"), LOG_COLOR_WARNING);
+		}
+	}
+	else {
+		AppendLogLineRichStyled(_T("璁剧疆寮�鏈鸿嚜鍚姩澶辫触锛岃妫�鏌ユ潈闄�"), LOG_COLOR_ERROR);
+	}
+
 	// 鍒濆鍖栨棩蹇楁
 	AppendLogLineRichStyled(_T("鍑嗗灏辩华..."), LOG_COLOR_SUCCESS);
 
@@ -1053,6 +1223,10 @@
 
 	// 鍥炬爣
 	HICON hIcon = nullptr;
+	if (id == ID_TRAY_OPEN_DIR) {
+		hIcon = AfxGetApp()->LoadIcon(IDI_ICON_OPEN_DIR);
+	}
+
 	if (id == ID_TRAY_RESTORE) {
 		hIcon = AfxGetApp()->LoadIcon(IDI_ICON_RESTORE);
 	}
@@ -1067,6 +1241,10 @@
 
 	// 鏂囨湰
 	CString str;
+	if (id == ID_TRAY_OPEN_DIR) {
+		str = _T("鎵撳紑鐩綍");
+	}
+
 	if (id == ID_TRAY_RESTORE) { 
 		str = _T("鎭㈠鐣岄潰");
 	}
@@ -1110,22 +1288,23 @@
 			// 鍙抽敭鐐瑰嚮寮瑰嚭鑿滃崟
 			CMenu menu;
 			menu.CreatePopupMenu();
+			menu.AppendMenu(MF_OWNERDRAW, ID_TRAY_OPEN_DIR, (LPCTSTR)ID_TRAY_OPEN_DIR);
 			menu.AppendMenu(MF_OWNERDRAW, ID_TRAY_RESTORE, (LPCTSTR)ID_TRAY_RESTORE);
 			menu.AppendMenu(MF_OWNERDRAW, ID_TRAY_EXIT, (LPCTSTR)ID_TRAY_EXIT);
-
-			// 鍔犺浇鍥炬爣
-			HICON hIconRestore = (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_RESTORE), IMAGE_ICON, 16, 16, LR_SHARED);
-			HICON hIconExit = (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_EXIT), IMAGE_ICON, 16, 16, LR_SHARED);
 
 			// 璁剧疆鍥炬爣鍒拌彍鍗曢」
 			MENUITEMINFO mii = { sizeof(MENUITEMINFO) };
 			mii.fMask = MIIM_BITMAP;
 
-			// 鎭㈠鑿滃崟椤瑰浘鏍�
+			// 鎵撳紑鐩綍鑿滃崟椤瑰浘鏍�
+			mii.hbmpItem = HBMMENU_CALLBACK;
+			menu.SetMenuItemInfo(ID_TRAY_OPEN_DIR, &mii);
+
+			// 鎭㈠绐楀彛鑿滃崟椤瑰浘鏍�
 			mii.hbmpItem = HBMMENU_CALLBACK;
 			menu.SetMenuItemInfo(ID_TRAY_RESTORE, &mii);
 
-			// 閫�鍑鸿彍鍗曢」鍥炬爣
+			// 閫�鍑虹▼搴忚彍鍗曢」鍥炬爣
 			mii.hbmpItem = HBMMENU_CALLBACK;
 			menu.SetMenuItemInfo(ID_TRAY_EXIT, &mii);
 
@@ -1139,6 +1318,18 @@
 	return 0;
 }
 
+void CSGMeasurementDlg::OnTrayOpenDir()
+{
+	CString strDir = GetAppDirectory();
+	if (PathFileExists(strDir)) {
+		ShellExecute(NULL, _T("open"), strDir, NULL, NULL, SW_SHOWDEFAULT);
+		AppendLogLineRichStyled(_T("宸叉墦寮�绋嬪簭鐩綍"), LOG_COLOR_SUCCESS);
+	}
+	else {
+		AppendLogLineRichStyled(_T("鐩綍涓嶅瓨鍦紝鏃犳硶鎵撳紑"), LOG_COLOR_ERROR);
+	}
+}
+
 void CSGMeasurementDlg::OnTrayRestore()
 {
 	ShowWindow(SW_SHOW);  	// 鎭㈠绐楀彛

--
Gitblit v1.9.3