/
SerialWombatBase.Hcsr04.cs
96 lines (82 loc) · 2.79 KB
/
SerialWombatBase.Hcsr04.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
using Meadow.Hardware;
using Meadow.Units;
using System;
using System.Threading.Tasks;
namespace Meadow.Foundation.ICs.IOExpanders
{
public abstract partial class SerialWombatBase
{
/// <summary>
/// Represents a HCSR04 distance sensor connected to a Serial Wombat
/// </summary>
public class Hcsr04 : Sensors.Distance.Hcsr04, IDisposable
{
/// <summary>
/// The default sensor read period
/// </summary>
public static TimeSpan DefaultReadPeriod => TimeSpan.FromMilliseconds(250);
readonly SerialWombatBase controller;
readonly IPin echoPin;
bool disposed;
/// <summary>
/// Create a new Hcsr04 object
/// </summary>
public Hcsr04(SerialWombatBase controller, IPin trigger, IPin echo)
: this(controller, trigger, echo, DefaultReadPeriod)
{ }
/// <summary>
/// Create a new Hcsr04 object
/// </summary>
public Hcsr04(SerialWombatBase controller, IPin trigger, IPin echo, TimeSpan readPeriod)
{
this.controller = controller;
echoPin = echo;
controller.ConfigureUltrasonicSensor(trigger, echo);
if (readPeriod.TotalMilliseconds > 0)
{
Task.Run(async () =>
{
while (!disposed)
{
ReadPulses();
await Task.Delay(readPeriod);
}
});
}
}
/// <summary>
/// Start a distance measurement
/// </summary>
public override void MeasureDistance()
{
ReadPulses();
}
private void ReadPulses()
{
var oldDistance = Distance;
var d = controller.ReadPublicData(echoPin);
controller?.Logger?.Debug($"d: {d}");
var newDistance = new Length(d, Length.UnitType.Millimeters);
base.RaiseEventsAndNotify(new ChangeResult<Length>(newDistance, oldDistance));
Distance = newDistance;
}
///<inheritdoc/>
protected override void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
}
disposed = true;
}
}
///<inheritdoc/>
public new void Dispose()
{
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
}
}
}