Sub-GHz: Only fix Linear inverted bits in user interface, keep old remotes compatible (#460)

* Sub-GHz: Fix Linear inverted bits

* Only invert to show correct bits in user interface
This commit is contained in:
WillyJL
2025-08-26 01:59:47 +02:00
committed by GitHub
parent ac96bc3d0d
commit 354dad4af3

View File

@@ -117,33 +117,33 @@ static bool subghz_protocol_encoder_linear_get_upload(SubGhzProtocolEncoderLinea
for(uint8_t i = instance->generic.data_count_bit; i > 1; i--) { for(uint8_t i = instance->generic.data_count_bit; i > 1; i--) {
if(bit_read(instance->generic.data, i - 1)) { if(bit_read(instance->generic.data, i - 1)) {
//send bit 1 //send bit 1
instance->encoder.upload[index++] =
level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_short);
instance->encoder.upload[index++] =
level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_long);
} else {
//send bit 0
instance->encoder.upload[index++] = instance->encoder.upload[index++] =
level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_long); level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_long);
instance->encoder.upload[index++] = instance->encoder.upload[index++] =
level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_short); level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_short);
} else {
//send bit 0
instance->encoder.upload[index++] =
level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_short);
instance->encoder.upload[index++] =
level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_long);
} }
} }
//Send end bit //Send end bit
if(bit_read(instance->generic.data, 0)) { if(bit_read(instance->generic.data, 0)) {
//send bit 1 //send bit 1
instance->encoder.upload[index++] =
level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_short);
//Send gap
instance->encoder.upload[index++] =
level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_short * 44);
} else {
//send bit 0
instance->encoder.upload[index++] = instance->encoder.upload[index++] =
level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_long); level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_long);
//Send gap //Send gap
instance->encoder.upload[index++] = instance->encoder.upload[index++] =
level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_short * 42); level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_short * 42);
} else {
//send bit 0
instance->encoder.upload[index++] =
level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_short);
//Send gap
instance->encoder.upload[index++] =
level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_short * 44);
} }
return true; return true;
@@ -251,11 +251,11 @@ void subghz_protocol_decoder_linear_feed(void* context, bool level, uint32_t dur
} }
if(DURATION_DIFF(instance->decoder.te_last, subghz_protocol_linear_const.te_short) < if(DURATION_DIFF(instance->decoder.te_last, subghz_protocol_linear_const.te_short) <
subghz_protocol_linear_const.te_delta) { subghz_protocol_linear_const.te_delta) {
subghz_protocol_blocks_add_bit(&instance->decoder, 1); subghz_protocol_blocks_add_bit(&instance->decoder, 0);
} else if( } else if(
DURATION_DIFF(instance->decoder.te_last, subghz_protocol_linear_const.te_long) < DURATION_DIFF(instance->decoder.te_last, subghz_protocol_linear_const.te_long) <
subghz_protocol_linear_const.te_delta) { subghz_protocol_linear_const.te_delta) {
subghz_protocol_blocks_add_bit(&instance->decoder, 0); subghz_protocol_blocks_add_bit(&instance->decoder, 1);
} }
if(instance->decoder.decode_count_bit == if(instance->decoder.decode_count_bit ==
subghz_protocol_linear_const.min_count_bit_for_found) { subghz_protocol_linear_const.min_count_bit_for_found) {
@@ -275,14 +275,14 @@ void subghz_protocol_decoder_linear_feed(void* context, bool level, uint32_t dur
subghz_protocol_linear_const.te_delta) && subghz_protocol_linear_const.te_delta) &&
(DURATION_DIFF(duration, subghz_protocol_linear_const.te_long) < (DURATION_DIFF(duration, subghz_protocol_linear_const.te_long) <
subghz_protocol_linear_const.te_delta)) { subghz_protocol_linear_const.te_delta)) {
subghz_protocol_blocks_add_bit(&instance->decoder, 1); subghz_protocol_blocks_add_bit(&instance->decoder, 0);
instance->decoder.parser_step = LinearDecoderStepSaveDuration; instance->decoder.parser_step = LinearDecoderStepSaveDuration;
} else if( } else if(
(DURATION_DIFF(instance->decoder.te_last, subghz_protocol_linear_const.te_long) < (DURATION_DIFF(instance->decoder.te_last, subghz_protocol_linear_const.te_long) <
subghz_protocol_linear_const.te_delta) && subghz_protocol_linear_const.te_delta) &&
(DURATION_DIFF(duration, subghz_protocol_linear_const.te_short) < (DURATION_DIFF(duration, subghz_protocol_linear_const.te_short) <
subghz_protocol_linear_const.te_delta)) { subghz_protocol_linear_const.te_delta)) {
subghz_protocol_blocks_add_bit(&instance->decoder, 0); subghz_protocol_blocks_add_bit(&instance->decoder, 1);
instance->decoder.parser_step = LinearDecoderStepSaveDuration; instance->decoder.parser_step = LinearDecoderStepSaveDuration;
} else { } else {
instance->decoder.parser_step = LinearDecoderStepReset; instance->decoder.parser_step = LinearDecoderStepReset;
@@ -323,12 +323,15 @@ void subghz_protocol_decoder_linear_get_string(void* context, FuriString* output
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderLinear* instance = context; SubGhzProtocolDecoderLinear* instance = context;
uint32_t code_found_lo = instance->generic.data & 0x00000000ffffffff; // Protocol is actually implemented wrong way around, bits are inverted.
// Instead of fixing it and breaking old saved remotes,
// only the display here is inverted to show correct values.
uint32_t code_found_reverse_lo = instance->generic.data & 0x00000000ffffffff;
uint64_t code_found_reverse = subghz_protocol_blocks_reverse_key( uint64_t code_found = subghz_protocol_blocks_reverse_key(
instance->generic.data, instance->generic.data_count_bit); instance->generic.data, instance->generic.data_count_bit);
uint32_t code_found_reverse_lo = code_found_reverse & 0x00000000ffffffff; uint32_t code_found_lo = code_found & 0x00000000ffffffff;
furi_string_cat_printf( furi_string_cat_printf(
output, output,