38 ESP_LOGD(TAG,
"Send Keeloq: address=%07" PRIx32
" command=%03x encrypted=%08" PRIx32, data.address, data.command,
40 ESP_LOGV(TAG,
"Send Keeloq: data bits (%d + %d)", NBITS_ENCRYPTED_DATA, NBITS_FIXED_DATA);
43 for (uint8_t cnt = NBITS_PREAMBLE; cnt; cnt--) {
44 dst->
space(BIT_TIME_US);
45 dst->
mark(BIT_TIME_US);
49 dst->
space(10 * BIT_TIME_US);
52 out_data = data.encrypted;
54 ESP_LOGV(TAG,
"Send Keeloq: Encrypted data %04" PRIx32, out_data);
56 for (
uint32_t mask = 1, cnt = 0; cnt < NBITS_ENCRYPTED_DATA; cnt++, mask <<= 1) {
57 if (out_data & mask) {
58 dst->
mark(1 * BIT_TIME_US);
59 dst->
space(2 * BIT_TIME_US);
61 dst->
mark(2 * BIT_TIME_US);
62 dst->
space(1 * BIT_TIME_US);
67 out_data = (data.command & 0x0f);
68 out_data <<= NBITS_SERIAL;
69 out_data |= data.address;
70 ESP_LOGV(TAG,
"Send Keeloq: Fixed data %04" PRIx32, out_data);
72 for (
uint32_t mask = 1, cnt = 0; cnt < (NBITS_FIXED_DATA - 2); cnt++, mask <<= 1) {
73 if (out_data & mask) {
74 dst->
mark(1 * BIT_TIME_US);
75 dst->
space(2 * BIT_TIME_US);
77 dst->
mark(2 * BIT_TIME_US);
78 dst->
space(1 * BIT_TIME_US);
84 dst->
mark(1 * BIT_TIME_US);
85 dst->
space(2 * BIT_TIME_US);
87 dst->
mark(2 * BIT_TIME_US);
88 dst->
space(1 * BIT_TIME_US);
92 dst->
mark(1 * BIT_TIME_US);
93 dst->
space(2 * BIT_TIME_US);
96 dst->
space(39 * BIT_TIME_US);
109 if (
src.size() != (NBITS_PREAMBLE + NBITS_DATA) * 2) {
114 "%2" PRId32
": %" PRId32
" %" PRId32
" %" PRId32
" %" PRId32
" %" PRId32
" %" PRId32
" %" PRId32
" %" PRId32
115 " %" PRId32
" %" PRId32
" %" PRId32
" %" PRId32
" %" PRId32
" %" PRId32
" %" PRId32
" %" PRId32
" %" PRId32
116 " %" PRId32
" %" PRId32
" %" PRId32,
122 int8_t bit = NBITS_PREAMBLE - 1;
124 if (!
src.expect_mark(BIT_TIME_US) || !
src.expect_space(BIT_TIME_US)) {
125 ESP_LOGV(TAG,
"Decode KeeLoq: Fail 1, %d %" PRId32, bit + 1,
src.peek());
129 if (!
src.expect_mark(BIT_TIME_US) || !
src.expect_space(10 * BIT_TIME_US)) {
130 ESP_LOGV(TAG,
"Decode KeeLoq: Fail 1, %d %" PRId32, bit + 1,
src.peek());
136 for (bit = 0; bit < NBITS_ENCRYPTED_DATA; bit++) {
137 if (
src.expect_mark(2 * BIT_TIME_US) &&
src.expect_space(BIT_TIME_US)) {
138 out_data |= 0 << bit;
139 }
else if (
src.expect_mark(BIT_TIME_US) &&
src.expect_space(2 * BIT_TIME_US)) {
140 out_data |= 1 << bit;
142 ESP_LOGV(TAG,
"Decode KeeLoq: Fail 2, %" PRIu32
" %" PRId32,
src.get_index(),
src.peek());
146 ESP_LOGVV(TAG,
"Decode KeeLoq: Data, %d %08" PRIx32, bit, out_data);
147 out.encrypted = out_data;
151 for (bit = 0; bit < NBITS_SERIAL + NBITS_BUTTONS; bit++) {
152 if (
src.expect_mark(2 * BIT_TIME_US) &&
src.expect_space(BIT_TIME_US)) {
153 out_data |= 0 << bit;
154 }
else if (
src.expect_mark(BIT_TIME_US) &&
src.expect_space(2 * BIT_TIME_US)) {
155 out_data |= 1 << bit;
157 ESP_LOGV(TAG,
"Decode KeeLoq: Fail 3, %" PRIu32
" %" PRId32,
src.get_index(),
src.peek());
161 ESP_LOGVV(TAG,
"Decode KeeLoq: Data, %2d %08" PRIx32, bit, out_data);
162 out.command = (out_data >> 28) & 0xf;
163 out.address = out_data & 0xfffffff;
166 if (
src.expect_mark(2 * BIT_TIME_US) &&
src.expect_space(BIT_TIME_US)) {
168 }
else if (
src.expect_mark(BIT_TIME_US) &&
src.expect_space(2 * BIT_TIME_US)) {
171 ESP_LOGV(TAG,
"Decode KeeLoq: Fail 4, %" PRId32,
src.peek());
176 if (
src.expect_mark(2 * BIT_TIME_US) &&
src.peek_space_at_least(BIT_TIME_US)) {
178 }
else if (
src.expect_mark(BIT_TIME_US) &&
src.peek_space_at_least(2 * BIT_TIME_US)) {
181 ESP_LOGV(TAG,
"Decode KeeLoq: Fail 5, %" PRId32,
src.peek());