diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/A8SDK.cs b/Windows/CS/Framework4.0/Toprie/Toprie/A8SDK.cs
index 2981f6a..9096ad8 100644
--- a/Windows/CS/Framework4.0/Toprie/Toprie/A8SDK.cs
+++ b/Windows/CS/Framework4.0/Toprie/Toprie/A8SDK.cs
@@ -226,13 +226,32 @@ namespace JoyD.Windows.CS.Toprie
{
get
{
- return v8Instance.Color_plate;
+ return GetColorPlate();
}
set
{
- v8Instance.Color_plate = value;
+ SetColorPlate(value);
}
}
+
+ ///
+ /// 获取当前色彩模式
+ ///
+ /// 当前色彩模式的值
+ public int GetColorPlate()
+ {
+ return v8Instance.GetColorPlate();
+ }
+
+ ///
+ /// 设置色彩模式
+ ///
+ /// 要设置的色彩模式值
+ /// 设置是否成功
+ public bool SetColorPlate(int value)
+ {
+ return v8Instance.SetColorPlate(value);
+ }
// 镜像模式属性
public int Mirror_mode
diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs
index 8a0449f..86a7137 100644
--- a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs
+++ b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs
@@ -2290,20 +2290,60 @@ namespace JoyD.Windows.CS.Toprie
// 已在循环外部计算paletteValue,避免重复计算
// 直接设置色彩模式,不再在每次尝试中读取原始值
- _a8Sdk.Color_plate = paletteValue;
+ bool setSuccess = false;
+ try
+ {
+ // 直接调用SetColorPlate方法设置色彩模式
+ setSuccess = _a8Sdk.SetColorPlate(paletteValue);
+
+ if (setSuccess)
+ {
+ // 短暂延迟,确保设置生效
+ Thread.Sleep(50);
+
+ // 再次读取当前值进行验证
+ int currentValue = _a8Sdk.GetColorPlate();
+ setSuccess = (currentValue == paletteValue);
+ }
+ }
+ catch (Exception ex)
+ {
+ Log($"色彩模式设置异常: {ex.Message}");
+ }
- // 短暂延迟,确保设置生效
- Thread.Sleep(50);
-
- // 减少读取验证,避免嵌套UDP命令
- // 信任SDK的设置操作,不再额外验证
- Log($"色彩模式设置成功: {paletteType} (值: {paletteValue})");
+ // 基于实际结果记录日志和返回
+ if (setSuccess)
+ {
+ Log($"色彩模式设置成功: {paletteType} (值: {paletteValue})");
+ return true;
+ }
+ else
+ {
+ Log($"色彩模式设置失败: 实际设置未生效 (尝试 {attempt + 1}/{maxRetries})");
+ if (attempt < maxRetries - 1)
+ {
+ Thread.Sleep(retryDelayMs);
+ continue;
+ }
+ else
+ {
+ // 最后一次尝试失败,尝试恢复原始值
+ if (originalValue != -1 && _a8Sdk != null && _connectionStatus == ConnectionStatus.Connected)
+ {
+ try
+ {
+ Log($"尝试恢复色彩模式为原始值: {originalValue}");
+ _a8Sdk.Color_plate = originalValue;
+ }
+ catch { }
+ }
+ }
+ }
// 移除图像接收重启逻辑,因为色彩模式不影响图像接收
// 仅保留短暂延迟确保设置生效
Thread.Sleep(200); // 给设备处理时间
-
- return true;
+ // return true; // 已在验证成功后返回
}
catch (Exception ex)
{
diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/V8.cs b/Windows/CS/Framework4.0/Toprie/Toprie/V8.cs
index f30c411..a24a3f2 100644
--- a/Windows/CS/Framework4.0/Toprie/Toprie/V8.cs
+++ b/Windows/CS/Framework4.0/Toprie/Toprie/V8.cs
@@ -31,8 +31,8 @@ namespace JoyD.Windows.CS.Toprie
{
SHUTTER_CORRECTION = 0,
SET_AUTO_SHUTTER = 1,
- // 根据热像仪SDK,设置色彩模式的命令类型
- SET_COLOR_PLATE = 2, // 保持为2,因为热像仪SDK中也是使用SET_COLOR_PLATE命令
+ // 根据设备实际通信协议,设置色彩模式的命令类型
+ SET_COLOR_PLATE = 17, // 修正为17,以匹配设备实际接受的命令格式
SET_MIRROR_VIDEO = 3,
SET_VIDEO_MODE = 4,
SET_AREA_POS = 5,
@@ -514,154 +514,173 @@ namespace JoyD.Windows.CS.Toprie
}
}
- public int Color_plate
+ ///
+ /// 获取当前色彩模式值
+ ///
+ /// 色彩模式值,如果获取失败则返回上次已知值
+ public int GetColorPlate()
{
- get
+ lock (_colorPlateLock)
{
- lock (_colorPlateLock)
+ try
{
- try
+ const int maxRetries = 3;
+ int retryCount = 0;
+ bool success = false;
+ int resultValue = _lastKnownColorPlate;
+
+ while (retryCount < maxRetries && !success)
{
- const int maxRetries = 3;
- int retryCount = 0;
- bool success = false;
- int resultValue = _lastKnownColorPlate;
+ retryCount++;
+ // 使用SDK格式获取色板: ip:param_mode,param_value$
+ string command = $"{deviceIp}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.COLOR_PLATE}$";
- while (retryCount < maxRetries && !success)
+ Log($"[色彩模式读取] 开始获取色彩模式值{(retryCount > 1 ? " (重试 " + retryCount + "/" + maxRetries + ")" : "")},发送命令: {command}");
+
+ if (SendCommand(command, out string response))
{
- retryCount++;
- // 使用SDK格式获取色板: ip:param_mode,param_value$
- string command = $"{deviceIp}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.COLOR_PLATE}$";
-
- Log($"[色彩模式读取] 开始获取色彩模式值{(retryCount > 1 ? " (重试 " + retryCount + "/" + maxRetries + ")" : "")},发送命令: {command}");
-
- if (SendCommand(command, out string response))
+ Log($"[色彩模式读取] 收到响应: {response}");
+ try
{
- Log($"[色彩模式读取] 收到响应: {response}");
- try
- {
- int parsedValue = ParseResponseValue(response);
-
- if (response != null && parsedValue != -1) // 确保响应有效且解析成功
- {
- Log($"[色彩模式读取] 解析成功,当前值: {parsedValue},上一次值: {_lastKnownColorPlate}");
- _lastKnownColorPlate = parsedValue;
- resultValue = parsedValue;
- success = true;
- }
- else if (retryCount < maxRetries)
- {
- Log($"[色彩模式读取] 解析失败或响应无效,将重试...");
- System.Threading.Thread.Sleep(200); // 短暂延迟后重试
- }
- else
- {
- Log($"[色彩模式读取] 解析失败或响应无效,返回上次已知值: {_lastKnownColorPlate}");
- }
- }
- catch (Exception ex)
- {
- if (retryCount < maxRetries)
- {
- Log($"[色彩模式读取] 解析异常: {ex.Message},将重试...");
- System.Threading.Thread.Sleep(200); // 短暂延迟后重试
- }
- else
- {
- Log($"[色彩模式读取] 解析异常: {ex.Message},返回上次已知值: {_lastKnownColorPlate}");
- }
- }
- }
- else if (retryCount < maxRetries)
- {
- Log($"[色彩模式读取] 命令发送失败或超时,将重试...");
- System.Threading.Thread.Sleep(200); // 短暂延迟后重试
- }
- else
- {
- Log($"[色彩模式读取] 命令发送失败或超时,返回上次已知值: {_lastKnownColorPlate}");
- }
- }
- Log($"成功读取当前色彩模式值: {resultValue}"); // 添加一致的成功日志
-
- return resultValue;
- }
- catch (Exception ex)
- {
- Log($"[色彩模式读取异常] {ex.Message},返回上次已知值: {_lastKnownColorPlate}");
- return _lastKnownColorPlate;
- }
- }
- }
- set
- {
- lock (_colorPlateLock)
- {
- try
- {
- int currentValue = GetColor_plateWithoutLock();
- Log($"[色彩模式设置] 开始设置色彩模式值为: {value},当前值: {currentValue}");
-
- // 如果值相同,不需要设置
- if (currentValue == value)
- {
- Log($"[色彩模式设置] 当前色彩模式已为目标值,无需设置");
- return;
- }
-
- // 使用SDK格式设置色板: ip:param_mode,param_value$
- string command = $"{deviceIp}:{(int)CMD_TYPE.SET_COLOR_PLATE},{value}$";
-
- Log($"[色彩模式设置] 发送命令: {command}");
-
- bool success = SendCommand(command, out string response);
- if (success && response != null)
- {
- Log($"[色彩模式设置] 收到响应: {response}");
-
- // 验证响应是否包含成功标记
- bool responseValid = response.Contains("+RET:") &&
- (!response.Contains("error") && !response.Contains("失败"));
-
- if (responseValid)
- {
- Log($"[色彩模式设置成功] 从 {_lastKnownColorPlate} 变更为 {value}");
- _lastKnownColorPlate = value; // 更新最后已知值
+ int parsedValue = ParseResponseValue(response);
- // 验证设置是否生效
- Log($"[色彩模式设置] 验证设置是否生效...");
- int validatedValue = GetColor_plateWithoutLock();
- if (validatedValue == value)
+ if (response != null && parsedValue != -1) // 确保响应有效且解析成功
{
- Log($"[色彩模式设置] 验证成功,当前值确认为: {validatedValue}");
-
- // 移除图像接收重启逻辑,因为色彩模式不影响图像接收
- // 仅保留短暂延迟确保设置生效
- Log($"[色彩模式设置] 设置成功,不需要重启图像接收");
+ Log($"[色彩模式读取] 解析成功,当前值: {parsedValue},上一次值: {_lastKnownColorPlate}");
+ _lastKnownColorPlate = parsedValue;
+ resultValue = parsedValue;
+ success = true;
+ }
+ else if (retryCount < maxRetries)
+ {
+ Log($"[色彩模式读取] 解析失败或响应无效,将重试...");
+ System.Threading.Thread.Sleep(200); // 短暂延迟后重试
}
else
{
- Log($"[色彩模式设置] 验证失败,实际值: {validatedValue},期望值: {value}");
+ Log($"[色彩模式读取] 解析失败或响应无效,返回上次已知值: {_lastKnownColorPlate}");
}
}
+ catch (Exception ex)
+ {
+ if (retryCount < maxRetries)
+ {
+ Log($"[色彩模式读取] 解析异常: {ex.Message},将重试...");
+ System.Threading.Thread.Sleep(200); // 短暂延迟后重试
+ }
+ else
+ {
+ Log($"[色彩模式读取] 解析异常: {ex.Message},返回上次已知值: {_lastKnownColorPlate}");
+ }
+ }
+ }
+ else if (retryCount < maxRetries)
+ {
+ Log($"[色彩模式读取] 命令发送失败或超时,将重试...");
+ System.Threading.Thread.Sleep(200); // 短暂延迟后重试
+ }
+ else
+ {
+ Log($"[色彩模式读取] 命令发送失败或超时,返回上次已知值: {_lastKnownColorPlate}");
+ }
+ }
+ Log($"成功读取当前色彩模式值: {resultValue}"); // 添加一致的成功日志
+
+ return resultValue;
+ }
+ catch (Exception ex)
+ {
+ Log($"[色彩模式读取异常] {ex.Message},返回上次已知值: {_lastKnownColorPlate}");
+ return _lastKnownColorPlate;
+ }
+ }
+ }
+
+ ///
+ /// 设置色彩模式值
+ ///
+ /// 要设置的色彩模式值
+ /// 设置是否成功
+ public bool SetColorPlate(int value)
+ {
+ lock (_colorPlateLock)
+ {
+ try
+ {
+ int currentValue = GetColor_plateWithoutLock();
+ Log($"[色彩模式设置] 开始设置色彩模式值为: {value},当前值: {currentValue}");
+
+ // 如果值相同,不需要设置
+ if (currentValue == value)
+ {
+ Log($"[色彩模式设置] 当前色彩模式已为目标值,无需设置");
+ return true;
+ }
+
+ // 使用SDK格式设置色板: ip:param_mode,param_value$
+ string command = $"{deviceIp}:{(int)CMD_TYPE.SET_COLOR_PLATE},{value}$";
+
+ Log($"[色彩模式设置] 发送命令: {command}");
+
+ bool success = SendCommand(command, out string response);
+ if (success && response != null)
+ {
+ Log($"[色彩模式设置] 收到响应: {response}");
+
+ // 验证响应是否包含成功标记
+ bool responseValid = response.Contains("+RET:") &&
+ (!response.Contains("error") && !response.Contains("失败"));
+
+ if (responseValid)
+ {
+ Log($"[色彩模式设置成功] 从 {_lastKnownColorPlate} 变更为 {value}");
+ _lastKnownColorPlate = value; // 更新最后已知值
+
+ // 验证设置是否生效
+ Log($"[色彩模式设置] 验证设置是否生效...");
+ int validatedValue = GetColor_plateWithoutLock();
+ if (validatedValue == value)
+ {
+ Log($"[色彩模式设置] 验证成功,当前值确认为: {validatedValue}");
+
+ // 移除图像接收重启逻辑,因为色彩模式不影响图像接收
+ // 仅保留短暂延迟确保设置生效
+ Log($"[色彩模式设置] 设置成功,不需要重启图像接收");
+ return true;
+ }
else
{
- Log($"[色彩模式设置失败] 响应验证失败: {response}");
+ Log($"[色彩模式设置] 验证失败,实际值: {validatedValue},期望值: {value}");
+ return false;
}
}
else
{
- Log($"[色彩模式设置失败] 命令发送失败或超时,响应为null: {success}");
+ Log($"[色彩模式设置失败] 响应验证失败: {response}");
+ return false;
}
}
- catch (Exception ex)
+ else
{
- Log($"[色彩模式设置异常] {ex.Message}");
+ Log($"[色彩模式设置失败] 命令发送失败或超时,响应为null: {success}");
+ return false;
}
}
+ catch (Exception ex)
+ {
+ Log($"[色彩模式设置异常] {ex.Message}");
+ return false;
+ }
}
}
+ // 保留原属性以保持向后兼容性
+ public int Color_plate
+ {
+ get => GetColorPlate();
+ set => SetColorPlate(value);
+ }
+
///
/// 不带锁获取色彩模式,避免在设置后验证时出现死锁
///