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)