100 uint16_t khz = CARRIER_KHZ;
105 for (
uint32_t mask = 1UL << (NBITS_PREAMBLE - 1); mask != 0; mask >>= 1) {
106 if (out_data & mask) {
107 dst->
mark(BIT_TIME_US);
109 dst->
space(BIT_TIME_US);
115 for (
uint32_t mask = 1UL << (NBITS_SYNC - 1); mask != 0; mask >>= 1) {
116 if (out_data & mask) {
117 dst->
mark(BIT_TIME_US);
119 dst->
space(BIT_TIME_US);
123 if (data.channel || data.command) {
124 out_data = data.address;
125 out_data <<= NBITS_COMMAND;
126 out_data |= data.command;
127 out_data <<= NBITS_CHANNEL;
128 out_data |= data.channel;
130 out_data = data.address << (NBITS_DATA + NBITS_CHECKSUM);
131 out_data |= (data.data & ((1u << NBITS_DATA) - 1)) << NBITS_CHECKSUM;
132 out_data |= calc_cs(out_data);
134 ESP_LOGD(TAG,
"addr=%04x data=%x channel=%02x command=%02x", data.address, data.data, data.channel, data.command);
135 ESP_LOGV(TAG,
"out_data %07" PRIx32, out_data);
137 for (
uint32_t mask = 1UL << (NBITS_PKT - 1); mask != 0; mask >>= 1) {
138 if (out_data & mask) {
139 dst->
mark(BIT_TIME_US);
140 dst->
space(BIT_TIME_US);
142 dst->
space(BIT_TIME_US);
143 dst->
mark(BIT_TIME_US);
151 while (
src.size() -
src.get_index() >= MIN_RX_SRC) {
153 if (
src.peek_space_at_least(1)) {
158 while (
src.size() -
src.get_index() >= MIN_RX_SRC) {
159 ESP_LOGVV(TAG,
"sync search %" PRIu32
", %" PRId32
" %" PRId32,
src.size() -
src.get_index(),
src.peek(),
161 if (
src.peek_mark(2 * BIT_TIME_US) &&
162 (
src.peek_space(2 * BIT_TIME_US, 1) ||
src.peek_space(3 * BIT_TIME_US, 1))) {
164 ESP_LOGVV(TAG,
"Found SYNC %" PRIu32,
src.get_index());
172 if (
src.size() -
src.get_index() < NBITS_PKT) {
173 ESP_LOGV(TAG,
"Fail1 %" PRIu32,
src.get_index());
181 uint8_t bit = NBITS_PKT - 1;
182 if (
src.expect_space(3 * BIT_TIME_US) && (
src.expect_mark(BIT_TIME_US) ||
src.peek_mark(2 * BIT_TIME_US))) {
183 out_data |= 0 << bit;
184 }
else if (
src.expect_space(2 * BIT_TIME_US) &&
src.expect_mark(BIT_TIME_US) &&
185 (
src.expect_space(BIT_TIME_US) ||
src.peek_space(2 * BIT_TIME_US))) {
186 out_data |= 1 << bit;
188 ESP_LOGVV(TAG,
"Fail2 %" PRId32
" %" PRId32
" %" PRId32,
src.peek(-1),
src.peek(0),
src.peek(1));
196 ESP_LOGVV(TAG,
"Data %2d %08" PRIx32, bit, out_data);
197 if ((
src.expect_space(BIT_TIME_US) ||
src.expect_space(2 * BIT_TIME_US)) &&
198 (
src.expect_mark(BIT_TIME_US) ||
src.peek_mark(2 * BIT_TIME_US))) {
199 out_data |= 0 << bit;
200 }
else if ((
src.expect_mark(BIT_TIME_US) ||
src.expect_mark(2 * BIT_TIME_US)) &&
201 (
src.expect_space(BIT_TIME_US) ||
src.peek_space(2 * BIT_TIME_US))) {
202 out_data |= 1 << bit;
209 ESP_LOGVV(TAG,
"Fail3 %" PRId32
" %" PRId32
" %" PRId32,
src.peek(-1),
src.peek(0),
src.peek(1));
213 if (
src.expect_space(BIT_TIME_US) ||
src.expect_space(2 * BIT_TIME_US)) {
215 }
else if (
src.expect_mark(BIT_TIME_US) ||
src.expect_mark(2 * BIT_TIME_US)) {
221 uint8_t cs = out_data & 0xFF;
222 uint8_t expected_cs = calc_cs(out_data);
224 if (cs != expected_cs) {
225 ESP_LOGV(TAG,
"Dropped %07" PRIx32
": checksum 0x%02x, expected 0x%02x", out_data, cs, expected_cs);
229 ESP_LOGV(TAG,
"Data %07" PRIx32, out_data);
231 out.data = (out_data >> NBITS_CHECKSUM) & ((1u << NBITS_DATA) - 1);
232 out.address = out_data >> (NBITS_CHECKSUM + NBITS_DATA);
233 out.channel = out_data & ((1u << NBITS_CHANNEL) - 1);
234 out.command = (out_data >> NBITS_CHANNEL) & ((1u << NBITS_COMMAND) - 1);