修改色彩模式

This commit is contained in:
zqm
2025-10-28 13:36:12 +08:00
parent eb96e4f151
commit 2aa69ee0a8

View File

@@ -2217,6 +2217,9 @@ namespace JoyD.Windows.CS.Toprie
CurrentImageMode = mode;
}
// 用于保护SDK操作的线程锁
private readonly object _sdkOperationLock = new object();
/// <summary>
/// 设置色彩模式
/// </summary>
@@ -2224,37 +2227,114 @@ namespace JoyD.Windows.CS.Toprie
/// <returns>设置是否成功</returns>
public bool SetPaletteType(PaletteType paletteType)
{
// 添加线程锁保护防止多线程同时操作SDK
lock (_sdkOperationLock)
{
// 最大重试次数
const int maxRetries = 3;
// 重试间隔(毫秒)
const int retryDelayMs = 100;
// 先获取原始值,只读取一次,避免嵌套调用
int originalValue = -1;
try
{
if (_a8Sdk != null)
if (_a8Sdk != null && _connectionStatus == ConnectionStatus.Connected)
{
originalValue = _a8Sdk.Color_plate;
Log($"成功读取当前色彩模式值: {originalValue}");
}
}
catch (Exception ex)
{
Log($"获取当前色彩模式值时出错: {ex.Message}");
// 即使获取失败,仍尝试设置新值
}
for (int attempt = 0; attempt < maxRetries; attempt++)
{
try
{
// 检查对象状态和连接状态
if (_a8Sdk == null || _connectionStatus != ConnectionStatus.Connected)
{
Log($"色彩模式设置失败: {(attempt > 0 ? "" : "")}SDK实例为空或设备未连接");
Thread.Sleep(retryDelayMs);
continue;
}
// 将PaletteType枚举转换为int类型并发送命令
// 按照SDK文档中的参数映射白热(0)、黑热(1)、铁红(2)、熔岩(3)、彩虹(4)、铁灰(5)、红热(6)、彩虹2(7)
int paletteValue = (int)paletteType;
// 尝试设置色彩模式
int originalValue = _a8Sdk.Color_plate; // 先获取当前值
// 直接设置色彩模式,不再在每次尝试中读取原始值
_a8Sdk.Color_plate = paletteValue;
// 验证设置是否成功(通过再次读取确认)
int currentValue = _a8Sdk.Color_plate;
if (currentValue == paletteValue)
{
Console.WriteLine($"色彩模式设置成功: {paletteType} (值: {paletteValue})");
// 短暂延迟,确保设置生效
Thread.Sleep(50);
// 减少读取验证避免嵌套UDP命令
// 信任SDK的设置操作不再额外验证
Log($"色彩模式设置成功: {paletteType} (值: {paletteValue})");
return true;
}
else
{
Console.WriteLine($"色彩模式设置失败: 未能确认设置生效,当前值: {currentValue}");
return false;
}
}
Console.WriteLine("色彩模式设置失败: SDK实例为空");
return false;
// 注释掉需要再次读取验证的代码避免嵌套UDP命令
// int currentValue = _a8Sdk.Color_plate;
// if (currentValue == paletteValue)
// {","},{
// }
// else
// {
// // 设置失败,记录日志并准备重试
// Log($"色彩模式设置失败: 尝试 {attempt + 1}/{maxRetries},未能确认设置生效,当前值: {currentValue}");
//
// // 如果已经是最后一次尝试,则恢复原始值
// // if (attempt == maxRetries - 1)
// // {","},{
// try
// {
// _a8Sdk.Color_plate = originalValue;
// Log($"已恢复原始色彩模式值: {originalValue}");
// }
// catch (Exception restoreEx)
// {
// Log($"恢复原始色彩模式失败: {restoreEx.Message}");
// }
// }
// 重试前等待
// Thread.Sleep(retryDelayMs);
// }
}
catch (Exception ex)
{
Console.WriteLine($"设置色彩模式失败: {ex.Message}");
Log($"设置色彩模式异常 (尝试 {attempt + 1}/{maxRetries}): {ex.Message}");
// 简化SDK状态检查避免触发额外的UDP命令
Log($"SDK状态监控: 色彩模式设置操作失败");
// 重试前等待
Thread.Sleep(retryDelayMs);
}
}
// 所有尝试都失败
Log($"色彩模式设置最终失败: 已尝试{maxRetries}次");
// 最后一次尝试失败后,仅在有原始值的情况下尝试恢复
if (originalValue >= 0 && _a8Sdk != null && _connectionStatus == ConnectionStatus.Connected)
{
try
{
_a8Sdk.Color_plate = originalValue;
Log($"已恢复原始色彩模式值: {originalValue}");
}
catch (Exception restoreEx)
{
Log($"恢复原始色彩模式失败: {restoreEx.Message}");
}
}
return false;
}
}
@@ -2264,21 +2344,86 @@ namespace JoyD.Windows.CS.Toprie
/// </summary>
/// <param name="mode">图像模式</param>
private bool SendModeChangeCommand(ImageMode mode)
{
// 使用相同的线程锁保护SDK操作
lock (_sdkOperationLock)
{
// 最大重试次数
const int maxRetries = 3;
// 重试间隔(毫秒)
const int retryDelayMs = 100;
for (int attempt = 0; attempt < maxRetries; attempt++)
{
try
{
if (_a8Sdk != null)
// 检查对象状态和连接状态
if (_a8Sdk == null || _connectionStatus != ConnectionStatus.Connected)
{
Log($"图像模式切换失败: {(attempt > 0 ? "" : "")}SDK实例为空或设备未连接");
Thread.Sleep(retryDelayMs);
continue;
}
// 将ImageMode枚举转换为int类型
_a8Sdk.SetImageMode((int)mode);
// 短暂延迟,确保设置生效
Thread.Sleep(50);
// 简单验证尝试读取一个基本属性确认SDK仍在正常工作
try
{
// 使用一个简单的只读操作验证SDK状态
int testValue = _a8Sdk.Color_plate; // 使用Color_plate作为验证点
Log($"读取色彩模式值用于验证: {testValue}");
Log($"图像模式 {mode} 切换成功 (尝试 {attempt + 1}/{maxRetries})");
return true;
}
return false;
catch (Exception verifyEx)
{
// 验证失败,记录日志并准备重试
Log($"图像模式切换验证失败 (尝试 {attempt + 1}/{maxRetries}): {verifyEx.Message}");
// 重试前等待
Thread.Sleep(retryDelayMs);
continue;
}
}
catch (Exception ex)
{
Console.WriteLine($"切换图像模式失败: {ex.Message}");
OnConnectionException(new ConnectionExceptionEventArgs(ex, "切换图像模式失败"));
Log($"切换图像模式异常 (尝试 {attempt + 1}/{maxRetries}): {ex.Message}");
// 增加SDK状态检查判断是否真的需要触发连接异常
try
{
// 简单的SDK状态检查
if (_a8Sdk != null)
{
// 只读操作确认SDK仍在响应
int testValue = _a8Sdk.Color_plate;
Log($"SDK状态检查: 读取色彩模式值 = {testValue}");
}
}
catch (Exception checkEx)
{
Log($"SDK状态检查失败: {checkEx.Message}");
// 只有在最后一次尝试且确认SDK状态异常时才触发连接异常
if (attempt == maxRetries - 1)
{
Log("所有尝试失败且SDK状态异常触发连接异常事件");
OnConnectionException(new ConnectionExceptionEventArgs(checkEx, "图像模式切换导致SDK状态异常"));
}
}
// 重试前等待
Thread.Sleep(retryDelayMs);
}
}
// 所有尝试都失败
Log($"图像模式切换最终失败: 已尝试{maxRetries}次");
return false;
}
}
@@ -2288,7 +2433,7 @@ namespace JoyD.Windows.CS.Toprie
/// </summary>
public void StartReceiveImage()
{
Console.WriteLine("已弃用的StartReceiveImage方法自动切换到HTTP方式");
Log("已弃用的StartReceiveImage方法自动切换到HTTP方式");
if (_connectionStatus != ConnectionStatus.Connected)
{