From da7df269302f1719aedbedaac0a13ba8fb91a7da Mon Sep 17 00:00:00 2001 From: zqm Date: Wed, 5 Nov 2025 15:15:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=97=A5=E5=BF=97=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=9C=A8=E5=85=B3=E9=94=AE?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E8=AE=B0=E5=BD=95=E8=AE=BE=E5=A4=87=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=92=8C=E6=B8=A9=E5=BA=A6=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CS/Framework4.0/Toprie/Toprie/Camera.cs | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs index b459f7c..dca38eb 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs @@ -44,6 +44,9 @@ namespace JoyD.Windows.CS.Toprie private bool _showAverageTemperature = false; // 是否显示平均温度 private bool _showMinTemperature = false; // 是否显示最低温度 + // 日志保存状态标志 + private bool _saveLogEnabled = false; // 是否启用日志保存 + // 用于保护_lastImage的线程锁 private readonly object _lastImageLock = new object(); @@ -536,16 +539,20 @@ namespace JoyD.Windows.CS.Toprie if (!_isReceivingImage && _deviceManager.ConnectionStatus == ConnectionStatus.Connected) { Console.WriteLine("Camera开始使用HTTP方式接收图像"); + // 记录日志 + WriteLog("开始使用HTTP方式接收图像"); // 直接调用HTTP方式的图像接收 _deviceManager.StartImageReceiving(); // 不再需要温度数据实时通知机制,移除相关代码 _isReceivingImage = true; + WriteLog("图像接收已启动"); } } catch (Exception ex) { ShowError($"开始接收图像失败: {ex.Message}"); + WriteLog($"开始接收图像失败: {ex.Message}"); } } @@ -961,13 +968,18 @@ namespace JoyD.Windows.CS.Toprie if (_deviceManager == null) { Console.WriteLine("设备管理器未初始化"); + WriteLog("设备管理器未初始化"); return; } + // 记录连接状态变化 + WriteLog($"连接状态变化: {e.Status} {(!string.IsNullOrEmpty(e.DeviceInfo) ? "- " + e.DeviceInfo : "")}"); + switch (e.Status) { case ConnectionStatus.Connected: Console.WriteLine("设备已连接"); + WriteLog("设备已连接成功"); // 仅在首次连接时设置为热图模式,重连时保留之前的模式 if (!_isReceivingImage) // 首次连接时_isReceivingImage为false @@ -976,15 +988,18 @@ namespace JoyD.Windows.CS.Toprie { _deviceManager.SetImageMode(ImageMode.Infrared); Console.WriteLine("首次连接,设置热图模式"); + WriteLog("首次连接,设置热图模式"); } catch (Exception ex) { Console.WriteLine($"设置热图模式失败: {ex.Message}"); + WriteLog($"设置热图模式失败: {ex.Message}"); } } else { Console.WriteLine("重连成功,保留当前图像模式"); + WriteLog("重连成功,保留当前图像模式"); } // 注意:色彩模式同步现在在DeviceManager内部的连接成功处理中自动完成 @@ -1000,6 +1015,7 @@ namespace JoyD.Windows.CS.Toprie catch (Exception ex) { Console.WriteLine($"开始接收图像失败: {ex.Message}"); + WriteLog($"开始接收图像失败: {ex.Message}"); } } @@ -1011,6 +1027,7 @@ namespace JoyD.Windows.CS.Toprie break; case ConnectionStatus.Disconnected: Console.WriteLine("设备已断开连接"); + WriteLog("设备连接已断开"); // 停止接收图像(添加空检查和异常处理) if (_isReceivingImage) @@ -1023,6 +1040,7 @@ namespace JoyD.Windows.CS.Toprie catch (Exception ex) { Console.WriteLine($"停止接收图像失败: {ex.Message}"); + WriteLog($"停止接收图像失败: {ex.Message}"); _isReceivingImage = false; // 确保状态更新 } } @@ -1038,18 +1056,22 @@ namespace JoyD.Windows.CS.Toprie if (!string.IsNullOrEmpty(e.DeviceInfo)) { ShowError(e.DeviceInfo); + WriteLog($"断开原因: {e.DeviceInfo}"); } else { ShowError("设备连接已断开"); + WriteLog("设备连接已断开"); } break; case ConnectionStatus.Connecting: Console.WriteLine($"正在连接设备...{(!string.IsNullOrEmpty(e.DeviceInfo) ? " " + e.DeviceInfo : "")}"); + WriteLog($"正在连接设备...{(!string.IsNullOrEmpty(e.DeviceInfo) ? " " + e.DeviceInfo : "")}"); ShowError(string.Empty); // 清除之前的错误信息 break; case ConnectionStatus.Reconnecting: Console.WriteLine($"正在重新连接设备...{(!string.IsNullOrEmpty(e.DeviceInfo) ? " " + e.DeviceInfo : "")}"); + WriteLog($"正在重新连接设备...{(!string.IsNullOrEmpty(e.DeviceInfo) ? " " + e.DeviceInfo : "")}"); ShowError(string.Empty); // 清除之前的错误信息 // 按照README中要求的修改流程第2点和第6点:连接状态变化时,只在非暂停状态下调用更新Info @@ -1880,6 +1902,63 @@ namespace JoyD.Windows.CS.Toprie UpdateRealTimeInfoOnUI(); } } + + /// + /// 保存日志菜单项点击事件处理 + /// + private void SaveLogToolStripMenuItem_Click(object sender, EventArgs e) + { + // 更新日志保存状态标志 + _saveLogEnabled = saveLogToolStripMenuItem.Checked; + + // 可以在这里添加日志记录的初始化或清理逻辑 + if (_saveLogEnabled) + { + // 日志启用时的初始化 + WriteLog("日志保存功能已启用"); + } + else + { + // 日志禁用时的清理(如果需要) + WriteLog("日志保存功能已禁用"); + } + } + + /// + /// 写入日志信息到文件 + /// 只有在_saveLogEnabled为true时才会保存 + /// + /// 日志消息 + private void WriteLog(string logMessage) + { + // 只有当日志保存功能启用时才执行写入 + if (_saveLogEnabled) + { + try + { + // 确保项目路径存在 + if (!string.IsNullOrEmpty(_projectPath) && Directory.Exists(_projectPath)) + { + // 创建Logs目录(如果不存在) + string logDir = Path.Combine(_projectPath, "Logs"); + Directory.CreateDirectory(logDir); + + // 生成日志文件名(按日期) + string logFileName = $"Log_{DateTime.Now:yyyyMMdd}.txt"; + string logFilePath = Path.Combine(logDir, logFileName); + + // 写入日志(带时间戳) + string logEntry = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] {logMessage}"; + File.AppendAllText(logFilePath, logEntry + Environment.NewLine); + } + } + catch (Exception ex) + { + // 记录日志写入失败的异常(但不抛出,以免影响主程序) + Console.WriteLine($"写入日志失败: {ex.Message}"); + } + } + } /// /// 更新实时信息显示 @@ -1945,6 +2024,13 @@ namespace JoyD.Windows.CS.Toprie { temperatureTexts.Add($"最高: {temperatureData.MaxTemperature:F2} °C"); } + + // 记录温度数据日志 + if (temperatureTexts.Count > 0) + { + string mode = isGlobalTemperatureMode ? "全局温度" : "区域温度"; + WriteLog($"{mode}数据 - 平均: {temperatureData.AverageTemperature:F2} °C, 最低: {temperatureData.MinTemperature:F2} °C, 最高: {temperatureData.MaxTemperature:F2} °C"); + } // 如果没有要显示的温度文本,直接返回 if (temperatureTexts.Count == 0)