视频模式同步更新
This commit is contained in:
@@ -767,49 +767,208 @@ namespace JoyD.Windows.CS.Toprie
|
||||
}
|
||||
}
|
||||
|
||||
public int Video_mode
|
||||
private int _lastKnownVideoMode = 0; // 保存最后已知的视频模式值
|
||||
private readonly object _videoModeLock = new object(); // 线程锁,确保线程安全
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前视频模式值(内部方法)
|
||||
/// </summary>
|
||||
/// <returns>视频模式值,如果获取失败则返回上次已知值</returns>
|
||||
private int GetVideoModeInternal()
|
||||
{
|
||||
get
|
||||
lock (_videoModeLock)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 使用SDK格式获取视频模式: +CMD:param_mode,param_value$
|
||||
string command = $"{CMD_HEAD}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.VIDEO_MODE}$";
|
||||
const int maxRetries = 3;
|
||||
int retryCount = 0;
|
||||
bool success = false;
|
||||
int resultValue = _lastKnownVideoMode;
|
||||
|
||||
if (SendCommand(command, out string response))
|
||||
while (retryCount < maxRetries && !success)
|
||||
{
|
||||
return ParseResponseValue(response);
|
||||
retryCount++;
|
||||
// 使用SDK格式获取视频模式: +CMD:param_mode,param_value$
|
||||
string command = $"{CMD_HEAD}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.VIDEO_MODE}$";
|
||||
|
||||
Log($"[视频模式读取] 开始获取视频模式值{(retryCount > 1 ? " (重试 " + retryCount + "/" + maxRetries + ")" : "")},发送命令: {command}");
|
||||
|
||||
if (SendCommand(command, out string response))
|
||||
{
|
||||
Log($"[视频模式读取] 收到响应: {response}");
|
||||
try
|
||||
{
|
||||
int parsedValue = ParseResponseValue(response);
|
||||
|
||||
if (response != null && parsedValue != -1) // 确保响应有效且解析成功
|
||||
{
|
||||
Log($"[视频模式读取] 解析成功,当前值: {parsedValue},上一次值: {_lastKnownVideoMode}");
|
||||
_lastKnownVideoMode = parsedValue;
|
||||
resultValue = parsedValue;
|
||||
success = true;
|
||||
}
|
||||
else if (retryCount < maxRetries)
|
||||
{
|
||||
Log($"[视频模式读取] 解析失败或响应无效,将重试...");
|
||||
System.Threading.Thread.Sleep(200); // 短暂延迟后重试
|
||||
}
|
||||
else
|
||||
{
|
||||
Log($"[视频模式读取] 解析失败或响应无效,返回-1表示获取失败");
|
||||
resultValue = -1; // 失败时返回-1而不是上次已知值
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (retryCount < maxRetries)
|
||||
{
|
||||
Log($"[视频模式读取] 解析异常: {ex.Message},将重试...");
|
||||
System.Threading.Thread.Sleep(200); // 短暂延迟后重试
|
||||
}
|
||||
else
|
||||
{
|
||||
Log($"[视频模式读取] 解析异常: {ex.Message},重试次数已达上限");
|
||||
resultValue = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (retryCount < maxRetries)
|
||||
{
|
||||
Log($"[视频模式读取] 发送命令失败,将重试...");
|
||||
System.Threading.Thread.Sleep(200); // 短暂延迟后重试
|
||||
}
|
||||
else
|
||||
{
|
||||
Log($"[视频模式读取] 发送命令失败,重试次数已达上限");
|
||||
resultValue = -1;
|
||||
}
|
||||
}
|
||||
return 0; // 默认模式
|
||||
|
||||
return resultValue;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"获取视频模式失败: {ex.Message}");
|
||||
return 0;
|
||||
Log($"[视频模式读取] 发生异常: {ex.Message}");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
set
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置视频模式值(内部方法)
|
||||
/// </summary>
|
||||
/// <param name="value">要设置的视频模式值</param>
|
||||
/// <returns>设置是否成功</returns>
|
||||
private bool SetVideoModeInternal(int value)
|
||||
{
|
||||
lock (_videoModeLock)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 首先尝试获取当前值
|
||||
int currentValue = GetVideoModeWithoutLock();
|
||||
Log($"[视频模式设置] 开始设置视频模式值为: {value},尝试获取当前值: {currentValue}");
|
||||
|
||||
// 只有在成功获取到当前值(currentValue != -1)且与目标值相同时才跳过设置
|
||||
// 如果获取失败(currentValue == -1),仍然执行设置操作,避免因获取失败而跳过设置
|
||||
if (currentValue != -1 && currentValue == value)
|
||||
{
|
||||
Log($"[视频模式设置] 当前视频模式已为目标值,无需设置");
|
||||
return true;
|
||||
}
|
||||
// 如果获取失败,记录日志说明将继续执行设置
|
||||
else if (currentValue == -1)
|
||||
{
|
||||
Log($"[视频模式设置] 获取当前值失败,将执行设置操作");
|
||||
}
|
||||
|
||||
// 使用SDK格式设置视频模式: +CMD:param_mode,param_value$
|
||||
string command = $"{CMD_HEAD}:{(int)CMD_TYPE.SET_VIDEO_MODE},{value}$";
|
||||
|
||||
if (SendCommand(command, out string response))
|
||||
Log($"[视频模式设置] 发送命令: {command}");
|
||||
|
||||
bool success = SendCommand(command, out string response);
|
||||
if (success && response != null)
|
||||
{
|
||||
// 验证响应
|
||||
if (response != null)
|
||||
Log($"[视频模式设置] 收到响应: {response}");
|
||||
|
||||
// 验证响应是否包含成功标记
|
||||
bool responseValid = response.Contains("+RET:") &&
|
||||
(!response.Contains("error") && !response.Contains("失败"));
|
||||
|
||||
if (responseValid)
|
||||
{
|
||||
Console.WriteLine("设置视频模式成功");
|
||||
Log($"[视频模式设置成功] 从 {_lastKnownVideoMode} 变更为 {value}");
|
||||
_lastKnownVideoMode = value; // 更新最后已知值
|
||||
|
||||
// 验证设置是否生效
|
||||
Log($"[视频模式设置] 验证设置是否生效...");
|
||||
int validatedValue = GetVideoModeWithoutLock();
|
||||
if (validatedValue == value)
|
||||
{
|
||||
Log($"[视频模式设置] 验证成功,当前值确认为: {validatedValue}");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Log($"[视频模式设置] 验证失败,当前值: {validatedValue},目标值: {value}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log($"[视频模式设置] 响应无效或失败: {response}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log($"[视频模式设置] 发送命令失败或未收到响应");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"设置视频模式失败: {ex.Message}");
|
||||
Log($"[视频模式设置] 发生异常: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 不带锁获取视频模式,避免在设置后验证时出现死锁
|
||||
/// </summary>
|
||||
private int GetVideoModeWithoutLock()
|
||||
{
|
||||
try
|
||||
{
|
||||
// 使用SDK格式获取视频模式: +CMD:param_mode,param_value$
|
||||
string command = $"{CMD_HEAD}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.VIDEO_MODE}$";
|
||||
if (SendCommand(command, out string response))
|
||||
{
|
||||
int result = ParseResponseValue(response);
|
||||
// 如果解析结果不是特殊值-1,表示解析成功
|
||||
if (result != -1)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log($"[GetVideoModeWithoutLock异常] {ex.Message}");
|
||||
}
|
||||
// 返回特殊值-1表示获取失败,而不是返回_lastKnownVideoMode
|
||||
// 这样SetVideoModeInternal方法可以明确判断是否获取到了真实值
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 保留原属性以保持向后兼容性
|
||||
public int Video_mode
|
||||
{
|
||||
get => GetVideoModeInternal();
|
||||
set => SetVideoModeInternal(value);
|
||||
}
|
||||
|
||||
public void Set_area_pos(int index, SharedStructures.AreaPos area_data)
|
||||
{
|
||||
@@ -2251,28 +2410,13 @@ namespace JoyD.Windows.CS.Toprie
|
||||
// 获取视频模式
|
||||
public int GetVideoMode()
|
||||
{
|
||||
try
|
||||
{
|
||||
return Video_mode;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"获取视频模式失败: {ex.Message}");
|
||||
return 0;
|
||||
}
|
||||
return GetVideoModeInternal();
|
||||
}
|
||||
|
||||
// 设置视频模式
|
||||
public void SetVideoMode(int mode)
|
||||
{
|
||||
try
|
||||
{
|
||||
Video_mode = mode;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"设置视频模式失败: {ex.Message}");
|
||||
}
|
||||
SetVideoModeInternal(mode);
|
||||
}
|
||||
|
||||
// 新增方法:获取图像数据
|
||||
|
||||
Reference in New Issue
Block a user