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.h |  134 ++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 128 insertions(+), 6 deletions(-)

diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h
index 96e570b..aa76701 100644
--- a/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h
@@ -3,6 +3,11 @@
 //
 
 #pragma once
+
+#include "PLCSignalListener.h"
+#include "ProductResultStorage.h"
+
+#include <map>
 #include <vector>
 #include <numeric>
 #include <algorithm>
@@ -36,6 +41,7 @@
 	afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
 	afx_msg void OnClose();
 	afx_msg LRESULT OnTrayIconClick(WPARAM wParam, LPARAM lParam);
+	afx_msg void OnTrayOpenDir();
 	afx_msg void OnTrayRestore();
 	afx_msg void OnTrayExit();
 	afx_msg void OnBnClickedButtonConnect();
@@ -49,6 +55,13 @@
 	DECLARE_MESSAGE_MAP()
 
 private:
+	/**
+	 * @brief 閫�鍑虹▼搴忔椂鐨勬竻鐞嗘搷浣溿��
+	 *
+	 * 姝ゅ嚱鏁板湪绋嬪簭閫�鍑哄墠琚皟鐢紝鐢ㄤ簬鎵ц蹇呰鐨勮祫婧愰噴鏀句笌鐘舵�佹仮澶嶏紝
+	 * 鍖呮嫭鏂紑璁惧杩炴帴銆佺Щ闄ゆ墭鐩樺浘鏍囩瓑銆�
+	 * 鏈�缁堥攢姣佷富绐楀彛骞堕��鍑哄簲鐢ㄣ��
+	 */
 	void ExitApplication();
 
 	/**
@@ -85,7 +98,7 @@
 	 * @param content 鏃ュ織鍐呭銆�
 	 * @param color 瀛椾綋棰滆壊锛岄粯璁や负榛戣壊銆�
 	 */
-	void AppendLogLineRichStyled(const CString& content, COLORREF color = RGB(0, 0, 0));
+	void AppendLogLineRichStyled(const CString& strContent, COLORREF color = RGB(0, 0, 0));
 
 	/**
 	 * @brief 楂樹寒鏃ュ織涓墍鏈夊尮閰嶆寚瀹氬瓧绗︿覆鐨勯儴鍒嗐��
@@ -104,6 +117,60 @@
 	 * @param vecBuffer 娴嬮噺鏁版嵁缂撳瓨锛屽皢琚�愯鎵撳嵃鍒版棩蹇椾腑銆�
 	 */
 	void PrintSampleData(int nOutNo, const std::vector<float>& vecBuffer);
+
+	/**
+	 * @brief 鑾峰彇褰撳墠搴旂敤绋嬪簭鎵�鍦ㄧ殑鐩綍璺緞銆�
+	 *
+	 * 閫氳繃 GetModuleFileName 鑾峰彇褰撳墠鍙墽琛屾枃浠剁殑瀹屾暣璺緞锛�
+	 * 骞舵埅鍙栨帀鏂囦欢鍚嶉儴鍒嗭紝杩斿洖鐩綍璺緞锛屾湯灏捐嚜甯﹀弽鏂滄潬銆�
+	 *
+	 * @return CString 搴旂敤绋嬪簭鎵�鍦ㄧ洰褰曪紝渚嬪 "C:\\Program Files\\SGMeasurement\\"
+	 */
+	CString GetAppDirectory();
+
+	/**
+	 * @brief 鑾峰彇閰嶇疆鏂囦欢鐨勫畬鏁磋矾寰勩��
+	 *
+	 * 閰嶇疆鏂囦欢鍚嶅浐瀹氫负 "config.ini"锛屼綅浜庡簲鐢ㄧ▼搴忕洰褰曚笅銆�
+	 *
+	 * @return CString 閰嶇疆鏂囦欢瀹屾暣璺緞锛屼緥濡� "C:\\Program Files\\SGMeasurement\\config.ini"
+	 */
+	CString GetConfigPath();
+
+	/**
+	 * @brief 浠� ini 閰嶇疆鏂囦欢鍔犺浇瀛樺偍涓庡垎鏋愬弬鏁般��
+	 *
+	 * 璇诲彇鎸囧畾 ini 鏂囦欢涓殑鍙傛暟鍊硷紝骞舵洿鏂板璇濇绫讳腑鐨勬垚鍛樺彉閲忥紝
+	 * 鍖呮嫭瀛樺偍璁剧疆锛堣Е鍙戞柟寮忋�侀噰鏍风偣鏁帮級銆佽烦鍙樻娴嬪弬鏁般�佺ǔ瀹氬尯鎻愬彇鍙傛暟绛夈��
+	 * 鑻ユ枃浠朵腑缂哄皯鏌愪簺瀛楁锛屽皢浣跨敤榛樿鍊笺��
+	 *
+	 * @param strFile ini 鏂囦欢璺緞銆�
+	 * @return true 琛ㄧず鍔犺浇鎴愬姛锛宖alse 琛ㄧず鍔犺浇澶辫触锛堝鏂囦欢涓嶅瓨鍦級銆�
+	 */
+	bool LoadConfig(const CString& strFile);
+
+	/**
+	 * @brief 灏嗗綋鍓嶅瓨鍌ㄤ笌鍒嗘瀽鍙傛暟淇濆瓨鍒� ini 閰嶇疆鏂囦欢銆�
+	 *
+	 * 鎶婂璇濇绫讳腑鐨勬垚鍛樺彉閲忥紙瀛樺偍璁剧疆銆佽烦鍙樻娴嬨�佺ǔ瀹氬尯鎻愬彇绛夊弬鏁帮級
+	 * 搴忓垪鍖栧苟鍐欏叆鍒版寚瀹氱殑 ini 鏂囦欢涓紝浠ヤ究涓嬫鍚姩鏃舵仮澶嶃��
+	 *
+	 * @param strFile ini 鏂囦欢璺緞銆�
+	 * @return true 琛ㄧず淇濆瓨鎴愬姛锛宖alse 琛ㄧず淇濆瓨澶辫触銆�
+	 */
+	bool SaveConfig(const CString& strFile);
+
+	/**
+	 * @brief 璁剧疆鎴栧彇娑堝綋鍓嶇▼搴忕殑寮�鏈鸿嚜鍚姩銆�
+	 *
+	 * 璇ュ嚱鏁颁細鍦ㄦ敞鍐岃〃 `HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run`
+	 * 涓嬪啓鍏ユ垨鍒犻櫎褰撳墠绋嬪簭鐨勮矾寰勶紝浠庤�屾帶鍒舵槸鍚﹂殢 Windows 鍚姩鑷姩杩愯銆�
+	 *
+	 * @param bEnable 鏄惁鍚敤鑷惎鍔ㄣ�倀rue 琛ㄧず璁剧疆寮�鏈鸿嚜鍚紝false 琛ㄧず鍙栨秷鑷惎銆�
+	 *
+	 * @return true 琛ㄧず鎿嶄綔鎴愬姛锛沠alse 琛ㄧず鎿嶄綔澶辫触锛堝娉ㄥ唽琛ㄦ潈闄愪笉瓒筹級銆�
+	 */
+	bool SetAutoStart(bool bEnable);
 
 	/**
 	 * @brief 灏濊瘯杩炴帴鍒版祴閲忚澶囥��
@@ -138,14 +205,25 @@
 	 * @param fJumpThreshold 璺冲彉闃堝�硷紝鐢ㄤ簬妫�娴嬫暟鎹殑鏄庢樉鏂偣銆�
 	 * @param nWindow 璺冲彉鍒ゆ柇鐨勫墠鍚庣獥鍙e搴︺��
 	 * @param nValleyMargin valley 鐐逛箣鍚庡灏戜釜鐐逛綔涓哄疄闄呭垏鍓茬偣銆�
-	 * @param nMinGlass1Count 绗竴娈垫渶灏戞湁鏁堢偣鏁伴檺鍒躲��
+	 * @param nMinGlass1Count 鏈�灏戞湁鏁堢偣鏁伴檺鍒躲��
 	 *
 	 * @return true 琛ㄧず鍒囧壊鎴愬姛锛宖alse 琛ㄧず澶辫触锛堜緥濡傛暟鎹笉瓒虫垨鏃犳槑鏄捐烦鍙橈級銆�
 	 */
 	bool SplitGlassSegments(int nOutNo, const std::vector<float>& validData,
 		std::vector<float>& vecGlass1, std::vector<float>& vecGlass2,
-		float fJumpThreshold = 1.0f, int nWindow = 3, int nValleyMargin = 0,
-		int nMinGlass1Count = 10);
+		float fJumpThreshold = 0.2f, int nWindow = 3, int nValleyMargin = 0,
+		int nMinGlassCount = 10);
+
+	/**
+	 * @brief 瀵规暟鎹寜鏁存暟閮ㄥ垎杩涜鍒嗙粍锛屼繚鐣欐暟鎹噺鏈�澶氱殑涓�缁勶紙鎺掗櫎寮傚父/骞叉壈锛夈��
+	 *
+	 * @param nOutNo 杈撳嚭閫氶亾缂栧彿锛岀敤浜庢棩蹇楄褰曘��
+	 * @param vecInput 鍘熷娴偣鏁版嵁锛堝凡瑁佸壀鏃犳晥鍊硷級銆�
+	 * @param vecOutput 杈撳嚭琚繚鐣欑殑涓昏鍒嗙粍鏁版嵁锛堟渶澶氱殑閭g粍锛夈��
+	 *
+	 * @return true 琛ㄧず鎴愬姛杩囨护鍑轰富鍒嗙粍锛宖alse 琛ㄧず鎵�鏈夋暟鎹兘琚繃婊ゆ垨涓虹┖銆�
+	 */
+	bool FilterDominantGroup(int nOutNo, const std::vector<float>& vecInput, std::vector<float>& vecOutput);
 
 	/**
 	 * @brief 浠庤緭鍏ユ暟鎹腑鎻愬彇涓�涓浐瀹氶暱搴︾殑绋冲畾鍖洪棿銆�
@@ -178,19 +256,42 @@
 		const std::vector<float>& vecGlass2,
 		float& fAvg1, float& fAvg2, float& fOffset);
 
+	/**
+	 * @brief 鍒濆鍖栬澶囩鐨勬暟鎹瓨鍌ㄧ紦鍐插尯銆�
+	 *
+	 * 璋冪敤搴曞眰鎺ュ彛娓呴櫎褰撳墠瀛樺偍鍖哄唴瀹癸紝涓烘柊涓�杞殑鏁版嵁閲囬泦鍋氬噯澶囥��
+	 * 蹇呴』鍦ㄨ澶囪繛鎺ユ垚鍔熶笖鏈繘琛屾暟鎹瓨鍌ㄦ椂璋冪敤銆�
+	 *
+	 * @return true 琛ㄧず鍒濆鍖栨垚鍔燂紱false 琛ㄧず澶辫触锛堝彲鑳芥槸璁惧鏈繛鎺ユ垨璋冪敤鎺ュ彛閿欒锛夈��
+	 */
 	bool InitDataStorage();
 
+	/**
+	 * @brief 鍚姩璁惧绔暟鎹噰闆嗗拰瀛樺偍銆�
+	 *
+	 * 璋冪敤姝ゅ嚱鏁板悗璁惧寮�濮嬮噰闆嗗苟缂撳瓨鏁版嵁銆�
+	 * 閫氬父閰嶅悎瑙﹀彂妯″紡杩涜閲囬泦銆�
+	 *
+	 * @return true 琛ㄧず鍚姩鎴愬姛锛沠alse 琛ㄧず鍚姩澶辫触銆�
+	 */
 	bool StartDataStorage();
 
+	/**
+	 * @brief 鍋滄鏁版嵁閲囬泦骞朵粠璁惧鑾峰彇褰撳墠瀛樺偍鏁版嵁銆�
+	 *
+	 * 璋冪敤鍚庤澶囧仠姝㈤噰闆嗭紝骞跺皾璇曡鍙栨寚瀹氱鍙g殑鏁版嵁锛屼緵鍚庣画鍒嗘瀽澶勭悊銆�
+	 *
+	 * @return true 琛ㄧず鍋滄骞惰鍙栨暟鎹垚鍔燂紱false 琛ㄧず澶辫触锛堝璁惧鏈搷搴旀垨鏁版嵁鏃犳晥锛夈��
+	 */
 	bool StopDataStorage();
 
 	/**
 	 * @brief 鍒嗘瀽鎸囧畾绔彛鐨勫瓨鍌ㄦ暟鎹紝骞舵彁鍙栦袱娈电幓鐠冩暟鎹笌绋冲畾鍖猴紝璁$畻鍋忕Щ銆�
 	 *
 	 * @param nOutNo     杈撳嚭绔彛缂栧彿锛�1~4锛�
-	 * @return float     鎴愬姛杩斿洖璁$畻鍑虹殑鍋忕Щ閲忥紝澶辫触杩斿洖 -1.0f
+	 * @return double     鎴愬姛杩斿洖璁$畻鍑虹殑鍋忕Щ閲忥紝澶辫触杩斿洖 -1.0f
 	 */
-	float AnalyzeStoredData(int nOutNo);
+	double AnalyzeStoredData(int nOutNo);
 
 	// === 绯荤粺鐘舵�佷笌杩愯鏁版嵁 ===
 
@@ -288,4 +389,25 @@
 	 * @brief 鏍囪绋嬪簭鏄惁閫氳繃鎵樼洏鍥炬爣閫�鍑�
 	 */
 	BOOL m_bExitingFromTray;
+
+	// === 鑷惎鍔ㄧ浉鍏� ===
+
+	/**
+	 * @brief 鏄惁寮�鏈鸿嚜鍚姩
+	 */
+	BOOL m_nAutoStart;
+
+	// === PLC 淇″彿鐩戝惉鍣� ===
+
+	/**
+	 * @brief PLC 淇″彿鐩戝惉鍣ㄥ疄渚嬶紝鐢ㄤ簬澶勭悊 PLC 淇″彿浜嬩欢
+	 */
+	CPLCSignalListener m_plcListener;
+
+	// === 浜у搧缁撴灉瀛樺偍 ===
+
+	/**
+	 * @brief 浜у搧缁撴灉瀛樺偍瀹炰緥锛岀敤浜庝繚瀛樺拰绠$悊娴嬮噺缁撴灉
+	 */
+	CProductResultStorage m_resultStorage;
 };

--
Gitblit v1.9.3