163 lines
4.5 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|