菜单状态切换

This commit is contained in:
zqm
2025-10-29 12:55:14 +08:00
parent fc66e8df33
commit 8f7585fd0f
3 changed files with 186 additions and 18 deletions

View File

@@ -26,6 +26,9 @@ namespace JoyD.Windows.CS.Toprie
{ {
InitializeComponent(); InitializeComponent();
// 为右键菜单添加Opening事件用于在菜单显示前更新色彩模式的选中状态
this.contextMenuStrip1.Opening += ContextMenuStrip1_Opening;
// 将设计模式状态传递给DeviceManager // 将设计模式状态传递给DeviceManager
DeviceManager.IsDesignMode = DesignMode; DeviceManager.IsDesignMode = DesignMode;
@@ -672,20 +675,30 @@ namespace JoyD.Windows.CS.Toprie
// 清除错误信息 // 清除错误信息
ShowError(string.Empty); ShowError(string.Empty);
// 确保设置为热图模式 // 仅在首次连接时设置为热图模式,重连时保留之前的模式
try if (!_isReceivingImage) // 首次连接时_isReceivingImage为false
{ {
_deviceManager.SetImageMode(ImageMode.Thermal); try
Console.WriteLine("连接成功后确认热图模式"); {
_deviceManager.SetImageMode(ImageMode.Thermal);
Console.WriteLine("首次连接,设置热图模式");
}
catch (Exception ex)
{
Console.WriteLine($"设置热图模式失败: {ex.Message}");
}
} }
catch (Exception ex) else
{ {
Console.WriteLine($"连接成功后设置热图模式失败: {ex.Message}"); Console.WriteLine("重连成功,保留当前图像模式");
} }
// 注意色彩模式同步现在在DeviceManager内部的连接成功处理中自动完成
// 无需在此处重复调用
// 开始接收图像包含在try-catch中 // 开始接收图像包含在try-catch中
if (!_isReceivingImage) if (!_isReceivingImage)
{ {
StartReceiveImage(); StartReceiveImage();
} }
break; break;
@@ -956,6 +969,73 @@ namespace JoyD.Windows.CS.Toprie
} }
} }
/// <summary>
/// 右键菜单显示前的事件处理方法
/// 用于更新色彩模式菜单项的选中状态
/// </summary>
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 #region
/// <summary> /// <summary>

View File

@@ -161,6 +161,8 @@ namespace JoyD.Windows.CS.Toprie
private bool _isDisposed = false; private bool _isDisposed = false;
// 图像模式 // 图像模式
private ImageMode _currentImageMode = ImageMode.Thermal; private ImageMode _currentImageMode = ImageMode.Thermal;
// 当前色彩模式
private PaletteType _currentPaletteType = PaletteType.WhiteHot;
// 自动重连是否启用 // 自动重连是否启用
private bool _autoReconnectEnabled = true; private bool _autoReconnectEnabled = true;
// 自动重连定时器 // 自动重连定时器
@@ -2235,6 +2237,53 @@ namespace JoyD.Windows.CS.Toprie
// 连续心跳失败阈值,超过此值才认为连接真正断开 // 连续心跳失败阈值,超过此值才认为连接真正断开
private const int HEARTBEAT_FAILURE_THRESHOLD = 3; private const int HEARTBEAT_FAILURE_THRESHOLD = 3;
/// <summary>
/// 获取或设置当前色彩模式
/// </summary>
public PaletteType CurrentPaletteType
{
get { return _currentPaletteType; }
set { _currentPaletteType = value; }
}
/// <summary>
/// 从设备同步色彩模式到内部状态
/// </summary>
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; // 重新抛出异常,让调用方知道发生了错误
}
}
/// <summary> /// <summary>
/// 设置色彩模式 /// 设置色彩模式
/// </summary> /// </summary>
@@ -2306,15 +2355,21 @@ namespace JoyD.Windows.CS.Toprie
{ {
// 直接调用SetColorPlate方法设置色彩模式 // 直接调用SetColorPlate方法设置色彩模式
setSuccess = _a8Sdk.SetColorPlate(paletteValue); setSuccess = _a8Sdk.SetColorPlate(paletteValue);
Log($"SetColorPlate返回结果: {setSuccess}");
// 短暂延迟,确保设置生效
Thread.Sleep(50);
// 再次读取当前值进行验证不依赖SetColorPlate的返回值
int currentValue = _a8Sdk.GetColorPlate();
Log($"验证读取到的当前色彩模式值: {currentValue},目标值: {paletteValue}");
setSuccess = (currentValue == paletteValue);
// 如果设置成功,更新内部状态
if (setSuccess) if (setSuccess)
{ {
// 短暂延迟,确保设置生效 _currentPaletteType = paletteType;
Thread.Sleep(50); Log($"内部状态_currentPaletteType已更新为: {paletteType}");
// 再次读取当前值进行验证
int currentValue = _a8Sdk.GetColorPlate();
setSuccess = (currentValue == paletteValue);
} }
} }
catch (Exception ex) catch (Exception ex)
@@ -2326,6 +2381,7 @@ namespace JoyD.Windows.CS.Toprie
if (setSuccess) if (setSuccess)
{ {
Log($"色彩模式设置成功: {paletteType} (值: {paletteValue})"); Log($"色彩模式设置成功: {paletteType} (值: {paletteValue})");
_currentPaletteType = paletteType;
return true; return true;
} }
else else
@@ -3032,6 +3088,16 @@ namespace JoyD.Windows.CS.Toprie
StartConnectionCheck(); StartConnectionCheck();
UpdateConnectionStatus(ConnectionStatus.Connected, "设备连接成功"); UpdateConnectionStatus(ConnectionStatus.Connected, "设备连接成功");
// 连接成功后同步色彩模式
try
{
SyncPaletteTypeFromDevice();
}
catch (Exception ex)
{
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] 同步色彩模式失败: {ex.Message}");
};
} }
else if (!token.IsCancellationRequested) else if (!token.IsCancellationRequested)
{ {
@@ -3544,6 +3610,16 @@ namespace JoyD.Windows.CS.Toprie
} }
UpdateConnectionStatus(ConnectionStatus.Connected, $"设备 {deviceIp} 连接成功"); UpdateConnectionStatus(ConnectionStatus.Connected, $"设备 {deviceIp} 连接成功");
// 重连成功后同步色彩模式
try
{
SyncPaletteTypeFromDevice();
}
catch (Exception ex)
{
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] 重连后同步色彩模式失败: {ex.Message}");
};
StartConnectionCheck(); StartConnectionCheck();
connectionSuccessful = true; connectionSuccessful = true;
} }

View File

@@ -251,14 +251,26 @@ namespace JoyD.Windows.CS.Toprie
// 解析响应数据 // 解析响应数据
private int ParseResponseValue(string response) private int ParseResponseValue(string response)
{ {
if (string.IsNullOrEmpty(response) || !response.StartsWith("+RET:")) if (string.IsNullOrEmpty(response))
return -1; // 返回-1表示解析失败 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 try
{ {
// 从第5个字符开始解析数值与热像仪SDK保持一致 // 从第5个字符开始解析数值与热像仪SDK保持一致
// SDK使用atoi(buff + 5)直接解析,不检查$符号 string valueStr = response.Substring(startIndex);
string valueStr = response.Substring(5); // 移除结尾可能存在的$符号
if (valueStr.EndsWith("$"))
valueStr = valueStr.Substring(0, valueStr.Length - 1);
return int.Parse(valueStr); return int.Parse(valueStr);
} }
catch (Exception ex) catch (Exception ex)