修改色彩模式获取逻辑

This commit is contained in:
zqm
2025-10-28 17:17:05 +08:00
parent bfbe7696f3
commit df97526930
2 changed files with 133 additions and 124 deletions

View File

@@ -2219,6 +2219,11 @@ namespace JoyD.Windows.CS.Toprie
// 用于保护SDK操作的线程锁
private readonly object _sdkOperationLock = new object();
// 连续心跳失败计数,用于实现容错机制
private int _consecutiveHeartbeatFailures = 0;
// 连续心跳失败阈值,超过此值才认为连接真正断开
private const int HEARTBEAT_FAILURE_THRESHOLD = 3;
/// <summary>
/// 设置色彩模式
/// </summary>
@@ -2228,6 +2233,16 @@ namespace JoyD.Windows.CS.Toprie
{
// 添加线程锁保护防止多线程同时操作SDK
lock (_sdkOperationLock)
{
// 暂停心跳检测,避免设置过程中发生冲突
bool wasHeartbeatRunning = _heartbeatTimer != null;
if (wasHeartbeatRunning)
{
_heartbeatTimer.Change(Timeout.Infinite, Timeout.Infinite);
Log("设置色彩模式前暂停心跳检测");
}
try
{
// 最大重试次数
const int maxRetries = 3;
@@ -2289,34 +2304,6 @@ namespace JoyD.Windows.CS.Toprie
Thread.Sleep(200); // 给设备处理时间
return true;
// 注释掉需要再次读取验证的代码避免嵌套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)
{
@@ -2349,6 +2336,16 @@ namespace JoyD.Windows.CS.Toprie
return false;
}
finally
{
// 无论设置成功与否,都恢复心跳检测
if (wasHeartbeatRunning && _heartbeatTimer != null)
{
_heartbeatTimer.Change(_heartbeatInterval, _heartbeatInterval);
Log("设置色彩模式后恢复心跳检测");
}
}
}
}
/// <summary>
@@ -3817,7 +3814,9 @@ namespace JoyD.Windows.CS.Toprie
if (heartbeatResult > 0)
{
heartbeatSuccessful = true;
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] HeartbeatCallback() - 心跳检测成功 (第{i+1}次尝试)");
// 心跳成功,重置连续失败计数
_consecutiveHeartbeatFailures = 0;
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] HeartbeatCallback() - 心跳检测成功 (第{i+1}次尝试),连续失败计数已重置");
// 定期更新连接状态,表明连接正常
if (_connectionStatus != ConnectionStatus.Connected)
{
@@ -3850,8 +3849,15 @@ namespace JoyD.Windows.CS.Toprie
if (!heartbeatSuccessful)
{
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] HeartbeatCallback() - SDK心跳检测失败连接可能已断开");
UpdateConnectionStatus(ConnectionStatus.Disconnected, "SDK心跳检测失败连接已断开");
// 心跳失败,增加连续失败计数
_consecutiveHeartbeatFailures++;
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] HeartbeatCallback() - SDK心跳检测失败连续失败计数: {_consecutiveHeartbeatFailures}/{HEARTBEAT_FAILURE_THRESHOLD}");
// 只有当连续失败次数超过阈值时,才断开连接
if (_consecutiveHeartbeatFailures >= HEARTBEAT_FAILURE_THRESHOLD)
{
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] HeartbeatCallback() - 连续心跳失败次数超过阈值,确认连接已断开");
UpdateConnectionStatus(ConnectionStatus.Disconnected, "SDK心跳检测连续失败连接已断开");
// 如果启用了自动重连,开始重连
if (_isAutoReconnectEnabled)
@@ -3859,6 +3865,11 @@ namespace JoyD.Windows.CS.Toprie
StartAutoReconnect();
}
}
else
{
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] HeartbeatCallback() - 连续心跳失败次数未达阈值,暂时保留连接状态");
}
}
}
else
{

View File

@@ -31,7 +31,8 @@ namespace JoyD.Windows.CS.Toprie
{
SHUTTER_CORRECTION = 0,
SET_AUTO_SHUTTER = 1,
SET_COLOR_PLATE = 2,
// 根据热像仪SDK设置色彩模式的命令类型
SET_COLOR_PLATE = 2, // 保持为2因为热像仪SDK中也是使用SET_COLOR_PLATE命令
SET_MIRROR_VIDEO = 3,
SET_VIDEO_MODE = 4,
SET_AREA_POS = 5,
@@ -46,10 +47,10 @@ namespace JoyD.Windows.CS.Toprie
SET_EMAIL_SERVER = 14,
SET_TFTP_SERVER = 15,
SET_NETWORK_ETH = 16,
SET_FUSION_DISTANCE = 17,
SET_ENVIR_PARAM = 18,
SET_ALARM_PARAM = 19,
GET_PARAMETER = 20,
GET_PARAMETER = 17,
SET_FUSION_DISTANCE = 18,
SET_ENVIR_PARAM = 19,
SET_ALARM_PARAM = 20,
POWER_REBOOT = 21,
PARAM_RECOVER = 22,
UPDATER = 23,
@@ -273,14 +274,11 @@ namespace JoyD.Windows.CS.Toprie
try
{
// 从第5个字符开始解析数值 (+RET:值$)
int endIndex = response.IndexOf('$');
if (endIndex > 5)
{
string valueStr = response.Substring(5, endIndex - 5);
// 从第5个字符开始解析数值与热像仪SDK保持一致
// SDK使用atoi(buff + 5)直接解析,不检查$符号
string valueStr = response.Substring(5);
return int.Parse(valueStr);
}
}
catch (Exception ex)
{
Console.WriteLine($"解析响应失败: {ex.Message}");
@@ -637,9 +635,9 @@ namespace JoyD.Windows.CS.Toprie
{
Log($"[色彩模式设置] 验证成功,当前值确认为: {validatedValue}");
// 设置成功后重启图像接收以避免卡顿
Log($"[色彩模式设置] 设置成功后重启图像接收以避免卡顿");
SafeRestartImageReceiving();
// 移除图像接收重启逻辑,因为色彩模式不影响图像接收
// 仅保留短暂延迟确保设置生效
Log($"[色彩模式设置] 设置成功,不需要重启图像接收");
}
else
{