菜单状态切换
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
/// <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 色彩模式切换方法
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -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;
|
||||
|
||||
/// <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>
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user