更新Camera类的显示逻辑和温度数据处理

This commit is contained in:
zqm
2025-11-05 08:43:27 +08:00
parent 1358fa392e
commit 10875fc886

View File

@@ -83,10 +83,11 @@ namespace JoyD.Windows.CS.Toprie
}
/// <summary>
/// 更新InfoImage显示
/// 1. 如果暂停,显示暂停信息
/// 2. 否则如果Ping不通或断开显示重连信息
/// 3. 最后调用更新UI
/// 更新InfoImage显示 - 按照用户要求的详细步骤:
/// 1. 以透明色清空Info
/// 2. 如果暂停,显示暂停信息,否则如果Ping不通或断开显示重连信息,否则满足就绪条件
/// 3. 在就绪条件下,如果有温度数据,显示最高温度
/// 4. 最后调用更新UI
/// </summary>
private void UpdateInfo()
{
@@ -101,17 +102,19 @@ namespace JoyD.Windows.CS.Toprie
// 检查连接状态
bool isDisconnected = _deviceManager != null && _deviceManager.ConnectionStatus == ConnectionStatus.Disconnected;
bool isReconnecting = _deviceManager != null && _deviceManager.ConnectionStatus == ConnectionStatus.Reconnecting;
bool isConnected = _deviceManager != null && _deviceManager.ConnectionStatus == ConnectionStatus.Connected;
bool isPaused = _isPaused; // 使用_isPaused标志判断暂停状态
bool isPingFailed = !IsDevicePingable;
// 根据用户要求的优先级显示信息先检查暂停状态然后再检查Ping状态和连接状态
bool isReady = !isPaused && !isPingFailed && isConnected; // 就绪条件非暂停、可Ping通、已连接
using (Graphics g = Graphics.FromImage(_infoImage))
{
// 以透明色清空Info
// 步骤1以透明色清空Info
g.Clear(Color.Transparent);
// 步骤2检查暂停状态、Ping状态和连接状态
if (isPaused)
{
{
// 暂停状态 - 最高优先级
// 绘制暂停文本
string text = "暂停";
@@ -129,7 +132,7 @@ namespace JoyD.Windows.CS.Toprie
}
}
else if (isPingFailed || isDisconnected || isReconnecting)
{
{
// 非暂停状态下检查Ping状态和连接状态
// 确定显示的文本和颜色
@@ -164,17 +167,43 @@ namespace JoyD.Windows.CS.Toprie
format);
}
}
else if (isReady)
{
// 步骤3就绪条件下如果有温度数据显示最高温度
// 从DeviceManager获取最新的温度数据
if (_deviceManager != null)
{
TemperatureData temperatureData = _deviceManager.LastTemperature;
if (temperatureData != null)
{
// 有有效温度数据,显示最高温度
string tempText = $"最高温度: {temperatureData.MaxTemperature:F2} °C";
Color textColor = Color.White;
using (Font font = new Font("Arial", 24, FontStyle.Bold))
using (SolidBrush textBrush = new SolidBrush(textColor))
{
StringFormat format = new StringFormat() { Alignment = StringAlignment.Center };
// 在图像底部显示温度信息
g.DrawString(tempText, font, textBrush,
new RectangleF(0, BUFFER_HEIGHT - 40, BUFFER_WIDTH, 40),
format);
}
}
}
}
}
// 设置显示标志
_isDisplayingInfo = (isPaused || isDisconnected || isReconnecting);
}
// 调用更新UI
UpdateImageOnUI();
// 步骤4最后调用更新UI注意在DeviceManager_ImageReceived中已处理非暂停状态下的UI更新
// 这里不再直接调用UpdateImageOnUI,避免重复更新
}
catch (Exception ex)
{
{
Console.WriteLine($"更新Info显示时出错: {ex.Message}");
}
}
@@ -248,7 +277,7 @@ namespace JoyD.Windows.CS.Toprie
Console.WriteLine($"[PauseDetection] 检测已恢复 - DeviceManager状态更新完成连接状态: {_deviceManager?.ConnectionStatus}, 当前时间: {DateTime.Now.ToString("HH:mm:ss.fff")}");
}
// 按照用户要求暂停或恢复时设置暂停状态调用更新Info
// 修改流程第1点和第5点暂停或恢复时设置暂停状态调用更新Info(在暂停状态下会显示暂停信息)
UpdateInfo();
}
catch (Exception ex)
@@ -566,8 +595,11 @@ namespace JoyD.Windows.CS.Toprie
{
_isDevicePingable = value;
Console.WriteLine($"设备Ping状态变更: {(_isDevicePingable ? "Ping通" : "Ping通")}");
// 状态变化时调用更新Info
UpdateInfo();
// 按照README中要求的修改流程第3点和第6点Ping通状态变化时只在非暂停状态下调用更新Info
if (!_isPaused)
{
UpdateInfo();
}
}
}
}
@@ -618,14 +650,15 @@ namespace JoyD.Windows.CS.Toprie
return;
}
// 按照README中要求的修改流程第5点和第6图像更新时保存LastImage只在非暂停状态下调用更新UI
// 按照README中要求的修改流程第4点和第5图像更新时保存LastImage只在非暂停状态下调用更新Info和UI
this.BeginInvoke(new Action(() =>
{
try
{
if (!_isPaused)
{
UpdateImageOnUI();
UpdateInfo(); // 先更新Info
UpdateImageOnUI(); // 然后更新UI
}
}
catch (Exception ex)
@@ -953,7 +986,7 @@ namespace JoyD.Windows.CS.Toprie
}
}
// 按照README中要求的修改流程第2点和第6点:连接状态变化时只在非暂停状态下调用更新Info
// 按照README中要求的修改流程第2点和第5点:断开或连接时,设置连接状态只在非暂停状态下调用更新Info
if (!_isPaused)
{
UpdateInfo();
@@ -979,7 +1012,7 @@ namespace JoyD.Windows.CS.Toprie
// 按照README中要求的修改流程第2点和第6点:连接状态变化时只在非暂停状态下调用更新Info
// 按照README中要求的修改流程第2点和第5点:断开或连接时,设置连接状态只在非暂停状态下调用更新Info
if (!_isPaused)
{
UpdateInfo();
@@ -1555,12 +1588,9 @@ namespace JoyD.Windows.CS.Toprie
/// <param name="isPingable">是否可Ping通</param>
private void UpdatePingState(bool isPingable)
{
// 按照README中要求的修改流程第3点和第6点Ping通状态变化时修改Ping状态只在非暂停状态下调用更新Info
// 按照README中要求的修改流程第3点Ping通状态变化时修改Ping状态
// 注意UpdateInfo的调用已在IsDevicePingable的setter中实现只在非暂停状态下
IsDevicePingable = isPingable;
if (!_isPaused)
{
UpdateInfo();
}
}
/// <summary>