添加 MX-PD-盘古 项目文件
将 MX-PD-盘古 - new 目录下的所有文件添加到主仓库
This commit is contained in:
@@ -0,0 +1,162 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user