22 static bool toggle =
false;
26 const uint8_t command = data.command & 0x7F;
27 const uint32_t start_field = command >= 64 ? 0b10 : 0b11;
28 const uint32_t out_data = start_field << (RC5_TOGGLE_BIT + RC5_ADDRESS_BITS + RC5_COMMAND_BITS + RC5_EXT_BITS) |
29 uint32_t(toggle) << (RC5_ADDRESS_BITS + RC5_COMMAND_BITS + RC5_EXT_BITS) |
30 uint32_t(data.address & 0x1F) << (RC5_COMMAND_BITS + RC5_EXT_BITS) |
31 uint32_t(command & 0x3F) << RC5_EXT_BITS | (data.extension & 0x3F);
33 for (uint8_t bit = NBITS; bit-- > 0;) {
34 if (bit == NBITS - 1 - FIRST_PART_NBITS) {
35 for (uint8_t i = 0; i < PAUSE_HALFBITS; i++)
36 dst->
space(HALF_BIT_US);
38 if (out_data & (1UL << bit)) {
39 dst->
space(HALF_BIT_US);
40 dst->
mark(HALF_BIT_US);
42 dst->
mark(HALF_BIT_US);
43 dst->
space(HALF_BIT_US);
56 bool halfbits[NFRAMEHALFBITS + 2];
58 bool pause_seen =
false;
59 for (
uint32_t i = 0; n <= NFRAMEHALFBITS &&
src.is_valid(i); i++) {
60 if (
src.peek_mark(HALF_BIT_US, i)) {
62 }
else if (
src.peek_space(HALF_BIT_US, i)) {
63 halfbits[n++] =
false;
64 }
else if (
src.peek_mark(2 * HALF_BIT_US, i)) {
67 }
else if (
src.peek_space(2 * HALF_BIT_US, i)) {
68 halfbits[n++] =
false;
69 halfbits[n++] =
false;
72 if (pause_seen || (n != PAUSE_START && n != PAUSE_START - 1))
74 const int32_t value =
src.peek(i);
75 const bool level = value > 0;
76 const uint32_t halves = (
static_cast<uint32_t>(value > 0 ? value : -value) + HALF_BIT_US / 2) / HALF_BIT_US;
77 if (level == halfbits[1] || halves < PAUSE_HALFBITS || halves > PAUSE_HALFBITS + 2)
80 halfbits[n++] = level;
82 if (n != PAUSE_START + PAUSE_HALFBITS && n != PAUSE_START + PAUSE_HALFBITS + 1)
90 if (!pause_seen || (n != NFRAMEHALFBITS && n != NFRAMEHALFBITS - 1)) {
93 halfbits[0] = !halfbits[1];
94 if (n == NFRAMEHALFBITS - 1) {
95 halfbits[n] = !halfbits[n - 1];
98 const bool carrier = halfbits[1];
100 for (uint8_t i = 0; i < NBITS; i++) {
101 const uint8_t
h = 2 * i + (i < FIRST_PART_NBITS ? 0 : PAUSE_HALFBITS);
102 const bool first = halfbits[
h];
103 const bool second = halfbits[
h + 1];
107 bits = (bits << 1) | (
second == carrier ? 1 : 0);
111 const bool field_bit = bits & (1UL << (NBITS - 2));
113 .address =
static_cast<uint8_t
>((bits >> (RC5_COMMAND_BITS + RC5_EXT_BITS)) & 0x1F),
114 .command =
static_cast<uint8_t
>(((bits >> RC5_EXT_BITS) & 0x3F) | (field_bit ? 0 : 0x40)),
115 .extension =
static_cast<uint8_t
>(bits & 0x3F),