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>
@@ -49,6 +54,13 @@
   DECLARE_MESSAGE_MAP()
private:
   /**
    * @brief 退出程序时的清理操作。
    *
    * 此函数在程序退出前被调用,用于执行必要的资源释放与状态恢复,
    * 包括断开设备连接、移除托盘图标等。
    * 最终销毁主窗口并退出应用。
    */
   void ExitApplication();
   /**
@@ -85,7 +97,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 高亮日志中所有匹配指定字符串的部分。
@@ -138,14 +150,25 @@
    * @param fJumpThreshold 跳变阈值,用于检测数据的明显断点。
    * @param nWindow 跳变判断的前后窗口宽度。
    * @param nValleyMargin valley 点之后多少个点作为实际切割点。
    * @param nMinGlass1Count 第一段最少有效点数限制。
    * @param nMinGlass1Count 最少有效点数限制。
    *
    * @return true 表示切割成功,false 表示失败(例如数据不足或无明显跳变)。
    */
   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 输出被保留的主要分组数据(最多的那组)。
    *
    * @return true 表示成功过滤出主分组,false 表示所有数据都被过滤或为空。
    */
   bool FilterDominantGroup(int nOutNo, const std::vector<float>& vecInput, std::vector<float>& vecOutput);
   /**
    * @brief 从输入数据中提取一个固定长度的稳定区间。
@@ -178,10 +201,33 @@
      const std::vector<float>& vecGlass2,
      float& fAvg1, float& fAvg2, float& fOffset);
   /**
    * @brief 初始化设备端的数据存储缓冲区。
    *
    * 调用底层接口清除当前存储区内容,为新一轮的数据采集做准备。
    * 必须在设备连接成功且未进行数据存储时调用。
    *
    * @return true 表示初始化成功;false 表示失败(可能是设备未连接或调用接口错误)。
    */
   bool InitDataStorage();
   /**
    * @brief 启动设备端数据采集和存储。
    *
    * 调用此函数后设备开始采集并缓存数据。
    * 通常配合触发模式进行采集。
    *
    * @return true 表示启动成功;false 表示启动失败。
    */
   bool StartDataStorage();
   /**
    * @brief 停止数据采集并从设备获取当前存储数据。
    *
    * 调用后设备停止采集,并尝试读取指定端口的数据,供后续分析处理。
    *
    * @return true 表示停止并读取数据成功;false 表示失败(如设备未响应或数据无效)。
    */
   bool StopDataStorage();
   /**
@@ -288,4 +334,18 @@
    * @brief 标记程序是否通过托盘图标退出
    */
   BOOL m_bExitingFromTray;
   // === PLC 信号监听器 ===
   /**
    * @brief PLC 信号监听器实例,用于处理 PLC 信号事件
    */
   CPLCSignalListener m_plcListener;
   // === 产品结果存储 ===
   /**
    * @brief 产品结果存储实例,用于保存和管理测量结果
    */
   CProductResultStorage m_resultStorage;
};