From 63686244746925d43248ceaf8d9e31f50df68a72 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期一, 01 九月 2025 17:21:43 +0800
Subject: [PATCH] Merge branch 'clh'
---
SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h | 343 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 343 insertions(+), 0 deletions(-)
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h
new file mode 100644
index 0000000..593f7c9
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h
@@ -0,0 +1,343 @@
+锘�
+// SGMeasurementDlg.h: 澶存枃浠�
+//
+
+#pragma once
+
+#include "PLCSignalListener.h"
+
+#include <map>
+#include <vector>
+#include <numeric>
+#include <algorithm>
+
+// CSGMeasurementDlg 瀵硅瘽妗�
+class CSGMeasurementDlg : public CDialogEx
+{
+// 鏋勯��
+public:
+ CSGMeasurementDlg(CWnd* pParent = nullptr); // 鏍囧噯鏋勯�犲嚱鏁�
+
+// 瀵硅瘽妗嗘暟鎹�
+#ifdef AFX_DESIGN_TIME
+ enum { IDD = IDD_SGMEASUREMENT_DIALOG };
+#endif
+
+ protected:
+ virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 鏀寔
+
+// 瀹炵幇
+protected:
+ HICON m_hIcon;
+
+ // 鐢熸垚鐨勬秷鎭槧灏勫嚱鏁�
+ virtual BOOL OnInitDialog();
+ afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
+ afx_msg void OnPaint();
+ afx_msg HCURSOR OnQueryDragIcon();
+ afx_msg void OnTimer(UINT_PTR nIDEvent);
+ afx_msg void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct);
+ afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
+ afx_msg void OnClose();
+ afx_msg LRESULT OnTrayIconClick(WPARAM wParam, LPARAM lParam);
+ afx_msg void OnTrayRestore();
+ afx_msg void OnTrayExit();
+ afx_msg void OnBnClickedButtonConnect();
+ afx_msg void OnBnClickedButtonDisconnect();
+ afx_msg void OnBnClickedButtonReceiveFromCtrl();
+ afx_msg void OnBnClickedButtonSendToCtrl();
+ afx_msg void OnBnClickedButtonClearStore();
+ afx_msg void OnBnClickedButtonStartStore();
+ afx_msg void OnBnClickedButtonStopStore();
+ afx_msg void OnBnClickedButtonClearLog();
+ DECLARE_MESSAGE_MAP()
+
+private:
+ /**
+ * @brief 閫�鍑虹▼搴忔椂鐨勬竻鐞嗘搷浣溿��
+ *
+ * 姝ゅ嚱鏁板湪绋嬪簭閫�鍑哄墠琚皟鐢紝鐢ㄤ簬鎵ц蹇呰鐨勮祫婧愰噴鏀句笌鐘舵�佹仮澶嶏紝
+ * 鍖呮嫭鏂紑璁惧杩炴帴銆佺Щ闄ゆ墭鐩樺浘鏍囩瓑銆�
+ * 鏈�缁堥攢姣佷富绐楀彛骞堕��鍑哄簲鐢ㄣ��
+ */
+ void ExitApplication();
+
+ /**
+ * @brief 鏇存柊鐣岄潰鎺т欢鐨勫彲鐢ㄧ姸鎬併��
+ *
+ * 鏍规嵁璁惧杩炴帴鐘舵�� `bConnected` 鍜屽瓨鍌ㄧ姸鎬� `bStoring` 鍔ㄦ�佹帶鍒剁晫闈笂鎸夐挳銆�
+ * 缂栬緫妗嗐�佷笅鎷夋绛夋帶浠剁殑鍙敤/绂佺敤鐘舵�併��
+ *
+ * @param bConnected 璁惧褰撳墠鏄惁宸茶繛鎺ワ紝TRUE 琛ㄧず宸茶繛鎺ワ紝FALSE 琛ㄧず鏈繛鎺ャ��
+ * @param bStoring 褰撳墠鏄惁姝e湪杩涜鏁版嵁瀛樺偍锛孴RUE 琛ㄧず姝e湪瀛樺偍銆�
+ */
+ void UpdateControlStatus(BOOL bConnected, BOOL bStoring = FALSE);
+
+ /**
+ * @brief 鍚姩鎵归噺鏃ュ織杩藉姞锛屾殏鍋滆嚜鍔ㄦ粴鍔紝鎻愰珮鎬ц兘銆�
+ */
+ void AppendLogLineBatchBegin();
+
+ /**
+ * @brief 缁撴潫鎵归噺鏃ュ織杩藉姞锛屾仮澶嶈嚜鍔ㄦ粴鍔ㄥ苟鍒锋柊鏄剧ず銆�
+ */
+ void AppendLogLineBatchEnd();
+
+ /**
+ * @brief 闄愬埗瀵屾枃鏈涓殑鏈�澶ц鏁帮紝閬垮厤鏃ュ織杩囧瀵艰嚧鎬ц兘闂銆�
+ *
+ * @param maxLines 鏈�澶т繚鐣欑殑琛屾暟锛岄粯璁ゅ�间负 100銆�
+ */
+ void TrimRichEditLineLimit(int maxLines = 100);
+
+ /**
+ * @brief 鍚戞棩蹇楃獥鍙h拷鍔犱竴鏉″甫棰滆壊鏍峰紡鐨勬棩蹇楄銆�
+ *
+ * @param content 鏃ュ織鍐呭銆�
+ * @param color 瀛椾綋棰滆壊锛岄粯璁や负榛戣壊銆�
+ */
+ void AppendLogLineRichStyled(const CString& strContent, COLORREF color = RGB(0, 0, 0));
+
+ /**
+ * @brief 楂樹寒鏃ュ織涓墍鏈夊尮閰嶆寚瀹氬瓧绗︿覆鐨勯儴鍒嗐��
+ *
+ * @param strSearch 瑕佸尮閰嶇殑瀛楃涓层��
+ * @param clrHighlight 楂樹寒棰滆壊锛岄粯璁や负姗欒壊锛圧GB(255, 165, 0)锛夈��
+ */
+ void HighlightAllMatches(const CString& strSearch, COLORREF clrHighlight = RGB(255, 165, 0));
+
+ /**
+ * @brief 浠ユ牸寮忓寲鏂瑰紡杈撳嚭鎸囧畾閫氶亾鐨勬祴閲忔暟鎹牱鏈埌鏃ュ織銆�
+ *
+ * 姣忚杈撳嚭鍥哄畾鏁伴噺锛堝 7锛変釜娴偣鏁版嵁锛屽甫鏃堕棿鎴炽�侀�氶亾缂栧彿鏍囪瘑锛屼究浜庤皟璇曟煡鐪嬨��
+ *
+ * @param nOutNo 杈撳嚭绔彛缂栧彿锛岀敤浜庢爣璇嗘棩蹇楁潵婧愶紝濡� OUT1銆丱UT2 绛夈��
+ * @param vecBuffer 娴嬮噺鏁版嵁缂撳瓨锛屽皢琚�愯鎵撳嵃鍒版棩蹇椾腑銆�
+ */
+ void PrintSampleData(int nOutNo, const std::vector<float>& vecBuffer);
+
+ /**
+ * @brief 灏濊瘯杩炴帴鍒版祴閲忚澶囥��
+ *
+ * @return true 琛ㄧず杩炴帴鎴愬姛锛宖alse 琛ㄧず杩炴帴澶辫触銆�
+ */
+ bool ConnectToDevice();
+
+ /**
+ * @brief 鏂紑涓庢祴閲忚澶囩殑杩炴帴銆�
+ *
+ * @return true 琛ㄧず鏂紑鎴愬姛锛宖alse 琛ㄧず鏂紑澶辫触銆�
+ */
+ bool DisconnectFromDevice();
+
+ /**
+ * @brief 鍘熷湴娓呴櫎鏃犳晥鍊硷紙濡� -999.0f锛夊苟鏇存柊鏁版嵁銆�
+ *
+ * @param nOutNo 杈撳嚭閫氶亾缂栧彿锛岀敤浜庢棩蹇楄褰曘��
+ * @param vecData 杈撳叆杈撳嚭鏁版嵁瀹瑰櫒锛屽唴閮ㄥ皢琚氨鍦拌鍓��
+ * @param fInvalid 鏃犳晥鍊肩殑鍒ゆ柇闃堝�硷紝榛樿鍊间负 -999.0f銆�
+ */
+ void CleanInvalidValuesInPlace(int nOutNo, std::vector<float>& vecData, float fInvalid = -999.0f);
+
+ /**
+ * @brief 灏嗘湁鏁堟暟鎹垏鍓叉垚涓ゆ鐜荤拑鏁版嵁锛圙lass1 涓� Glass2锛夈��
+ *
+ * @param nOutNo 杈撳嚭閫氶亾缂栧彿锛岀敤浜庢棩蹇楄褰曘��
+ * @param validData 杈撳叆鐨勬湁鏁堟暟鎹紙搴斿凡瑁佸壀杈圭晫锛夈��
+ * @param vecGlass1 杈撳嚭绗竴娈电幓鐠冩暟鎹��
+ * @param vecGlass2 杈撳嚭绗簩娈电幓鐠冩暟鎹��
+ * @param fJumpThreshold 璺冲彉闃堝�硷紝鐢ㄤ簬妫�娴嬫暟鎹殑鏄庢樉鏂偣銆�
+ * @param nWindow 璺冲彉鍒ゆ柇鐨勫墠鍚庣獥鍙e搴︺��
+ * @param nValleyMargin valley 鐐逛箣鍚庡灏戜釜鐐逛綔涓哄疄闄呭垏鍓茬偣銆�
+ * @param nMinGlass1Count 鏈�灏戞湁鏁堢偣鏁伴檺鍒躲��
+ *
+ * @return true 琛ㄧず鍒囧壊鎴愬姛锛宖alse 琛ㄧず澶辫触锛堜緥濡傛暟鎹笉瓒虫垨鏃犳槑鏄捐烦鍙橈級銆�
+ */
+ bool SplitGlassSegments(int nOutNo, const std::vector<float>& validData,
+ std::vector<float>& vecGlass1, std::vector<float>& vecGlass2,
+ 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 浠庤緭鍏ユ暟鎹腑鎻愬彇涓�涓浐瀹氶暱搴︾殑绋冲畾鍖洪棿銆�
+ *
+ * @param nOutNo 杈撳嚭閫氶亾缂栧彿锛岀敤浜庢棩蹇楄褰曘��
+ * @param vecIn 杈撳叆鍘熷鏁版嵁銆�
+ * @param vecOut 杈撳嚭鎻愬彇鐨勭ǔ瀹氬尯鍩熸暟鎹��
+ * @param nFixedCount 绋冲畾鍖哄煙鐨勭偣鏁拌姹傦紙蹇呴』鍥哄畾鏁伴噺锛夈��
+ * @param fMaxDelta 鍏佽鐨勬渶澶ф尝鍔ㄨ寖鍥达紙鏈�澶у�� - 鏈�灏忓�硷級銆�
+ *
+ * @return true 琛ㄧず鎴愬姛鎵惧埌绋冲畾鍖洪棿锛宖alse 琛ㄧず鏈壘鍒般��
+ */
+ bool ExtractStableRegionFixed(int nOutNo,
+ const std::vector<float>& vecIn,
+ std::vector<float>& vecOut,
+ int nFixedCount = 5, float fMaxDelta = 0.05f);
+
+ /**
+ * @brief 璁$畻涓ょ墖鐜荤拑绋冲畾鍖哄煙鐨勫钩鍧囧�煎拰鍋忕Щ閲忋��
+ *
+ * @param vecGlass1 绗竴娈电ǔ瀹氭暟鎹��
+ * @param vecGlass2 绗簩娈电ǔ瀹氭暟鎹��
+ * @param fAvg1 杩斿洖绗竴娈电殑骞冲潎鍊笺��
+ * @param fAvg2 杩斿洖绗簩娈电殑骞冲潎鍊笺��
+ * @param fOffset 杩斿洖涓ゆ鐨勫亸绉诲�硷紙缁濆鍊煎樊锛夈��
+ *
+ * @return true 琛ㄧず璁$畻鎴愬姛锛宖alse 琛ㄧず杈撳叆鏃犳晥锛堝绌烘暟鎹級銆�
+ */
+ bool CalcGlassOffset(const std::vector<float>& vecGlass1,
+ 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
+ */
+ float AnalyzeStoredData(int nOutNo);
+
+ // === 绯荤粺鐘舵�佷笌杩愯鏁版嵁 ===
+
+ /**
+ * @brief 褰撳墠鏄惁宸茶繛鎺ュ埌浼犳劅鍣ㄦ帶鍒跺櫒
+ */
+ bool m_bConnected;
+
+ /**
+ * @brief 褰撳墠鏄惁姝e湪杩涜鏁版嵁瀛樺偍
+ */
+ bool m_bSaving;
+
+ /**
+ * @brief 鍥涗釜杈撳嚭绔彛鐨勫綋鍓嶈绠楃粨鏋滐紙濡傚亸绉婚噺鎴栧帤搴︾瓑锛�
+ */
+ double m_dOutValues[4];
+
+ // === 瀛樺偍璁剧疆鐩稿叧 ===
+
+ /**
+ * @brief 鏄惁浣跨敤纭欢瑙﹀彂淇″彿锛�0=鍚︼紝1=鏄級
+ */
+ int m_nUseTrigger;
+
+ /**
+ * @brief 姣忔閲囬泦鐨勬暟鎹偣鏁伴噺
+ */
+ int m_nSavePointCount;
+
+ /**
+ * @brief 杈撳嚭绔彛閫夋嫨涓嬫媺妗嗘帶浠讹紙鐢ㄤ簬璁剧疆閲囬泦绔彛锛�
+ */
+ CComboBox m_comboOutputPort;
+
+ // === 璺冲彉妫�娴嬩笌鐜荤拑璇嗗埆鍙傛暟锛圫plitGlassSegments 浣跨敤锛� ===
+
+ /**
+ * @brief 璺冲彉闃堝�硷紙渚嬪 0.2mm锛夛紝鐢ㄤ簬妫�娴嬩袱鐗囩幓鐠冧箣闂寸殑楂樺害璺冲彉
+ */
+ float m_fJumpThreshold;
+
+ /**
+ * @brief 璺冲彉妫�娴嬬獥鍙e崐瀹藉害锛堢敤浜庡樊鍒嗚绠楋級
+ */
+ int m_nJumpWindow;
+
+ /**
+ * @brief valley 鐐瑰彸绉荤殑鍋忕Щ閲忥紝鐢ㄤ簬鏈�缁堢‘瀹氬垎鍓茬偣
+ */
+ int m_nValleyMargin;
+
+ /**
+ * @brief 绗竴鐗囩幓鐠冩渶灏戞墍闇�鐨勬暟鎹偣鏁�
+ */
+ int m_nMinGlass1Count;
+
+ // === 绋冲畾鍖哄煙鎻愬彇鍙傛暟锛圗xtractStableRegionFixed 浣跨敤锛� ===
+
+ /**
+ * @brief 姣忔绋冲畾鍖哄煙瑕佹彁鍙栫殑鍥哄畾鏁版嵁鐐规暟
+ */
+ int m_nFixedCount;
+
+ /**
+ * @brief 鏈�澶у厑璁告尝鍔ㄨ寖鍥达紙渚嬪 0.05mm锛夛紝鍒ゆ柇鏄惁涓衡�滅ǔ瀹氣�濆尯鍩�
+ */
+ float m_fMaxDelta;
+
+ // === 鏃ュ織鎺т欢 ===
+
+ /**
+ * @brief 瀵屾枃鏈帶浠讹紝鐢ㄤ簬杈撳嚭甯﹂鑹茬殑鏃ュ織淇℃伅
+ */
+ CRichEditCtrl m_editLog;
+
+ // === 鎵樼洏鍥炬爣绠$悊 ===
+
+ /**
+ * @brief 鎵樼洏鍥炬爣鐩稿叧鏁版嵁缁撴瀯锛圢OTIFYICONDATA锛�
+ */
+ NOTIFYICONDATA m_trayIconData;
+
+ /**
+ * @brief 鎵樼洏鍥炬爣鐨勫敮涓� ID
+ */
+ UINT m_nTrayIconID;
+
+ /**
+ * @brief 鏍囪鎵樼洏鍥炬爣鏄惁宸叉垚鍔熷垱寤�
+ */
+ BOOL m_bTrayIconCreated;
+
+ /**
+ * @brief 鏍囪绋嬪簭鏄惁閫氳繃鎵樼洏鍥炬爣閫�鍑�
+ */
+ BOOL m_bExitingFromTray;
+
+ // === PLC 淇″彿鐩戝惉鍣� ===
+
+ /**
+ * @brief PLC 淇″彿鐩戝惉鍣ㄥ疄渚嬶紝鐢ㄤ簬澶勭悊 PLC 淇″彿浜嬩欢
+ */
+ CPLCSignalListener m_plcListener;
+};
--
Gitblit v1.9.3