菜单状态切换
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user