| | |
| | | // |
| | | |
| | | #pragma once |
| | | |
| | | #include "PLCSignalListener.h" |
| | | #include "ProductResultStorage.h" |
| | | |
| | | #include <map> |
| | | #include <vector> |
| | | #include <numeric> |
| | | #include <algorithm> |
| | |
| | | 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(); |
| | |
| | | DECLARE_MESSAGE_MAP() |
| | | |
| | | private: |
| | | /** |
| | | * @brief 退出程序时的清理操作。 |
| | | * |
| | | * 此函数在程序退出前被调用,用于执行必要的资源释放与状态恢复, |
| | | * 包括断开设备连接、移除托盘图标等。 |
| | | * 最终销毁主窗口并退出应用。 |
| | | */ |
| | | void ExitApplication(); |
| | | |
| | | /** |
| | |
| | | * @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 高亮日志中所有匹配指定字符串的部分。 |
| | |
| | | * @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 表示加载成功,false 表示加载失败(如文件不存在)。 |
| | | */ |
| | | bool LoadConfig(const CString& strFile); |
| | | |
| | | /** |
| | | * @brief 将当前存储与分析参数保存到 ini 配置文件。 |
| | | * |
| | | * 把对话框类中的成员变量(存储设置、跳变检测、稳定区提取等参数) |
| | | * 序列化并写入到指定的 ini 文件中,以便下次启动时恢复。 |
| | | * |
| | | * @param strFile ini 文件路径。 |
| | | * @return true 表示保存成功,false 表示保存失败。 |
| | | */ |
| | | bool SaveConfig(const CString& strFile); |
| | | |
| | | /** |
| | | * @brief 设置或取消当前程序的开机自启动。 |
| | | * |
| | | * 该函数会在注册表 `HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run` |
| | | * 下写入或删除当前程序的路径,从而控制是否随 Windows 启动自动运行。 |
| | | * |
| | | * @param bEnable 是否启用自启动。true 表示设置开机自启,false 表示取消自启。 |
| | | * |
| | | * @return true 表示操作成功;false 表示操作失败(如注册表权限不足)。 |
| | | */ |
| | | bool SetAutoStart(bool bEnable); |
| | | |
| | | /** |
| | | * @brief 尝试连接到测量设备。 |
| | |
| | | * @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 从输入数据中提取一个固定长度的稳定区间。 |
| | |
| | | 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(); |
| | | |
| | | /** |
| | | * @brief 分析指定端口的存储数据,并提取两段玻璃数据与稳定区,计算偏移。 |
| | | * |
| | | * @param nOutNo 输出端口编号(1~4) |
| | | * @return float 成功返回计算出的偏移量,失败返回 -1.0f |
| | | * @return double 成功返回计算出的偏移量,失败返回 -1.0f |
| | | */ |
| | | float AnalyzeStoredData(int nOutNo); |
| | | double AnalyzeStoredData(int nOutNo); |
| | | |
| | | // === 系统状态与运行数据 === |
| | | |
| | |
| | | * @brief 标记程序是否通过托盘图标退出 |
| | | */ |
| | | BOOL m_bExitingFromTray; |
| | | |
| | | // === 自启动相关 === |
| | | |
| | | /** |
| | | * @brief 是否开机自启动 |
| | | */ |
| | | BOOL m_nAutoStart; |
| | | |
| | | // === PLC 信号监听器 === |
| | | |
| | | /** |
| | | * @brief PLC 信号监听器实例,用于处理 PLC 信号事件 |
| | | */ |
| | | CPLCSignalListener m_plcListener; |
| | | |
| | | // === 产品结果存储 === |
| | | |
| | | /** |
| | | * @brief 产品结果存储实例,用于保存和管理测量结果 |
| | | */ |
| | | CProductResultStorage m_resultStorage; |
| | | }; |