diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs index a58df52..5fa9365 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs @@ -26,6 +26,9 @@ namespace JoyD.Windows.CS.Toprie { InitializeComponent(); + // 为右键菜单添加Opening事件,用于在菜单显示前更新色彩模式的选中状态 + this.contextMenuStrip1.Opening += ContextMenuStrip1_Opening; + // 将设计模式状态传递给DeviceManager DeviceManager.IsDesignMode = DesignMode; @@ -672,20 +675,30 @@ namespace JoyD.Windows.CS.Toprie // 清除错误信息 ShowError(string.Empty); - // 确保设置为热图模式 - try - { - _deviceManager.SetImageMode(ImageMode.Thermal); - Console.WriteLine("连接成功后确认热图模式"); + // 仅在首次连接时设置为热图模式,重连时保留之前的模式 + if (!_isReceivingImage) // 首次连接时_isReceivingImage为false + { + try + { + _deviceManager.SetImageMode(ImageMode.Thermal); + Console.WriteLine("首次连接,设置热图模式"); + } + catch (Exception ex) + { + Console.WriteLine($"设置热图模式失败: {ex.Message}"); + } } - catch (Exception ex) - { - Console.WriteLine($"连接成功后设置热图模式失败: {ex.Message}"); + else + { + Console.WriteLine("重连成功,保留当前图像模式"); } + // 注意:色彩模式同步现在在DeviceManager内部的连接成功处理中自动完成 + // 无需在此处重复调用 + // 开始接收图像(包含在try-catch中) if (!_isReceivingImage) - { + { StartReceiveImage(); } break; @@ -956,6 +969,73 @@ namespace JoyD.Windows.CS.Toprie } } + /// + /// 右键菜单显示前的事件处理方法 + /// 用于更新色彩模式菜单项的选中状态 + /// + private void ContextMenuStrip1_Opening(object sender, System.ComponentModel.CancelEventArgs e) + { + try + { + // 首先清除所有菜单项的选中状态 + whiteHotToolStripMenuItem.Checked = false; + blackHotToolStripMenuItem.Checked = false; + ironRedToolStripMenuItem.Checked = false; + lavaToolStripMenuItem.Checked = false; + rainbowToolStripMenuItem.Checked = false; + ironGrayToolStripMenuItem.Checked = false; + redHotToolStripMenuItem.Checked = false; + rainbow2ToolStripMenuItem.Checked = false; + + // 尝试获取当前色彩模式并更新对应菜单项的选中状态 + if (_deviceManager != null && _deviceManager.ConnectionStatus == ConnectionStatus.Connected) + { + try + { + // 获取当前色彩模式 + PaletteType currentPalette = _deviceManager.CurrentPaletteType; + + // 根据当前色彩模式设置对应菜单项的选中状态 + switch (currentPalette) + { + case PaletteType.WhiteHot: + whiteHotToolStripMenuItem.Checked = true; + break; + case PaletteType.BlackHot: + blackHotToolStripMenuItem.Checked = true; + break; + case PaletteType.IronRed: + ironRedToolStripMenuItem.Checked = true; + break; + case PaletteType.Lava: + lavaToolStripMenuItem.Checked = true; + break; + case PaletteType.Rainbow: + rainbowToolStripMenuItem.Checked = true; + break; + case PaletteType.IronGray: + ironGrayToolStripMenuItem.Checked = true; + break; + case PaletteType.RedHot: + redHotToolStripMenuItem.Checked = true; + break; + case PaletteType.Rainbow2: + rainbow2ToolStripMenuItem.Checked = true; + break; + } + } + catch (Exception ex) + { + Console.WriteLine("获取当前色彩模式失败: " + ex.Message); + } + } + } + catch (Exception ex) + { + Console.WriteLine("更新右键菜单选中状态失败: " + ex.Message); + } + } + #region 色彩模式切换方法 /// diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs index 79a1d10..3bbbb09 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs @@ -161,6 +161,8 @@ namespace JoyD.Windows.CS.Toprie private bool _isDisposed = false; // 图像模式 private ImageMode _currentImageMode = ImageMode.Thermal; + // 当前色彩模式 + private PaletteType _currentPaletteType = PaletteType.WhiteHot; // 自动重连是否启用 private bool _autoReconnectEnabled = true; // 自动重连定时器 @@ -2235,6 +2237,53 @@ namespace JoyD.Windows.CS.Toprie // 连续心跳失败阈值,超过此值才认为连接真正断开 private const int HEARTBEAT_FAILURE_THRESHOLD = 3; + /// + /// 获取或设置当前色彩模式 + /// + public PaletteType CurrentPaletteType + { + get { return _currentPaletteType; } + set { _currentPaletteType = value; } + } + + /// + /// 从设备同步色彩模式到内部状态 + /// + public void SyncPaletteTypeFromDevice() + { + try + { + // 确保设备已连接且SDK实例有效 + if (_connectionStatus == ConnectionStatus.Connected && _a8Sdk != null) + { + // 获取当前设备的色彩模式值 + int currentValue = _a8Sdk.GetColorPlate(); + Log($"从设备读取的色彩模式值: {currentValue}"); + + // 尝试将读取到的值转换为PaletteType枚举并更新内部状态 + if (Enum.IsDefined(typeof(PaletteType), currentValue)) + { + PaletteType actualPalette = (PaletteType)currentValue; + _currentPaletteType = actualPalette; + Log($"已更新内部状态为设备实际值: {actualPalette}"); + } + else + { + Log($"警告:设备返回的色彩模式值 {currentValue} 不在枚举定义范围内,使用默认值"); + } + } + else + { + Log($"同步色彩模式失败:设备未连接或SDK未初始化"); + } + } + catch (Exception ex) + { + Log($"同步色彩模式时发生异常: {ex.Message}"); + throw; // 重新抛出异常,让调用方知道发生了错误 + } + } + /// /// 设置色彩模式 /// @@ -2306,15 +2355,21 @@ namespace JoyD.Windows.CS.Toprie { // 直接调用SetColorPlate方法设置色彩模式 setSuccess = _a8Sdk.SetColorPlate(paletteValue); + Log($"SetColorPlate返回结果: {setSuccess}"); + // 短暂延迟,确保设置生效 + Thread.Sleep(50); + + // 再次读取当前值进行验证,不依赖SetColorPlate的返回值 + int currentValue = _a8Sdk.GetColorPlate(); + Log($"验证读取到的当前色彩模式值: {currentValue},目标值: {paletteValue}"); + setSuccess = (currentValue == paletteValue); + + // 如果设置成功,更新内部状态 if (setSuccess) { - // 短暂延迟,确保设置生效 - Thread.Sleep(50); - - // 再次读取当前值进行验证 - int currentValue = _a8Sdk.GetColorPlate(); - setSuccess = (currentValue == paletteValue); + _currentPaletteType = paletteType; + Log($"内部状态_currentPaletteType已更新为: {paletteType}"); } } catch (Exception ex) @@ -2326,6 +2381,7 @@ namespace JoyD.Windows.CS.Toprie if (setSuccess) { Log($"色彩模式设置成功: {paletteType} (值: {paletteValue})"); + _currentPaletteType = paletteType; return true; } else @@ -3032,6 +3088,16 @@ namespace JoyD.Windows.CS.Toprie StartConnectionCheck(); UpdateConnectionStatus(ConnectionStatus.Connected, "设备连接成功"); + + // 连接成功后同步色彩模式 + try + { + SyncPaletteTypeFromDevice(); + } + catch (Exception ex) + { + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] 同步色彩模式失败: {ex.Message}"); + }; } else if (!token.IsCancellationRequested) { @@ -3544,6 +3610,16 @@ namespace JoyD.Windows.CS.Toprie } UpdateConnectionStatus(ConnectionStatus.Connected, $"设备 {deviceIp} 连接成功"); + + // 重连成功后同步色彩模式 + try + { + SyncPaletteTypeFromDevice(); + } + catch (Exception ex) + { + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] 重连后同步色彩模式失败: {ex.Message}"); + }; StartConnectionCheck(); connectionSuccessful = true; } diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/V8.cs b/Windows/CS/Framework4.0/Toprie/Toprie/V8.cs index b89d72d..076db3b 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/V8.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/V8.cs @@ -251,14 +251,26 @@ namespace JoyD.Windows.CS.Toprie // 解析响应数据 private int ParseResponseValue(string response) { - if (string.IsNullOrEmpty(response) || !response.StartsWith("+RET:")) + if (string.IsNullOrEmpty(response)) return -1; // 返回-1表示解析失败 + // 支持两种响应格式: +RET: 和 +RSP: + int startIndex = -1; + if (response.StartsWith("+RET:")) + startIndex = 5; + else if (response.StartsWith("+RSP:")) + startIndex = 5; + + if (startIndex == -1) + return -1; + try { // 从第5个字符开始解析数值,与热像仪SDK保持一致 - // SDK使用atoi(buff + 5)直接解析,不检查$符号 - string valueStr = response.Substring(5); + string valueStr = response.Substring(startIndex); + // 移除结尾可能存在的$符号 + if (valueStr.EndsWith("$")) + valueStr = valueStr.Substring(0, valueStr.Length - 1); return int.Parse(valueStr); } catch (Exception ex)