[FL-1800] IRDA: enc/decoder refactoring, Add NEC42 (#705)

* WIP: IRDA: multilen protocol refactoring, NEC42
* IRDA: Refactoring encoder/decoder

Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
Albert Kharisov
2021-09-15 20:22:58 +03:00
committed by GitHub
parent 4768177cf5
commit 4f233ff0a3
21 changed files with 551 additions and 437 deletions

View File

@@ -50,39 +50,35 @@ bool irda_decoder_rc6_interpret(IrdaCommonDecoder* decoder) {
* it separately and than pass decoding for other bits to
* common manchester decode function.
*/
IrdaStatus irda_decoder_rc6_decode_manchester(IrdaCommonDecoder* decoder) {
IrdaStatus irda_decoder_rc6_decode_manchester(IrdaCommonDecoder* decoder, bool level, uint32_t timing) {
// 4th bit lasts 2x times more
IrdaStatus status = IrdaStatusError;
uint16_t bit = decoder->protocol->timings.bit1_mark;
uint16_t tolerance = decoder->protocol->timings.bit_tolerance;
uint16_t timing = decoder->timings[0];
bool single_timing = MATCH_TIMING(timing, bit, tolerance);
bool double_timing = MATCH_TIMING(timing, 2*bit, tolerance);
bool triple_timing = MATCH_TIMING(timing, 3*bit, tolerance);
if (decoder->databit_cnt == 4) {
furi_assert(decoder->timings_cnt == 1);
furi_assert(decoder->switch_detect == true);
if (single_timing ^ triple_timing) {
--decoder->timings_cnt;
++decoder->databit_cnt;
decoder->data[0] |= (single_timing ? !decoder->level : decoder->level) << 4;
decoder->data[0] |= (single_timing ? !level : level) << 4;
status = IrdaStatusOk;
}
} else if (decoder->databit_cnt == 5) {
if (single_timing || triple_timing) {
if (triple_timing)
decoder->timings[0] = bit;
timing = bit;
decoder->switch_detect = false;
status = irda_common_decode_manchester(decoder);
status = irda_common_decode_manchester(decoder, level, timing);
} else if (double_timing) {
--decoder->timings_cnt;
status = IrdaStatusOk;
}
} else {
status = irda_common_decode_manchester(decoder);
status = irda_common_decode_manchester(decoder, level, timing);
}
return status;

View File

@@ -24,6 +24,7 @@ void irda_encoder_rc6_reset(void* encoder_ptr, const IrdaMessage* message) {
*data |= reverse(message->address) << 5;
*data |= reverse(message->command) << 13;
common_encoder->bits_to_encode = common_encoder->protocol->databit_len[0];
encoder->toggle_bit ^= 1;
}