[FL-2706, FL-2709] SubGhz: checking saved key files for length (#1485)

* [FL-2706] SubGhz: checking saved key files for length
* SubGhz: fix RAW file upload error
* [FL-2709] GubGhz: RAW screen fix

Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
Skorpionm 2022-08-01 16:24:21 +04:00 committed by GitHub
parent 84550d5878
commit 4da6eba395
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
28 changed files with 390 additions and 46 deletions

View file

@ -331,8 +331,10 @@ bool subghz_key_load(SubGhz* subghz, const char* file_path, bool show_dialog) {
subghz->txrx->decoder_result = subghz_receiver_search_decoder_base_by_name( subghz->txrx->decoder_result = subghz_receiver_search_decoder_base_by_name(
subghz->txrx->receiver, string_get_cstr(temp_str)); subghz->txrx->receiver, string_get_cstr(temp_str));
if(subghz->txrx->decoder_result) { if(subghz->txrx->decoder_result) {
subghz_protocol_decoder_base_deserialize( if(!subghz_protocol_decoder_base_deserialize(
subghz->txrx->decoder_result, subghz->txrx->fff_data); subghz->txrx->decoder_result, subghz->txrx->fff_data)) {
break;
}
} else { } else {
FURI_LOG_E(TAG, "Protocol not found"); FURI_LOG_E(TAG, "Protocol not found");
break; break;

View file

@ -216,8 +216,8 @@ void subghz_read_raw_draw(Canvas* canvas, SubGhzReadRAWModel* model) {
uint8_t graphics_mode = 1; uint8_t graphics_mode = 1;
canvas_set_color(canvas, ColorBlack); canvas_set_color(canvas, ColorBlack);
canvas_set_font(canvas, FontSecondary); canvas_set_font(canvas, FontSecondary);
canvas_draw_str(canvas, 5, 8, string_get_cstr(model->frequency_str)); canvas_draw_str(canvas, 5, 7, string_get_cstr(model->frequency_str));
canvas_draw_str(canvas, 40, 8, string_get_cstr(model->preset_str)); canvas_draw_str(canvas, 40, 7, string_get_cstr(model->preset_str));
canvas_draw_str_aligned( canvas_draw_str_aligned(
canvas, 126, 0, AlignRight, AlignTop, string_get_cstr(model->sample_write)); canvas, 126, 0, AlignRight, AlignTop, string_get_cstr(model->sample_write));

View file

@ -145,7 +145,13 @@ bool subghz_protocol_encoder_came_deserialize(void* context, FlipperFormat* flip
FURI_LOG_E(TAG, "Deserialize error"); FURI_LOG_E(TAG, "Deserialize error");
break; break;
} }
if((instance->generic.data_count_bit !=
subghz_protocol_came_const.min_count_bit_for_found) &&
(instance->generic.data_count_bit !=
2 * subghz_protocol_came_const.min_count_bit_for_found)) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
//optional parameter parameter //optional parameter parameter
flipper_format_read_uint32( flipper_format_read_uint32(
flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
@ -293,7 +299,21 @@ bool subghz_protocol_decoder_came_serialize(
bool subghz_protocol_decoder_came_deserialize(void* context, FlipperFormat* flipper_format) { bool subghz_protocol_decoder_came_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderCame* instance = context; SubGhzProtocolDecoderCame* instance = context;
return subghz_block_generic_deserialize(&instance->generic, flipper_format); bool ret = false;
do {
if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if((instance->generic.data_count_bit !=
subghz_protocol_came_const.min_count_bit_for_found) &&
(instance->generic.data_count_bit !=
2 * subghz_protocol_came_const.min_count_bit_for_found)) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
} }
void subghz_protocol_decoder_came_get_string(void* context, string_t output) { void subghz_protocol_decoder_came_get_string(void* context, string_t output) {

View file

@ -310,7 +310,19 @@ bool subghz_protocol_decoder_came_atomo_serialize(
bool subghz_protocol_decoder_came_atomo_deserialize(void* context, FlipperFormat* flipper_format) { bool subghz_protocol_decoder_came_atomo_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderCameAtomo* instance = context; SubGhzProtocolDecoderCameAtomo* instance = context;
return subghz_block_generic_deserialize(&instance->generic, flipper_format); bool ret = false;
do {
if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if(instance->generic.data_count_bit !=
subghz_protocol_came_atomo_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
} }
void subghz_protocol_decoder_came_atomo_get_string(void* context, string_t output) { void subghz_protocol_decoder_came_atomo_get_string(void* context, string_t output) {

View file

@ -250,7 +250,11 @@ bool subghz_protocol_encoder_came_twee_deserialize(void* context, FlipperFormat*
FURI_LOG_E(TAG, "Deserialize error"); FURI_LOG_E(TAG, "Deserialize error");
break; break;
} }
if(instance->generic.data_count_bit !=
subghz_protocol_came_twee_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
//optional parameter parameter //optional parameter parameter
flipper_format_read_uint32( flipper_format_read_uint32(
flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
@ -427,7 +431,19 @@ bool subghz_protocol_decoder_came_twee_serialize(
bool subghz_protocol_decoder_came_twee_deserialize(void* context, FlipperFormat* flipper_format) { bool subghz_protocol_decoder_came_twee_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderCameTwee* instance = context; SubGhzProtocolDecoderCameTwee* instance = context;
return subghz_block_generic_deserialize(&instance->generic, flipper_format); bool ret = false;
do {
if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if(instance->generic.data_count_bit !=
subghz_protocol_came_twee_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
} }
void subghz_protocol_decoder_came_twee_get_string(void* context, string_t output) { void subghz_protocol_decoder_came_twee_get_string(void* context, string_t output) {

View file

@ -215,7 +215,11 @@ bool subghz_protocol_encoder_chamb_code_deserialize(void* context, FlipperFormat
FURI_LOG_E(TAG, "Deserialize error"); FURI_LOG_E(TAG, "Deserialize error");
break; break;
} }
if(instance->generic.data_count_bit <
subghz_protocol_chamb_code_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
//optional parameter parameter //optional parameter parameter
flipper_format_read_uint32( flipper_format_read_uint32(
flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
@ -432,7 +436,19 @@ bool subghz_protocol_decoder_chamb_code_serialize(
bool subghz_protocol_decoder_chamb_code_deserialize(void* context, FlipperFormat* flipper_format) { bool subghz_protocol_decoder_chamb_code_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderChamb_Code* instance = context; SubGhzProtocolDecoderChamb_Code* instance = context;
return subghz_block_generic_deserialize(&instance->generic, flipper_format); bool ret = false;
do {
if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if(instance->generic.data_count_bit <
subghz_protocol_chamb_code_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
} }
void subghz_protocol_decoder_chamb_code_get_string(void* context, string_t output) { void subghz_protocol_decoder_chamb_code_get_string(void* context, string_t output) {

View file

@ -115,7 +115,7 @@ void subghz_protocol_decoder_faac_slh_feed(void* context, bool level, uint32_t d
if(duration >= ((uint32_t)subghz_protocol_faac_slh_const.te_short * 3 + if(duration >= ((uint32_t)subghz_protocol_faac_slh_const.te_short * 3 +
subghz_protocol_faac_slh_const.te_delta)) { subghz_protocol_faac_slh_const.te_delta)) {
instance->decoder.parser_step = FaacSLHDecoderStepFoundPreambula; instance->decoder.parser_step = FaacSLHDecoderStepFoundPreambula;
if(instance->decoder.decode_count_bit >= if(instance->decoder.decode_count_bit ==
subghz_protocol_faac_slh_const.min_count_bit_for_found) { subghz_protocol_faac_slh_const.min_count_bit_for_found) {
instance->generic.data = instance->decoder.decode_data; instance->generic.data = instance->decoder.decode_data;
instance->generic.data_count_bit = instance->decoder.decode_count_bit; instance->generic.data_count_bit = instance->decoder.decode_count_bit;
@ -192,7 +192,19 @@ bool subghz_protocol_decoder_faac_slh_serialize(
bool subghz_protocol_decoder_faac_slh_deserialize(void* context, FlipperFormat* flipper_format) { bool subghz_protocol_decoder_faac_slh_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderFaacSLH* instance = context; SubGhzProtocolDecoderFaacSLH* instance = context;
return subghz_block_generic_deserialize(&instance->generic, flipper_format); bool ret = false;
do {
if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if(instance->generic.data_count_bit !=
subghz_protocol_faac_slh_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
} }
void subghz_protocol_decoder_faac_slh_get_string(void* context, string_t output) { void subghz_protocol_decoder_faac_slh_get_string(void* context, string_t output) {

View file

@ -138,7 +138,11 @@ bool subghz_protocol_encoder_gate_tx_deserialize(void* context, FlipperFormat* f
FURI_LOG_E(TAG, "Deserialize error"); FURI_LOG_E(TAG, "Deserialize error");
break; break;
} }
if(instance->generic.data_count_bit !=
subghz_protocol_gate_tx_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
//optional parameter parameter //optional parameter parameter
flipper_format_read_uint32( flipper_format_read_uint32(
flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
@ -298,7 +302,19 @@ bool subghz_protocol_decoder_gate_tx_serialize(
bool subghz_protocol_decoder_gate_tx_deserialize(void* context, FlipperFormat* flipper_format) { bool subghz_protocol_decoder_gate_tx_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderGateTx* instance = context; SubGhzProtocolDecoderGateTx* instance = context;
return subghz_block_generic_deserialize(&instance->generic, flipper_format); bool ret = false;
do {
if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if(instance->generic.data_count_bit !=
subghz_protocol_gate_tx_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
} }
void subghz_protocol_decoder_gate_tx_get_string(void* context, string_t output) { void subghz_protocol_decoder_gate_tx_get_string(void* context, string_t output) {

View file

@ -151,7 +151,11 @@ bool subghz_protocol_encoder_holtek_deserialize(void* context, FlipperFormat* fl
FURI_LOG_E(TAG, "Deserialize error"); FURI_LOG_E(TAG, "Deserialize error");
break; break;
} }
if(instance->generic.data_count_bit !=
subghz_protocol_holtek_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
//optional parameter parameter //optional parameter parameter
flipper_format_read_uint32( flipper_format_read_uint32(
flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
@ -331,7 +335,19 @@ bool subghz_protocol_decoder_holtek_serialize(
bool subghz_protocol_decoder_holtek_deserialize(void* context, FlipperFormat* flipper_format) { bool subghz_protocol_decoder_holtek_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderHoltek* instance = context; SubGhzProtocolDecoderHoltek* instance = context;
return subghz_block_generic_deserialize(&instance->generic, flipper_format); bool ret = false;
do {
if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if(instance->generic.data_count_bit !=
subghz_protocol_holtek_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
} }
void subghz_protocol_decoder_holtek_get_string(void* context, string_t output) { void subghz_protocol_decoder_holtek_get_string(void* context, string_t output) {

View file

@ -154,7 +154,11 @@ bool subghz_protocol_encoder_hormann_deserialize(void* context, FlipperFormat* f
FURI_LOG_E(TAG, "Deserialize error"); FURI_LOG_E(TAG, "Deserialize error");
break; break;
} }
if(instance->generic.data_count_bit !=
subghz_protocol_hormann_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
//optional parameter parameter //optional parameter parameter
flipper_format_read_uint32( flipper_format_read_uint32(
flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
@ -319,7 +323,19 @@ bool subghz_protocol_decoder_hormann_serialize(
bool subghz_protocol_decoder_hormann_deserialize(void* context, FlipperFormat* flipper_format) { bool subghz_protocol_decoder_hormann_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderHormann* instance = context; SubGhzProtocolDecoderHormann* instance = context;
return subghz_block_generic_deserialize(&instance->generic, flipper_format); bool ret = false;
do {
if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if(instance->generic.data_count_bit !=
subghz_protocol_hormann_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
} }
void subghz_protocol_decoder_hormann_get_string(void* context, string_t output) { void subghz_protocol_decoder_hormann_get_string(void* context, string_t output) {

View file

@ -191,7 +191,18 @@ bool subghz_protocol_decoder_ido_serialize(
bool subghz_protocol_decoder_ido_deserialize(void* context, FlipperFormat* flipper_format) { bool subghz_protocol_decoder_ido_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderIDo* instance = context; SubGhzProtocolDecoderIDo* instance = context;
return subghz_block_generic_deserialize(&instance->generic, flipper_format); bool ret = false;
do {
if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if(instance->generic.data_count_bit != subghz_protocol_ido_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
} }
void subghz_protocol_decoder_ido_get_string(void* context, string_t output) { void subghz_protocol_decoder_ido_get_string(void* context, string_t output) {

View file

@ -264,7 +264,11 @@ bool subghz_protocol_encoder_keeloq_deserialize(void* context, FlipperFormat* fl
FURI_LOG_E(TAG, "Deserialize error"); FURI_LOG_E(TAG, "Deserialize error");
break; break;
} }
if(instance->generic.data_count_bit !=
subghz_protocol_keeloq_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
subghz_protocol_keeloq_check_remote_controller( subghz_protocol_keeloq_check_remote_controller(
&instance->generic, instance->keystore, &instance->manufacture_name); &instance->generic, instance->keystore, &instance->manufacture_name);
@ -656,6 +660,11 @@ bool subghz_protocol_decoder_keeloq_deserialize(void* context, FlipperFormat* fl
FURI_LOG_E(TAG, "Deserialize error"); FURI_LOG_E(TAG, "Deserialize error");
break; break;
} }
if(instance->generic.data_count_bit !=
subghz_protocol_keeloq_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
res = true; res = true;
} while(false); } while(false);

View file

@ -12,7 +12,7 @@ static const SubGhzBlockConst subghz_protocol_kia_const = {
.te_short = 250, .te_short = 250,
.te_long = 500, .te_long = 500,
.te_delta = 100, .te_delta = 100,
.min_count_bit_for_found = 60, .min_count_bit_for_found = 61,
}; };
struct SubGhzProtocolDecoderKIA { struct SubGhzProtocolDecoderKIA {
@ -145,7 +145,7 @@ void subghz_protocol_decoder_kia_feed(void* context, bool level, uint32_t durati
(uint32_t)(subghz_protocol_kia_const.te_long + subghz_protocol_kia_const.te_delta * 2)) { (uint32_t)(subghz_protocol_kia_const.te_long + subghz_protocol_kia_const.te_delta * 2)) {
//Found stop bit //Found stop bit
instance->decoder.parser_step = KIADecoderStepReset; instance->decoder.parser_step = KIADecoderStepReset;
if(instance->decoder.decode_count_bit >= if(instance->decoder.decode_count_bit ==
subghz_protocol_kia_const.min_count_bit_for_found) { subghz_protocol_kia_const.min_count_bit_for_found) {
instance->generic.data = instance->decoder.decode_data; instance->generic.data = instance->decoder.decode_data;
instance->generic.data_count_bit = instance->decoder.decode_count_bit; instance->generic.data_count_bit = instance->decoder.decode_count_bit;
@ -242,7 +242,18 @@ bool subghz_protocol_decoder_kia_serialize(
bool subghz_protocol_decoder_kia_deserialize(void* context, FlipperFormat* flipper_format) { bool subghz_protocol_decoder_kia_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderKIA* instance = context; SubGhzProtocolDecoderKIA* instance = context;
return subghz_block_generic_deserialize(&instance->generic, flipper_format); bool ret = false;
do {
if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if(instance->generic.data_count_bit != subghz_protocol_kia_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
} }
void subghz_protocol_decoder_kia_get_string(void* context, string_t output) { void subghz_protocol_decoder_kia_get_string(void* context, string_t output) {

View file

@ -156,7 +156,11 @@ bool subghz_protocol_encoder_linear_deserialize(void* context, FlipperFormat* fl
FURI_LOG_E(TAG, "Deserialize error"); FURI_LOG_E(TAG, "Deserialize error");
break; break;
} }
if(instance->generic.data_count_bit !=
subghz_protocol_linear_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
//optional parameter parameter //optional parameter parameter
flipper_format_read_uint32( flipper_format_read_uint32(
flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
@ -308,7 +312,19 @@ bool subghz_protocol_decoder_linear_serialize(
bool subghz_protocol_decoder_linear_deserialize(void* context, FlipperFormat* flipper_format) { bool subghz_protocol_decoder_linear_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderLinear* instance = context; SubGhzProtocolDecoderLinear* instance = context;
return subghz_block_generic_deserialize(&instance->generic, flipper_format); bool ret = false;
do {
if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if(instance->generic.data_count_bit !=
subghz_protocol_linear_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
} }
void subghz_protocol_decoder_linear_get_string(void* context, string_t output) { void subghz_protocol_decoder_linear_get_string(void* context, string_t output) {

View file

@ -184,7 +184,11 @@ bool subghz_protocol_encoder_megacode_deserialize(void* context, FlipperFormat*
FURI_LOG_E(TAG, "Deserialize error"); FURI_LOG_E(TAG, "Deserialize error");
break; break;
} }
if(instance->generic.data_count_bit !=
subghz_protocol_megacode_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
//optional parameter parameter //optional parameter parameter
flipper_format_read_uint32( flipper_format_read_uint32(
flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
@ -270,7 +274,7 @@ void subghz_protocol_decoder_megacode_feed(void* context, bool level, uint32_t d
if(!level) { //save interval if(!level) { //save interval
if(duration >= (subghz_protocol_megacode_const.te_short * 10)) { if(duration >= (subghz_protocol_megacode_const.te_short * 10)) {
instance->decoder.parser_step = MegaCodeDecoderStepReset; instance->decoder.parser_step = MegaCodeDecoderStepReset;
if(instance->decoder.decode_count_bit >= if(instance->decoder.decode_count_bit ==
subghz_protocol_megacode_const.min_count_bit_for_found) { subghz_protocol_megacode_const.min_count_bit_for_found) {
instance->generic.data = instance->decoder.decode_data; instance->generic.data = instance->decoder.decode_data;
instance->generic.data_count_bit = instance->decoder.decode_count_bit; instance->generic.data_count_bit = instance->decoder.decode_count_bit;
@ -389,7 +393,19 @@ bool subghz_protocol_decoder_megacode_serialize(
bool subghz_protocol_decoder_megacode_deserialize(void* context, FlipperFormat* flipper_format) { bool subghz_protocol_decoder_megacode_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderMegaCode* instance = context; SubGhzProtocolDecoderMegaCode* instance = context;
return subghz_block_generic_deserialize(&instance->generic, flipper_format); bool ret = false;
do {
if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if(instance->generic.data_count_bit !=
subghz_protocol_megacode_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
} }
void subghz_protocol_decoder_megacode_get_string(void* context, string_t output) { void subghz_protocol_decoder_megacode_get_string(void* context, string_t output) {

View file

@ -163,7 +163,11 @@ bool subghz_protocol_encoder_nero_radio_deserialize(void* context, FlipperFormat
FURI_LOG_E(TAG, "Deserialize error"); FURI_LOG_E(TAG, "Deserialize error");
break; break;
} }
if(instance->generic.data_count_bit !=
subghz_protocol_nero_radio_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
//optional parameter parameter //optional parameter parameter
flipper_format_read_uint32( flipper_format_read_uint32(
flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
@ -294,7 +298,7 @@ void subghz_protocol_decoder_nero_radio_feed(void* context, bool level, uint32_t
subghz_protocol_blocks_add_bit(&instance->decoder, 1); subghz_protocol_blocks_add_bit(&instance->decoder, 1);
} }
instance->decoder.parser_step = NeroRadioDecoderStepReset; instance->decoder.parser_step = NeroRadioDecoderStepReset;
if(instance->decoder.decode_count_bit >= if(instance->decoder.decode_count_bit ==
subghz_protocol_nero_radio_const.min_count_bit_for_found) { subghz_protocol_nero_radio_const.min_count_bit_for_found) {
instance->generic.data = instance->decoder.decode_data; instance->generic.data = instance->decoder.decode_data;
instance->generic.data_count_bit = instance->decoder.decode_count_bit; instance->generic.data_count_bit = instance->decoder.decode_count_bit;
@ -351,7 +355,19 @@ bool subghz_protocol_decoder_nero_radio_serialize(
bool subghz_protocol_decoder_nero_radio_deserialize(void* context, FlipperFormat* flipper_format) { bool subghz_protocol_decoder_nero_radio_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderNeroRadio* instance = context; SubGhzProtocolDecoderNeroRadio* instance = context;
return subghz_block_generic_deserialize(&instance->generic, flipper_format); bool ret = false;
do {
if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if(instance->generic.data_count_bit !=
subghz_protocol_nero_radio_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
} }
void subghz_protocol_decoder_nero_radio_get_string(void* context, string_t output) { void subghz_protocol_decoder_nero_radio_get_string(void* context, string_t output) {

View file

@ -157,7 +157,11 @@ bool subghz_protocol_encoder_nero_sketch_deserialize(void* context, FlipperForma
FURI_LOG_E(TAG, "Deserialize error"); FURI_LOG_E(TAG, "Deserialize error");
break; break;
} }
if(instance->generic.data_count_bit !=
subghz_protocol_nero_sketch_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
//optional parameter parameter //optional parameter parameter
flipper_format_read_uint32( flipper_format_read_uint32(
flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
@ -271,7 +275,7 @@ void subghz_protocol_decoder_nero_sketch_feed(void* context, bool level, uint32_
subghz_protocol_nero_sketch_const.te_delta * 2)) { subghz_protocol_nero_sketch_const.te_delta * 2)) {
//Found stop bit //Found stop bit
instance->decoder.parser_step = NeroSketchDecoderStepReset; instance->decoder.parser_step = NeroSketchDecoderStepReset;
if(instance->decoder.decode_count_bit >= if(instance->decoder.decode_count_bit ==
subghz_protocol_nero_sketch_const.min_count_bit_for_found) { subghz_protocol_nero_sketch_const.min_count_bit_for_found) {
instance->generic.data = instance->decoder.decode_data; instance->generic.data = instance->decoder.decode_data;
instance->generic.data_count_bit = instance->decoder.decode_count_bit; instance->generic.data_count_bit = instance->decoder.decode_count_bit;
@ -336,7 +340,19 @@ bool subghz_protocol_decoder_nero_sketch_serialize(
bool subghz_protocol_decoder_nero_sketch_deserialize(void* context, FlipperFormat* flipper_format) { bool subghz_protocol_decoder_nero_sketch_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderNeroSketch* instance = context; SubGhzProtocolDecoderNeroSketch* instance = context;
return subghz_block_generic_deserialize(&instance->generic, flipper_format); bool ret = false;
do {
if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if(instance->generic.data_count_bit !=
subghz_protocol_nero_sketch_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
} }
void subghz_protocol_decoder_nero_sketch_get_string(void* context, string_t output) { void subghz_protocol_decoder_nero_sketch_get_string(void* context, string_t output) {

View file

@ -138,7 +138,13 @@ bool subghz_protocol_encoder_nice_flo_deserialize(void* context, FlipperFormat*
FURI_LOG_E(TAG, "Deserialize error"); FURI_LOG_E(TAG, "Deserialize error");
break; break;
} }
if((instance->generic.data_count_bit !=
subghz_protocol_nice_flo_const.min_count_bit_for_found) &&
(instance->generic.data_count_bit !=
2 * subghz_protocol_nice_flo_const.min_count_bit_for_found)) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
//optional parameter parameter //optional parameter parameter
flipper_format_read_uint32( flipper_format_read_uint32(
flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
@ -286,7 +292,21 @@ bool subghz_protocol_decoder_nice_flo_serialize(
bool subghz_protocol_decoder_nice_flo_deserialize(void* context, FlipperFormat* flipper_format) { bool subghz_protocol_decoder_nice_flo_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderNiceFlo* instance = context; SubGhzProtocolDecoderNiceFlo* instance = context;
return subghz_block_generic_deserialize(&instance->generic, flipper_format); bool ret = false;
do {
if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if((instance->generic.data_count_bit !=
subghz_protocol_nice_flo_const.min_count_bit_for_found) &&
(instance->generic.data_count_bit !=
2 * subghz_protocol_nice_flo_const.min_count_bit_for_found)) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
} }
void subghz_protocol_decoder_nice_flo_get_string(void* context, string_t output) { void subghz_protocol_decoder_nice_flo_get_string(void* context, string_t output) {

View file

@ -237,7 +237,7 @@ void subghz_protocol_decoder_nice_flor_s_feed(void* context, bool level, uint32_
subghz_protocol_nice_flor_s_const.te_delta) { subghz_protocol_nice_flor_s_const.te_delta) {
//Found STOP bit //Found STOP bit
instance->decoder.parser_step = NiceFlorSDecoderStepReset; instance->decoder.parser_step = NiceFlorSDecoderStepReset;
if(instance->decoder.decode_count_bit >= if(instance->decoder.decode_count_bit ==
subghz_protocol_nice_flor_s_const.min_count_bit_for_found) { subghz_protocol_nice_flor_s_const.min_count_bit_for_found) {
instance->generic.data = instance->decoder.decode_data; instance->generic.data = instance->decoder.decode_data;
instance->generic.data_count_bit = instance->decoder.decode_count_bit; instance->generic.data_count_bit = instance->decoder.decode_count_bit;
@ -339,7 +339,19 @@ bool subghz_protocol_decoder_nice_flor_s_serialize(
bool subghz_protocol_decoder_nice_flor_s_deserialize(void* context, FlipperFormat* flipper_format) { bool subghz_protocol_decoder_nice_flor_s_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderNiceFlorS* instance = context; SubGhzProtocolDecoderNiceFlorS* instance = context;
return subghz_block_generic_deserialize(&instance->generic, flipper_format); bool ret = false;
do {
if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if(instance->generic.data_count_bit !=
subghz_protocol_nice_flor_s_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
} }
void subghz_protocol_decoder_nice_flor_s_get_string(void* context, string_t output) { void subghz_protocol_decoder_nice_flor_s_get_string(void* context, string_t output) {

View file

@ -201,7 +201,11 @@ bool subghz_protocol_encoder_power_smart_deserialize(void* context, FlipperForma
FURI_LOG_E(TAG, "Deserialize error"); FURI_LOG_E(TAG, "Deserialize error");
break; break;
} }
if(instance->generic.data_count_bit !=
subghz_protocol_power_smart_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
//optional parameter parameter //optional parameter parameter
flipper_format_read_uint32( flipper_format_read_uint32(
flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
@ -354,7 +358,19 @@ bool subghz_protocol_decoder_power_smart_serialize(
bool subghz_protocol_decoder_power_smart_deserialize(void* context, FlipperFormat* flipper_format) { bool subghz_protocol_decoder_power_smart_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderPowerSmart* instance = context; SubGhzProtocolDecoderPowerSmart* instance = context;
return subghz_block_generic_deserialize(&instance->generic, flipper_format); bool ret = false;
do {
if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if(instance->generic.data_count_bit !=
subghz_protocol_power_smart_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
} }
void subghz_protocol_decoder_power_smart_get_string(void* context, string_t output) { void subghz_protocol_decoder_power_smart_get_string(void* context, string_t output) {

View file

@ -158,6 +158,11 @@ bool subghz_protocol_encoder_princeton_deserialize(void* context, FlipperFormat*
FURI_LOG_E(TAG, "Missing TE"); FURI_LOG_E(TAG, "Missing TE");
break; break;
} }
if(instance->generic.data_count_bit !=
subghz_protocol_princeton_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
//optional parameter parameter //optional parameter parameter
flipper_format_read_uint32( flipper_format_read_uint32(
flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
@ -320,6 +325,11 @@ bool subghz_protocol_decoder_princeton_deserialize(void* context, FlipperFormat*
FURI_LOG_E(TAG, "Deserialize error"); FURI_LOG_E(TAG, "Deserialize error");
break; break;
} }
if(instance->generic.data_count_bit !=
subghz_protocol_princeton_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
if(!flipper_format_rewind(flipper_format)) { if(!flipper_format_rewind(flipper_format)) {
FURI_LOG_E(TAG, "Rewind error"); FURI_LOG_E(TAG, "Rewind error");
break; break;

View file

@ -57,6 +57,7 @@ const SubGhzProtocolDecoder subghz_protocol_raw_decoder = {
.get_hash_data = NULL, .get_hash_data = NULL,
.serialize = NULL, .serialize = NULL,
.deserialize = subghz_protocol_decoder_raw_deserialize,
.get_string = subghz_protocol_decoder_raw_get_string, .get_string = subghz_protocol_decoder_raw_get_string,
}; };
@ -246,9 +247,18 @@ void subghz_protocol_decoder_raw_feed(void* context, bool level, uint32_t durati
} }
} }
bool subghz_protocol_decoder_raw_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context);
UNUSED(context);
UNUSED(flipper_format);
//ToDo stub, for backwards compatibility
return true;
}
void subghz_protocol_decoder_raw_get_string(void* context, string_t output) { void subghz_protocol_decoder_raw_get_string(void* context, string_t output) {
furi_assert(context); furi_assert(context);
//SubGhzProtocolDecoderRAW* instance = context; //SubGhzProtocolDecoderRAW* instance = context;
UNUSED(context);
//ToDo no use //ToDo no use
string_cat_printf(output, "RAW Date"); string_cat_printf(output, "RAW Date");
} }

View file

@ -65,6 +65,14 @@ void subghz_protocol_decoder_raw_reset(void* context);
*/ */
void subghz_protocol_decoder_raw_feed(void* context, bool level, uint32_t duration); void subghz_protocol_decoder_raw_feed(void* context, bool level, uint32_t duration);
/**
* Deserialize data SubGhzProtocolDecoderRAW.
* @param context Pointer to a SubGhzProtocolDecoderRAW instance
* @param flipper_format Pointer to a FlipperFormat instance
* @return true On success
*/
bool subghz_protocol_decoder_raw_deserialize(void* context, FlipperFormat* flipper_format);
/** /**
* Getting a textual representation of the received data. * Getting a textual representation of the received data.
* @param context Pointer to a SubGhzProtocolDecoderRAW instance * @param context Pointer to a SubGhzProtocolDecoderRAW instance

View file

@ -273,7 +273,11 @@ bool subghz_protocol_encoder_secplus_v1_deserialize(void* context, FlipperFormat
FURI_LOG_E(TAG, "Deserialize error"); FURI_LOG_E(TAG, "Deserialize error");
break; break;
} }
if(instance->generic.data_count_bit !=
2 * subghz_protocol_secplus_v1_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
//optional parameter parameter //optional parameter parameter
flipper_format_read_uint32( flipper_format_read_uint32(
flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
@ -524,7 +528,19 @@ bool subghz_protocol_decoder_secplus_v1_serialize(
bool subghz_protocol_decoder_secplus_v1_deserialize(void* context, FlipperFormat* flipper_format) { bool subghz_protocol_decoder_secplus_v1_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderSecPlus_v1* instance = context; SubGhzProtocolDecoderSecPlus_v1* instance = context;
return subghz_block_generic_deserialize(&instance->generic, flipper_format); bool ret = false;
do {
if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if(instance->generic.data_count_bit !=
2 * subghz_protocol_secplus_v1_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
} }
bool subghz_protocol_secplus_v1_check_fixed(uint32_t fixed) { bool subghz_protocol_secplus_v1_check_fixed(uint32_t fixed) {

View file

@ -514,7 +514,11 @@ bool subghz_protocol_encoder_secplus_v2_deserialize(void* context, FlipperFormat
FURI_LOG_E(TAG, "Deserialize error"); FURI_LOG_E(TAG, "Deserialize error");
break; break;
} }
if(instance->generic.data_count_bit !=
subghz_protocol_secplus_v2_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
uint8_t key_data[sizeof(uint64_t)] = {0}; uint8_t key_data[sizeof(uint64_t)] = {0};
if(!flipper_format_read_hex( if(!flipper_format_read_hex(
flipper_format, "Secplus_packet_1", key_data, sizeof(uint64_t))) { flipper_format, "Secplus_packet_1", key_data, sizeof(uint64_t))) {
@ -689,7 +693,7 @@ void subghz_protocol_decoder_secplus_v2_feed(void* context, bool level, uint32_t
} else if( } else if(
duration >= (uint32_t)(subghz_protocol_secplus_v2_const.te_long * 2 + duration >= (uint32_t)(subghz_protocol_secplus_v2_const.te_long * 2 +
subghz_protocol_secplus_v2_const.te_delta)) { subghz_protocol_secplus_v2_const.te_delta)) {
if(instance->decoder.decode_count_bit >= if(instance->decoder.decode_count_bit ==
subghz_protocol_secplus_v2_const.min_count_bit_for_found) { subghz_protocol_secplus_v2_const.min_count_bit_for_found) {
instance->generic.data = instance->decoder.decode_data; instance->generic.data = instance->decoder.decode_data;
instance->generic.data_count_bit = instance->decoder.decode_count_bit; instance->generic.data_count_bit = instance->decoder.decode_count_bit;
@ -782,6 +786,11 @@ bool subghz_protocol_decoder_secplus_v2_deserialize(void* context, FlipperFormat
FURI_LOG_E(TAG, "Deserialize error"); FURI_LOG_E(TAG, "Deserialize error");
break; break;
} }
if(instance->generic.data_count_bit !=
subghz_protocol_secplus_v2_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
if(!flipper_format_rewind(flipper_format)) { if(!flipper_format_rewind(flipper_format)) {
FURI_LOG_E(TAG, "Rewind error"); FURI_LOG_E(TAG, "Rewind error");
break; break;

View file

@ -403,6 +403,11 @@ bool subghz_protocol_decoder_somfy_keytis_deserialize(void* context, FlipperForm
FURI_LOG_E(TAG, "Deserialize error"); FURI_LOG_E(TAG, "Deserialize error");
break; break;
} }
if(instance->generic.data_count_bit !=
subghz_protocol_somfy_keytis_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
if(!flipper_format_rewind(flipper_format)) { if(!flipper_format_rewind(flipper_format)) {
FURI_LOG_E(TAG, "Rewind error"); FURI_LOG_E(TAG, "Rewind error");
break; break;

View file

@ -348,7 +348,19 @@ bool subghz_protocol_decoder_somfy_telis_serialize(
bool subghz_protocol_decoder_somfy_telis_deserialize(void* context, FlipperFormat* flipper_format) { bool subghz_protocol_decoder_somfy_telis_deserialize(void* context, FlipperFormat* flipper_format) {
furi_assert(context); furi_assert(context);
SubGhzProtocolDecoderSomfyTelis* instance = context; SubGhzProtocolDecoderSomfyTelis* instance = context;
return subghz_block_generic_deserialize(&instance->generic, flipper_format); bool ret = false;
do {
if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) {
break;
}
if(instance->generic.data_count_bit !=
subghz_protocol_somfy_telis_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
break;
}
ret = true;
} while(false);
return ret;
} }
void subghz_protocol_decoder_somfy_telis_get_string(void* context, string_t output) { void subghz_protocol_decoder_somfy_telis_get_string(void* context, string_t output) {

View file

@ -332,6 +332,11 @@ bool subghz_protocol_decoder_star_line_serialize(
FURI_LOG_E(TAG, "Unable to add manufacture name"); FURI_LOG_E(TAG, "Unable to add manufacture name");
res = false; res = false;
} }
if(res && instance->generic.data_count_bit !=
subghz_protocol_star_line_const.min_count_bit_for_found) {
FURI_LOG_E(TAG, "Wrong number of bits in key");
res = false;
}
return res; return res;
} }