-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMAGLabCL.cs
86 lines (74 loc) · 2.15 KB
/
MAGLabCL.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
using System;
namespace MAGLabCL
{
public class Timeout
{
public UInt16 lastRecTime = 0;
public Timeout()
{
}
public bool update(bool received, UInt16 time, UInt16 timeout)
{
bool retVal = false;
if (received)
{
lastRecTime = time;
retVal = false;
}
if (time - lastRecTime >= timeout)
{
retVal = true;
}
if (time - lastRecTime > timeout)
{
lastRecTime += 1;
}
return retVal;
}
}
public class ConfirmationThreshold<T> where T : IComparable
{
public T confirmedValue;
public UInt16 lastConfTime = 0;
public UInt16 confNumCounter = 0;
public ConfirmationThreshold(T initValue)
{
confirmedValue = initValue;
}
public T update(bool received, T newValue, UInt16 time, UInt16 tReq, UInt16 nReq)
{
// confirmation state machine
if (received)
{
// received counter processing
if (confNumCounter <= nReq)
{
confNumCounter += 1;
}
// new value processing
if (confirmedValue.CompareTo(newValue) != 0)
{
// if both the numeric value and the counter are above the ratio, we have a new value
if (confNumCounter >= nReq)
{
if (time - lastConfTime > tReq)
{
confirmedValue = newValue;
}
}
}
// confirmed value processing
if (confirmedValue.CompareTo(newValue) == 0)
{
confNumCounter = 0;
lastConfTime = time;
}
}
if (time - lastConfTime > tReq)
{
lastConfTime += 1;
}
return confirmedValue;
}
}
}