28 uint64_t frame = (uint64_t(HEADER) << 56) | (uint64_t(data.remote_id & REMOTE_ID_MASK) << 32) |
29 (uint64_t(data.channels) << 16) | (uint64_t(data.command) << 8);
33 dst->
item(START_HIGH_US, LONG_US);
34 for (uint64_t mask = 1ULL << (NBITS - 1); mask; mask >>= 1) {
36 dst->
item(LONG_US, SHORT_US);
38 dst->
item(SHORT_US, LONG_US);
41 dst->
item(LONG_US, START_HIGH_US);
47 while (
src.is_valid()) {
48 if (!
src.expect_pulse_with_gap(START_HIGH_US, LONG_US)) {
55 for (; bits < NBITS; bits++) {
57 if (
src.expect_item(LONG_US, SHORT_US)) {
59 }
else if (!
src.expect_item(SHORT_US, LONG_US)) {
64 if (bits == NBITS && uint8_t(frame >> 56) == HEADER && uint8_t(frame) ==
checksum(frame)) {
66 .remote_id =
uint32_t(frame >> 32) & REMOTE_ID_MASK,
67 .channels = uint16_t(frame >> 16),
68 .command = uint8_t(frame >> 8),