using guoke;
using System.Windows;
using WpfApp.src.components;
namespace WpfApp.Services;
///
/// SensorChart 管理器 - 负责传感器数据采集和更新
///
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 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 eventService)
{
dispatcherOwner = owner;
log = logService;
db = databaseService;
even = eventService;
}
///
/// 启动模拟数据采集
///
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);
}
///
/// 停止采集
///
public void Stop()
{
cts?.Cancel();
}
///
/// 发布传感器数据事件
///
/// 传感器标题
/// 传感器值
/// 图表标题
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);
}
}
}