SignalMonitor.cs
2.1 KB
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
using System;
using System.Diagnostics;
namespace OnlineStore.DeviceLibrary
{
public class SignalMonitor
{
private readonly Stopwatch _stopwatch;
private bool _lastSignalState;
private long _lastStateChangeTicks;
private long _lastOnDurationTicks;
private long _lastOffDurationTicks;
public SignalMonitor(bool initialSignalState = false)
{
_stopwatch = Stopwatch.StartNew();
_lastSignalState = initialSignalState;
_lastStateChangeTicks = _stopwatch.ElapsedTicks;
_lastOnDurationTicks = 0;
_lastOffDurationTicks = 0;
}
public void UpdateSignalState(bool currentSignalState)
{
if (currentSignalState == _lastSignalState)
return;
long currentTicks = _stopwatch.ElapsedTicks;
long durationTicks = currentTicks - _lastStateChangeTicks;
if (_lastSignalState)
{
_lastOnDurationTicks = durationTicks;
}
else
{
_lastOffDurationTicks = durationTicks;
}
_lastSignalState = currentSignalState;
_lastStateChangeTicks = currentTicks;
}
public TimeSpan GetCurrentOnDuration()
{
if (_lastSignalState)
{
long currentTicks = _stopwatch.ElapsedTicks;
return TicksToTimeSpan(currentTicks - _lastStateChangeTicks);
}
return TicksToTimeSpan(_lastOnDurationTicks);
}
public TimeSpan GetCurrentOffDuration()
{
if (!_lastSignalState)
{
long currentTicks = _stopwatch.ElapsedTicks;
return TicksToTimeSpan(currentTicks - _lastStateChangeTicks);
}
return TicksToTimeSpan(_lastOffDurationTicks);
}
private TimeSpan TicksToTimeSpan(long ticks)
{
return TimeSpan.FromTicks(ticks * TimeSpan.TicksPerSecond / Stopwatch.Frequency);
}
}
}