WpfApp/Services/SensorChartManager.cs

97 lines
3.3 KiB
C#
Raw Normal View History

using guoke;
using System.Windows;
using WpfApp.src.components;
namespace WpfApp.Services
{
/// <summary>
/// SensorChart 管理器 - 负责传感器数据采集和更新
/// </summary>
public class SensorChartManager
{
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;
// 事件名称常量
private const string SENSOR_DATA_EVENT = "SensorDataUpdate";
// 绑定的传感器控件
public SensorChart Sensor1 { get; set; }
public SensorChart Sensor2 { get; set; }
public SensorChart Sensor3 { get; set; }
public SensorChartManager(Window owner, LogService logService, DatabaseService databaseService, EventService<GeneralEventArgs> eventService)
{
dispatcherOwner = owner;
log = logService;
db = databaseService;
even = eventService;
}
/// <summary>
/// 启动模拟数据采集
/// </summary>
public void Start()
{
if (Sensor1 == null || Sensor2 == null || Sensor3 == null)
throw new InvalidOperationException("请先绑定传感器控件");
cts = new CancellationTokenSource();
Task.Run(async () =>
{
while (!cts.Token.IsCancellationRequested)
{
// 模拟数据
double s1 = rand.NextDouble() * 100 - 50;
double s2 = rand.NextDouble() * 100 - 50;
double s3 = rand.NextDouble() * 100 - 50;
// 更新 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");
});
await Task.Delay(1000); // 每1000毫秒采集一次
}
}, cts.Token);
}
/// <summary>
/// 停止采集
/// </summary>
public void Stop()
{
cts?.Cancel();
}
/// <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)
{
var eventArgs = new SensorDataEventArgs(sensorTitle, sensorValue, chartTitle);
even.TriggerEvent(SENSOR_DATA_EVENT, this, eventArgs);
}
}
}
}