2025-10-13 16:37:29 +08:00
|
|
|
|
using guoke;
|
|
|
|
|
|
using System.Windows;
|
2025-10-13 16:08:02 +08:00
|
|
|
|
using WpfApp.src.components;
|
|
|
|
|
|
|
2025-10-14 12:38:10 +08:00
|
|
|
|
namespace WpfApp.Services;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// SensorChart 管理器 - 负责传感器数据采集和更新
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class SensorChartManager
|
2025-10-13 16:08:02 +08:00
|
|
|
|
{
|
2025-10-14 12:38:10 +08:00
|
|
|
|
private readonly Window dispatcherOwner;
|
|
|
|
|
|
private CancellationTokenSource cts;
|
|
|
|
|
|
private readonly Random rand = new Random();
|
|
|
|
|
|
private readonly LogService log;
|
|
|
|
|
|
private readonly DatabaseService db;
|
|
|
|
|
|
private readonly EventService<GeneralEventArgs> even;
|
2025-10-13 16:37:29 +08:00
|
|
|
|
|
2025-10-14 12:38:10 +08:00
|
|
|
|
// 事件名称常量
|
|
|
|
|
|
private const string SENSOR_DATA_EVENT = "SensorDataUpdate";
|
2025-10-14 11:08:00 +08:00
|
|
|
|
|
2025-10-13 16:08:02 +08:00
|
|
|
|
|
2025-10-14 12:38:10 +08:00
|
|
|
|
// 绑定的传感器控件
|
|
|
|
|
|
public SensorChart Sensor1 { get; set; }
|
|
|
|
|
|
public SensorChart Sensor2 { get; set; }
|
|
|
|
|
|
public SensorChart Sensor3 { get; set; }
|
2025-10-13 16:08:02 +08:00
|
|
|
|
|
2025-10-14 12:38:10 +08:00
|
|
|
|
public SensorChartManager(Window owner, LogService logService, DatabaseService databaseService, EventService<GeneralEventArgs> eventService)
|
|
|
|
|
|
{
|
|
|
|
|
|
dispatcherOwner = owner;
|
|
|
|
|
|
log = logService;
|
|
|
|
|
|
db = databaseService;
|
|
|
|
|
|
even = eventService;
|
|
|
|
|
|
}
|
2025-10-13 16:08:02 +08:00
|
|
|
|
|
2025-10-14 12:38:10 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 启动模拟数据采集
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public void Start()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (Sensor1 == null || Sensor2 == null || Sensor3 == null)
|
|
|
|
|
|
throw new InvalidOperationException("请先绑定传感器控件");
|
2025-10-13 16:08:02 +08:00
|
|
|
|
|
2025-10-14 12:38:10 +08:00
|
|
|
|
cts = new CancellationTokenSource();
|
2025-10-13 16:08:02 +08:00
|
|
|
|
|
2025-10-14 12:38:10 +08:00
|
|
|
|
Task.Run(async () =>
|
|
|
|
|
|
{
|
|
|
|
|
|
while (!cts.Token.IsCancellationRequested)
|
2025-10-13 16:08:02 +08:00
|
|
|
|
{
|
2025-10-14 12:38:10 +08:00
|
|
|
|
// 模拟数据
|
|
|
|
|
|
double s1 = rand.NextDouble() * 100 - 50;
|
|
|
|
|
|
double s2 = rand.NextDouble() * 100 - 50;
|
|
|
|
|
|
double s3 = rand.NextDouble() * 100 - 50;
|
2025-10-13 16:08:02 +08:00
|
|
|
|
|
2025-10-14 12:38:10 +08:00
|
|
|
|
// 更新 UI
|
|
|
|
|
|
dispatcherOwner.Dispatcher.Invoke(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
Sensor1.SetSensorData("传感器1", s1);
|
|
|
|
|
|
Sensor2.SetSensorData("传感器2", s2);
|
|
|
|
|
|
Sensor3.SetSensorData("传感器3", s3);
|
|
|
|
|
|
|
|
|
|
|
|
// 通过事件将传感器数据传递到ChartManager
|
|
|
|
|
|
PublishSensorData("传感器1", s1, "myChart1");
|
|
|
|
|
|
PublishSensorData("传感器2", s2, "myChart2");
|
|
|
|
|
|
PublishSensorData("传感器3", s3, "myChart3");
|
|
|
|
|
|
});
|
2025-10-13 16:08:02 +08:00
|
|
|
|
|
2025-10-14 12:38:10 +08:00
|
|
|
|
await Task.Delay(1000); // 每1000毫秒采集一次
|
|
|
|
|
|
}
|
|
|
|
|
|
}, cts.Token);
|
|
|
|
|
|
}
|
2025-10-13 16:08:02 +08:00
|
|
|
|
|
2025-10-14 12:38:10 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 停止采集
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public void Stop()
|
|
|
|
|
|
{
|
|
|
|
|
|
cts?.Cancel();
|
|
|
|
|
|
}
|
2025-10-14 11:08:00 +08:00
|
|
|
|
|
2025-10-14 12:38:10 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 发布传感器数据事件
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="sensorTitle">传感器标题</param>
|
|
|
|
|
|
/// <param name="sensorValue">传感器值</param>
|
|
|
|
|
|
/// <param name="chartTitle">图表标题</param>
|
|
|
|
|
|
private void PublishSensorData(string sensorTitle, double sensorValue, string chartTitle)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (even != null)
|
2025-10-14 11:08:00 +08:00
|
|
|
|
{
|
2025-10-14 12:38:10 +08:00
|
|
|
|
var eventArgs = new SensorDataEventArgs(sensorTitle, sensorValue, chartTitle);
|
|
|
|
|
|
even.TriggerEvent(SENSOR_DATA_EVENT, this, eventArgs);
|
2025-10-14 11:08:00 +08:00
|
|
|
|
}
|
2025-10-13 16:08:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|