Files
test_demo/MX-PD-盘古 - new/PanGu.DieBonderApp/MainShell/Hardware/DiastimeterPollingService.cs
Shi.Ji e31d3560bb 添加 MX-PD-盘古 项目文件
将 MX-PD-盘古 - new 目录下的所有文件添加到主仓库
2026-05-18 11:43:09 +08:00

163 lines
4.5 KiB
C#

using MainShell.EventArgsFolder;
using MainShell.Log;
using Stylet;
using System;
using System.Threading;
using MwFramework.Device;
namespace MainShell.Hardware
{
public class DiastimeterPollingService : IDisposable
{
private const int DefaultIntervalMilliseconds = 200;
private readonly HardwareManager _hardwareManager;
private readonly IEventAggregator _eventAggregator;
private readonly object _syncRoot = new object();
private Timer _timer;
private bool _isRunning;
private bool _isReading;
private int _intervalMilliseconds;
public DiastimeterPollingService(HardwareManager hardwareManager, IEventAggregator eventAggregator)
{
_hardwareManager = hardwareManager ?? throw new ArgumentNullException(nameof(hardwareManager));
_eventAggregator = eventAggregator ?? throw new ArgumentNullException(nameof(eventAggregator));
_intervalMilliseconds = DefaultIntervalMilliseconds;
}
public bool IsRunning
{
get
{
lock (_syncRoot)
{
return _isRunning;
}
}
}
public int IntervalMilliseconds
{
get
{
lock (_syncRoot)
{
return _intervalMilliseconds;
}
}
}
public void Start()
{
Start(DefaultIntervalMilliseconds);
}
public void Start(int intervalMilliseconds)
{
if (intervalMilliseconds <= 0)
{
throw new ArgumentOutOfRangeException(nameof(intervalMilliseconds));
}
lock (_syncRoot)
{
_intervalMilliseconds = intervalMilliseconds;
if (_timer == null)
{
_timer = new Timer(ReadSample, null, Timeout.Infinite, Timeout.Infinite);
}
_timer.Change(0, _intervalMilliseconds);
_isRunning = true;
}
$"激光测距仪轮询启动,周期={intervalMilliseconds}ms".LogInfo();
}
public void Stop()
{
lock (_syncRoot)
{
if (_timer != null)
{
_timer.Change(Timeout.Infinite, Timeout.Infinite);
}
_isRunning = false;
}
"激光测距仪轮询停止。".LogInfo();
}
private void ReadSample(object state)
{
lock (_syncRoot)
{
if (!_isRunning || _isReading)
{
return;
}
_isReading = true;
}
try
{
IDiastimeter diastimeter = _hardwareManager.Diastimeter;
if (diastimeter == null)
{
PublishInvalidSample("激光测距仪未初始化。");
return;
}
if (!diastimeter.IsConnected)
{
PublishInvalidSample("激光测距仪未连接。");
return;
}
double distance;
diastimeter.GetLastSample(out distance);
if (double.IsNaN(distance) || double.IsInfinity(distance))
{
PublishInvalidSample("激光测距仪反馈数据无效。");
return;
}
_eventAggregator.PublishOnUIThread(new DiastimeterSampleChangedEventArgs(distance, DateTime.Now, true, string.Empty));
}
catch (Exception ex)
{
$"激光测距仪轮询读取失败:{ex.Message}".LogSysError();
PublishInvalidSample(ex.Message);
}
finally
{
lock (_syncRoot)
{
_isReading = false;
}
}
}
private void PublishInvalidSample(string message)
{
_eventAggregator.PublishOnUIThread(new DiastimeterSampleChangedEventArgs(0d, DateTime.Now, false, message));
}
public void Dispose()
{
Stop();
lock (_syncRoot)
{
if (_timer != null)
{
_timer.Dispose();
_timer = null;
}
}
}
}
}