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
37extern "C"
38{
39
40unsigned 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}
unsigned parseblink(uint32_t pattern)
Turns a blinker pattern into an error code in BCD.
Definition Blinker.cxx:40