Open Model Railroad Network (OpenMRN)
Loading...
Searching...
No Matches
Blinker.cxx
Go to the documentation of this file.
1
35
#include "
utils/blinker.h
"
36
37
extern
"C"
38
{
39
40
unsigned
parseblink
(uint32_t pattern)
41
{
42
unsigned
ret = 0;
43
if
(!pattern)
44
{
45
return
ret;
46
}
47
// Finds the top bit.
48
uint32_t tb = 1U << 31;
49
while
((tb & pattern) == 0)
50
{
51
tb >>= 1;
52
}
53
unsigned
nibble_shift = 1;
54
unsigned
last_len = 1;
55
unsigned
curr_len = 1;
56
pattern &= ~tb;
57
while
(
true
)
58
{
59
if
(curr_len)
60
{
61
if
(pattern & 1)
62
{
63
curr_len++;
64
}
65
else
66
{
67
// end of lit period
68
if
(last_len != curr_len)
69
{
70
// new blink length
71
nibble_shift <<= 4;
72
last_len = curr_len;
73
}
74
ret += nibble_shift;
75
curr_len = 0;
76
}
77
}
78
else
79
{
80
// we are in unlit
81
if
(pattern & 1)
82
{
83
// start of a new lit period.
84
curr_len = 1;
85
}
86
}
87
if
(!pattern)
88
{
89
break
;
90
}
91
pattern >>= 1;
92
}
93
return
ret;
94
}
95
96
}
parseblink
unsigned parseblink(uint32_t pattern)
Turns a blinker pattern into an error code in BCD.
Definition
Blinker.cxx:40
blinker.h
src
utils
Blinker.cxx
Generated on Sun Feb 2 2025 21:18:14 for Open Model Railroad Network (OpenMRN) by
1.9.8