From 0af8bd1e8bdd24727b35d6cc9db6400445f7e2f7 Mon Sep 17 00:00:00 2001 From: Eng1n33r <101719414+Eng1n33r@users.noreply.github.com> Date: Fri, 18 Aug 2023 16:41:35 +0300 Subject: [PATCH 01/20] Test FAAC 0x0 seed --- lib/subghz/protocols/faac_slh.c | 59 ++++++++++----------------------- 1 file changed, 18 insertions(+), 41 deletions(-) diff --git a/lib/subghz/protocols/faac_slh.c b/lib/subghz/protocols/faac_slh.c index 3ae6c8e23..ecc1266ee 100644 --- a/lib/subghz/protocols/faac_slh.c +++ b/lib/subghz/protocols/faac_slh.c @@ -110,12 +110,7 @@ void subghz_protocol_encoder_faac_slh_free(void* context) { } static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* instance) { - if(instance->generic.seed != 0x0) { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); - } else { - // Do not generate new data, send data from buffer - return true; - } + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); uint32_t fix = instance->generic.serial << 4 | instance->generic.btn; uint32_t hop = 0; uint32_t decrypt = 0; @@ -507,39 +502,21 @@ void subghz_protocol_decoder_faac_slh_get_string(void* context, FuriString* outp uint32_t code_fix = instance->generic.data >> 32; uint32_t code_hop = instance->generic.data & 0xFFFFFFFF; - if(instance->generic.seed == 0x0) { - furi_string_cat_printf( - output, - "%s %dbit\r\n" - "Key:%lX%08lX\r\n" - "Fix:%08lX\r\n" - "Hop:%08lX Btn:%X\r\n" - "Sn:%07lX Sd:Unknown", - instance->generic.protocol_name, - instance->generic.data_count_bit, - (uint32_t)(instance->generic.data >> 32), - (uint32_t)instance->generic.data, - code_fix, - code_hop, - instance->generic.btn, - instance->generic.serial); - } else { - furi_string_cat_printf( - output, - "%s %dbit\r\n" - "Key:%lX%08lX\r\n" - "Fix:%08lX Cnt:%05lX\r\n" - "Hop:%08lX Btn:%X\r\n" - "Sn:%07lX Sd:%08lX", - instance->generic.protocol_name, - instance->generic.data_count_bit, - (uint32_t)(instance->generic.data >> 32), - (uint32_t)instance->generic.data, - code_fix, - instance->generic.cnt, - code_hop, - instance->generic.btn, - instance->generic.serial, - instance->generic.seed); - } + furi_string_cat_printf( + output, + "%s %dbit\r\n" + "Key:%lX%08lX\r\n" + "Fix:%08lX Cnt:%05lX\r\n" + "Hop:%08lX Btn:%X\r\n" + "Sn:%07lX Sd:%08lX", + instance->generic.protocol_name, + instance->generic.data_count_bit, + (uint32_t)(instance->generic.data >> 32), + (uint32_t)instance->generic.data, + code_fix, + instance->generic.cnt, + code_hop, + instance->generic.btn, + instance->generic.serial, + instance->generic.seed); } From 2458cb2b96244e274a9e69171243a1b00d381731 Mon Sep 17 00:00:00 2001 From: Eng1n33r <101719414+Eng1n33r@users.noreply.github.com> Date: Fri, 18 Aug 2023 22:35:13 +0300 Subject: [PATCH 02/20] Allow 0x0 seed for testing --- .../main/subghz/scenes/subghz_scene_set_seed.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/applications/main/subghz/scenes/subghz_scene_set_seed.c b/applications/main/subghz/scenes/subghz_scene_set_seed.c index e5778b84f..f7727f0d6 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_seed.c +++ b/applications/main/subghz/scenes/subghz_scene_set_seed.c @@ -45,13 +45,6 @@ bool subghz_scene_set_seed_on_event(void* context, SceneManagerEvent event) { seed = subghz->secure_data->seed[0] << 24 | subghz->secure_data->seed[1] << 16 | subghz->secure_data->seed[2] << 8 | subghz->secure_data->seed[3]; - if(seed == 0) { - furi_string_set(subghz->error_str, "Seed value\ncan not be 0."); - scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); - consumed = true; - break; - } - generated_protocol = subghz_txrx_gen_keeloq_bft_protocol( subghz->txrx, "AM650", @@ -80,12 +73,6 @@ bool subghz_scene_set_seed_on_event(void* context, SceneManagerEvent event) { seed = subghz->secure_data->seed[0] << 24 | subghz->secure_data->seed[1] << 16 | subghz->secure_data->seed[2] << 8 | subghz->secure_data->seed[3]; - if(seed == 0) { - furi_string_set(subghz->error_str, "Seed value\ncan not be 0."); - scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); - consumed = true; - break; - } if(state == SubmenuIndexFaacSLH_433) { generated_protocol = subghz_txrx_gen_faac_slh_protocol( subghz->txrx, From 69debc36a0e155d2c1aca68bd04b23fce8436ff2 Mon Sep 17 00:00:00 2001 From: Eng1n33r <101719414+Eng1n33r@users.noreply.github.com> Date: Mon, 21 Aug 2023 04:18:47 +0300 Subject: [PATCH 03/20] FAAC SLH 0x0 seed new "smart logic" Comeback --- .../helpers/subghz_txrx_create_protocol_key.c | 2 + lib/subghz/protocols/faac_slh.c | 79 ++++++++++++++----- 2 files changed, 63 insertions(+), 18 deletions(-) diff --git a/applications/main/subghz/helpers/subghz_txrx_create_protocol_key.c b/applications/main/subghz/helpers/subghz_txrx_create_protocol_key.c index 0a9d12909..614f3fcf3 100644 --- a/applications/main/subghz/helpers/subghz_txrx_create_protocol_key.c +++ b/applications/main/subghz/helpers/subghz_txrx_create_protocol_key.c @@ -229,6 +229,8 @@ bool subghz_txrx_gen_faac_slh_protocol( } flipper_format_write_hex(txrx->fff_data, "Seed", seed_data, sizeof(uint32_t)); + flipper_format_write_string_cstr(txrx->fff_data, "Valid", "1\n"); + FURI_LOG_I(TAG, "Flag write to SD is OK"); } subghz_transmitter_free(txrx->transmitter); diff --git a/lib/subghz/protocols/faac_slh.c b/lib/subghz/protocols/faac_slh.c index ecc1266ee..848a61d9a 100644 --- a/lib/subghz/protocols/faac_slh.c +++ b/lib/subghz/protocols/faac_slh.c @@ -10,6 +10,8 @@ #define TAG "SubGhzProtocolFaacSLH" +bool bvalid; + static const SubGhzBlockConst subghz_protocol_faac_slh_const = { .te_short = 255, .te_long = 595, @@ -110,7 +112,14 @@ void subghz_protocol_encoder_faac_slh_free(void* context) { } static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* instance) { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + if(bvalid) { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + FURI_LOG_I(TAG, "[gen_data] TRUE : %i", bvalid); + } else { + // Do not generate new data, send data from buffer + FURI_LOG_I(TAG, "[gen_data] FALSE : %i", bvalid); + //return true; + } uint32_t fix = instance->generic.serial << 4 | instance->generic.btn; uint32_t hop = 0; uint32_t decrypt = 0; @@ -237,6 +246,14 @@ SubGhzProtocolStatus FURI_LOG_E(TAG, "Missing Seed"); break; } + FuriString* valid = furi_string_alloc(); + if(flipper_format_read_string(flipper_format, "Valid", valid)) { + bvalid = true; + FURI_LOG_I(TAG, "[encoder_des] Valid : %i", bvalid); + } else { + bvalid = false; + } + furi_string_free(valid); instance->generic.seed = seed_data[0] << 24 | seed_data[1] << 16 | seed_data[2] << 8 | seed_data[3]; @@ -481,6 +498,14 @@ SubGhzProtocolStatus FURI_LOG_E(TAG, "Missing Seed"); break; } + FuriString* valid = furi_string_alloc(); + if(flipper_format_read_string(flipper_format, "Valid", valid)) { + bvalid = true; + FURI_LOG_I(TAG, "[decoder_des] Valid : %i", bvalid); + } else { + bvalid = false; + } + furi_string_free(valid); instance->generic.seed = seed_data[0] << 24 | seed_data[1] << 16 | seed_data[2] << 8 | seed_data[3]; @@ -502,21 +527,39 @@ void subghz_protocol_decoder_faac_slh_get_string(void* context, FuriString* outp uint32_t code_fix = instance->generic.data >> 32; uint32_t code_hop = instance->generic.data & 0xFFFFFFFF; - furi_string_cat_printf( - output, - "%s %dbit\r\n" - "Key:%lX%08lX\r\n" - "Fix:%08lX Cnt:%05lX\r\n" - "Hop:%08lX Btn:%X\r\n" - "Sn:%07lX Sd:%08lX", - instance->generic.protocol_name, - instance->generic.data_count_bit, - (uint32_t)(instance->generic.data >> 32), - (uint32_t)instance->generic.data, - code_fix, - instance->generic.cnt, - code_hop, - instance->generic.btn, - instance->generic.serial, - instance->generic.seed); + if(bvalid == false) { + furi_string_cat_printf( + output, + "%s %dbit\r\n" + "Key:%lX%08lX\r\n" + "Fix:%08lX\r\n" + "Hop:%08lX Btn:%X\r\n" + "Sn:%07lX Sd:Unknown", + instance->generic.protocol_name, + instance->generic.data_count_bit, + (uint32_t)(instance->generic.data >> 32), + (uint32_t)instance->generic.data, + code_fix, + code_hop, + instance->generic.btn, + instance->generic.serial); + } else { + furi_string_cat_printf( + output, + "%s %dbit\r\n" + "Key:%lX%08lX\r\n" + "Fix:%08lX Cnt:%05lX\r\n" + "Hop:%08lX Btn:%X\r\n" + "Sn:%07lX Sd:%08lX", + instance->generic.protocol_name, + instance->generic.data_count_bit, + (uint32_t)(instance->generic.data >> 32), + (uint32_t)instance->generic.data, + code_fix, + instance->generic.cnt, + code_hop, + instance->generic.btn, + instance->generic.serial, + instance->generic.seed); + } } From 2b5ad4f5afee0a8f56286432f437a042ed4bb970 Mon Sep 17 00:00:00 2001 From: Eng1n33r <101719414+Eng1n33r@users.noreply.github.com> Date: Tue, 22 Aug 2023 20:22:49 +0300 Subject: [PATCH 04/20] Correct counter work. FAAC SLH bugfix. --- .../main/subghz/scenes/subghz_scene_config.h | 1 + .../subghz/scenes/subghz_scene_edit_cnt.c | 57 +++++++++++++++++++ .../subghz/scenes/subghz_scene_saved_menu.c | 13 +++++ .../main/subghz/scenes/subghz_scene_set_cnt.c | 2 +- applications/main/subghz/subghz_i.h | 2 +- lib/subghz/protocols/alutech_at_4n.c | 2 +- lib/subghz/protocols/came_atomo.c | 2 +- lib/subghz/protocols/faac_slh.c | 27 ++++++--- lib/subghz/protocols/keeloq.c | 10 +++- lib/subghz/protocols/keeloq.h | 7 +++ lib/subghz/protocols/kinggates_stylo_4k.c | 2 +- lib/subghz/protocols/nice_flor_s.c | 2 +- lib/subghz/protocols/somfy_keytis.c | 2 +- lib/subghz/protocols/somfy_telis.c | 2 +- lib/subghz/protocols/star_line.c | 2 +- 15 files changed, 115 insertions(+), 18 deletions(-) create mode 100644 applications/main/subghz/scenes/subghz_scene_edit_cnt.c diff --git a/applications/main/subghz/scenes/subghz_scene_config.h b/applications/main/subghz/scenes/subghz_scene_config.h index ddff47208..311f954c5 100644 --- a/applications/main/subghz/scenes/subghz_scene_config.h +++ b/applications/main/subghz/scenes/subghz_scene_config.h @@ -24,3 +24,4 @@ ADD_SCENE(subghz, decode_raw, DecodeRAW) ADD_SCENE(subghz, delete_raw, DeleteRAW) ADD_SCENE(subghz, need_saving, NeedSaving) ADD_SCENE(subghz, rpc, Rpc) +ADD_SCENE(subghz, edit_cnt, EditCnt) \ No newline at end of file diff --git a/applications/main/subghz/scenes/subghz_scene_edit_cnt.c b/applications/main/subghz/scenes/subghz_scene_edit_cnt.c new file mode 100644 index 000000000..f5d0d483b --- /dev/null +++ b/applications/main/subghz/scenes/subghz_scene_edit_cnt.c @@ -0,0 +1,57 @@ +#include "../subghz_i.h" +#include + +#define TAG "SubGhzEditCnt" + +void subghz_scene_edit_cnt_byte_input_callback(void* context) { + SubGhz* subghz = context; + + view_dispatcher_send_custom_event(subghz->view_dispatcher, SubGhzCustomEventByteInputDone); +} + +void subghz_scene_edit_cnt_on_enter(void* context) { + SubGhz* subghz = context; + + // Setup view + ByteInput* byte_input = subghz->byte_input; + + byte_input_set_header_text(byte_input, "Enter COUNTER in hex"); + byte_input_set_result_callback( + byte_input, + subghz_scene_edit_cnt_byte_input_callback, + NULL, + subghz, + subghz->secure_data->cnt, + 4); + view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdByteInput); +} + +bool subghz_scene_edit_cnt_on_event(void* context, SceneManagerEvent event) { + SubGhz* subghz = context; + bool consumed = false; + uint32_t cnt; + + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == SubGhzCustomEventByteInputDone) { + cnt = subghz->secure_data->cnt[0] << 24 | subghz->secure_data->cnt[1] << 16 | + subghz->secure_data->cnt[2] << 8 | subghz->secure_data->cnt[3]; + FURI_LOG_I(TAG, "cnt = %08lX", cnt); + if(subghz_protocol_keeloq_edit_cnt(subghz->txrx, cnt)) { + FURI_LOG_I(TAG, "Hook func from scene to protocol OK"); + }; + + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneTransmitter); + consumed = true; + } + memset(subghz->secure_data->cnt, 0, sizeof(subghz->secure_data->cnt)); + } + return consumed; +} + +void subghz_scene_edit_cnt_on_exit(void* context) { + SubGhz* subghz = context; + + // Clear view + byte_input_set_result_callback(subghz->byte_input, NULL, NULL, NULL, NULL, 0); + byte_input_set_header_text(subghz->byte_input, ""); +} \ No newline at end of file diff --git a/applications/main/subghz/scenes/subghz_scene_saved_menu.c b/applications/main/subghz/scenes/subghz_scene_saved_menu.c index a65830f4b..3672be9e4 100644 --- a/applications/main/subghz/scenes/subghz_scene_saved_menu.c +++ b/applications/main/subghz/scenes/subghz_scene_saved_menu.c @@ -4,6 +4,7 @@ enum SubmenuIndex { SubmenuIndexEmulate, SubmenuIndexEdit, SubmenuIndexDelete, + SubmenuIndesEditCnt, }; void subghz_scene_saved_menu_submenu_callback(void* context, uint32_t index) { @@ -19,6 +20,13 @@ void subghz_scene_saved_menu_on_enter(void* context) { SubmenuIndexEmulate, subghz_scene_saved_menu_submenu_callback, subghz); + + submenu_add_item( + subghz->submenu, + "Edit counter", + SubmenuIndexEditCnt, + subghz_scene_saved_menu_submenu_callback, + subghz); submenu_add_item( subghz->submenu, @@ -60,6 +68,11 @@ bool subghz_scene_saved_menu_on_event(void* context, SceneManagerEvent event) { subghz->scene_manager, SubGhzSceneSavedMenu, SubmenuIndexEdit); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveName); return true; + } else if(event.event == SubmenuIndexEditCnt) { + scene_manager_set_scene_state( + subghz->scene_manager, SubGhzSceneSavedMenu, SubmenuIndexEditCnt); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneEditCnt); + return true; } } return false; diff --git a/applications/main/subghz/scenes/subghz_scene_set_cnt.c b/applications/main/subghz/scenes/subghz_scene_set_cnt.c index 4faff7bbb..35c6c1c92 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_cnt.c +++ b/applications/main/subghz/scenes/subghz_scene_set_cnt.c @@ -29,7 +29,7 @@ void subghz_scene_set_cnt_on_enter(void* context) { break; case SubmenuIndexFaacSLH_433: case SubmenuIndexFaacSLH_868: - byte_input_set_header_text(byte_input, "Enter COUNTER in hex, 20bits"); + byte_input_set_header_text(byte_input, "Enter COUNTER in hex"); byte_input_set_result_callback( byte_input, subghz_scene_set_cnt_byte_input_callback, diff --git a/applications/main/subghz/subghz_i.h b/applications/main/subghz/subghz_i.h index 8d01c845d..6a266bf51 100644 --- a/applications/main/subghz/subghz_i.h +++ b/applications/main/subghz/subghz_i.h @@ -45,7 +45,7 @@ typedef struct { uint8_t fix[4]; - uint8_t cnt[3]; + uint8_t cnt[4]; uint8_t seed[4]; } SecureData; diff --git a/lib/subghz/protocols/alutech_at_4n.c b/lib/subghz/protocols/alutech_at_4n.c index 1a35550c6..2a16cae85 100644 --- a/lib/subghz/protocols/alutech_at_4n.c +++ b/lib/subghz/protocols/alutech_at_4n.c @@ -274,7 +274,7 @@ static bool subghz_protocol_alutech_at_4n_gen_data( } if(instance->generic.cnt < 0xFFFF) { - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { instance->generic.cnt = 0; } else { instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); diff --git a/lib/subghz/protocols/came_atomo.c b/lib/subghz/protocols/came_atomo.c index cea7ebf6f..0d9545020 100644 --- a/lib/subghz/protocols/came_atomo.c +++ b/lib/subghz/protocols/came_atomo.c @@ -186,7 +186,7 @@ static void subghz_protocol_encoder_came_atomo_get_upload( uint8_t pack[8] = {}; if(instance->generic.cnt < 0xFFFF) { - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { instance->generic.cnt = 0; } else { instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); diff --git a/lib/subghz/protocols/faac_slh.c b/lib/subghz/protocols/faac_slh.c index 848a61d9a..a69be67be 100644 --- a/lib/subghz/protocols/faac_slh.c +++ b/lib/subghz/protocols/faac_slh.c @@ -111,14 +111,23 @@ void subghz_protocol_encoder_faac_slh_free(void* context) { free(instance); } -static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* instance) { +static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* instance, FlipperFormat* flipper_format) { + FuriString* valid = furi_string_alloc(); + if(flipper_format_read_string(flipper_format, "Valid", valid)) { + bvalid = true; + FURI_LOG_I(TAG, "[gen_data] is valid ? : %i", bvalid); + } else { + bvalid = false; + FURI_LOG_I(TAG, "[gen_data] is valid ? : %i", bvalid); + } + furi_string_free(valid); if(bvalid) { instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); FURI_LOG_I(TAG, "[gen_data] TRUE : %i", bvalid); } else { // Do not generate new data, send data from buffer FURI_LOG_I(TAG, "[gen_data] FALSE : %i", bvalid); - //return true; + return true; } uint32_t fix = instance->generic.serial << 4 | instance->generic.btn; uint32_t hop = 0; @@ -176,7 +185,7 @@ bool subghz_protocol_faac_slh_create_data( instance->generic.seed = seed; instance->manufacture_name = manufacture_name; instance->generic.data_count_bit = 64; - bool res = subghz_protocol_faac_slh_gen_data(instance); + bool res = subghz_protocol_faac_slh_gen_data(instance, flipper_format); if(res) { return SubGhzProtocolStatusOk == subghz_block_generic_serialize(&instance->generic, flipper_format, preset); @@ -189,10 +198,10 @@ bool subghz_protocol_faac_slh_create_data( * @param instance Pointer to a SubGhzProtocolEncoderFaacSLH instance * @return true On success */ -static bool subghz_protocol_encoder_faac_slh_get_upload(SubGhzProtocolEncoderFaacSLH* instance) { +static bool subghz_protocol_encoder_faac_slh_get_upload(SubGhzProtocolEncoderFaacSLH* instance, FlipperFormat* flipper_format) { furi_assert(instance); - subghz_protocol_faac_slh_gen_data(instance); + subghz_protocol_faac_slh_gen_data(instance, flipper_format); size_t index = 0; size_t size_upload = 2 + (instance->generic.data_count_bit * 2); if(size_upload > instance->encoder.size_upload) { @@ -249,9 +258,10 @@ SubGhzProtocolStatus FuriString* valid = furi_string_alloc(); if(flipper_format_read_string(flipper_format, "Valid", valid)) { bvalid = true; - FURI_LOG_I(TAG, "[encoder_des] Valid : %i", bvalid); + FURI_LOG_I(TAG, "[encoder_des] True : %i", bvalid); } else { bvalid = false; + FURI_LOG_I(TAG, "[encoder_des] False : %i", bvalid); } furi_string_free(valid); instance->generic.seed = seed_data[0] << 24 | seed_data[1] << 16 | seed_data[2] << 8 | @@ -264,7 +274,7 @@ SubGhzProtocolStatus flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_faac_slh_get_upload(instance); + subghz_protocol_encoder_faac_slh_get_upload(instance, flipper_format); if(!flipper_format_rewind(flipper_format)) { FURI_LOG_E(TAG, "Rewind error"); @@ -501,9 +511,10 @@ SubGhzProtocolStatus FuriString* valid = furi_string_alloc(); if(flipper_format_read_string(flipper_format, "Valid", valid)) { bvalid = true; - FURI_LOG_I(TAG, "[decoder_des] Valid : %i", bvalid); + FURI_LOG_I(TAG, "[decoder_des] TRUE : %i", bvalid); } else { bvalid = false; + FURI_LOG_I(TAG, "[decoder_des] FALSE : %i", bvalid); } furi_string_free(valid); instance->generic.seed = seed_data[0] << 24 | seed_data[1] << 16 | seed_data[2] << 8 | diff --git a/lib/subghz/protocols/keeloq.c b/lib/subghz/protocols/keeloq.c index db46936c2..1e12146bc 100644 --- a/lib/subghz/protocols/keeloq.c +++ b/lib/subghz/protocols/keeloq.c @@ -170,7 +170,7 @@ static bool subghz_protocol_keeloq_gen_data( } if(counter_up && prog_mode == PROG_MODE_OFF) { if(instance->generic.cnt < 0xFFFF) { - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { instance->generic.cnt = 0; } else { instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); @@ -454,6 +454,14 @@ static bool return true; } +bool subghz_protocol_keeloq_edit_cnt(void* context, uint32_t cnt) { + furi_assert(context); + SubGhzProtocolEncoderKeeloq* instance = context; + instance->generic.cnt = cnt; + FURI_LOG_I(TAG, "edit_cnt value : %08lX", cnt); + return true; +} + SubGhzProtocolStatus subghz_protocol_encoder_keeloq_deserialize(void* context, FlipperFormat* flipper_format) { furi_assert(context); diff --git a/lib/subghz/protocols/keeloq.h b/lib/subghz/protocols/keeloq.h index a757e82d5..d90d3e2d3 100644 --- a/lib/subghz/protocols/keeloq.h +++ b/lib/subghz/protocols/keeloq.h @@ -11,6 +11,13 @@ extern const SubGhzProtocolDecoder subghz_protocol_keeloq_decoder; extern const SubGhzProtocolEncoder subghz_protocol_keeloq_encoder; extern const SubGhzProtocol subghz_protocol_keeloq; +/** + * Edit counter function + * @param context Pointer to a SubGhzProtocolEncoderKeeloq instance + * @param cnt Counter + */ +bool subghz_protocol_keeloq_edit_cnt(void* context, uint32_t cnt); + /** * Allocate SubGhzProtocolEncoderKeeloq. * @param environment Pointer to a SubGhzEnvironment instance diff --git a/lib/subghz/protocols/kinggates_stylo_4k.c b/lib/subghz/protocols/kinggates_stylo_4k.c index c5d21bcb0..998f17458 100644 --- a/lib/subghz/protocols/kinggates_stylo_4k.c +++ b/lib/subghz/protocols/kinggates_stylo_4k.c @@ -156,7 +156,7 @@ static bool subghz_protocol_kinggates_stylo_4k_gen_data( instance->generic.cnt = decrypt & 0xFFFF; if(instance->generic.cnt < 0xFFFF) { - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { instance->generic.cnt = 0; } else { instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); diff --git a/lib/subghz/protocols/nice_flor_s.c b/lib/subghz/protocols/nice_flor_s.c index eca9c4e95..6448378f6 100644 --- a/lib/subghz/protocols/nice_flor_s.c +++ b/lib/subghz/protocols/nice_flor_s.c @@ -152,7 +152,7 @@ static void subghz_protocol_encoder_nice_flor_s_get_upload( } if(instance->generic.cnt < 0xFFFF) { - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { instance->generic.cnt = 0; } else { instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); diff --git a/lib/subghz/protocols/somfy_keytis.c b/lib/subghz/protocols/somfy_keytis.c index 4074d757b..be8ebacf5 100644 --- a/lib/subghz/protocols/somfy_keytis.c +++ b/lib/subghz/protocols/somfy_keytis.c @@ -131,7 +131,7 @@ static bool instance->generic.serial = data & 0xFFFFFF; if(instance->generic.cnt < 0xFFFF) { - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { instance->generic.cnt = 0; } else { instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); diff --git a/lib/subghz/protocols/somfy_telis.c b/lib/subghz/protocols/somfy_telis.c index 5fbd90275..9a3882d87 100644 --- a/lib/subghz/protocols/somfy_telis.c +++ b/lib/subghz/protocols/somfy_telis.c @@ -125,7 +125,7 @@ static bool subghz_protocol_somfy_telis_gen_data( btn = subghz_protocol_somfy_telis_get_btn_code(); if(instance->generic.cnt < 0xFFFF) { - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { instance->generic.cnt = 0; } else { instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); diff --git a/lib/subghz/protocols/star_line.c b/lib/subghz/protocols/star_line.c index bf338b35d..75a7fd471 100644 --- a/lib/subghz/protocols/star_line.c +++ b/lib/subghz/protocols/star_line.c @@ -130,7 +130,7 @@ void subghz_protocol_encoder_star_line_free(void* context) { static bool subghz_protocol_star_line_gen_data(SubGhzProtocolEncoderStarLine* instance, uint8_t btn) { if(instance->generic.cnt < 0xFFFF) { - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { instance->generic.cnt = 0; } else { instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); From 67a0136e811a5d3cb09dc0b616fd67787490231c Mon Sep 17 00:00:00 2001 From: Eng1n33r <101719414+Eng1n33r@users.noreply.github.com> Date: Tue, 22 Aug 2023 20:33:36 +0300 Subject: [PATCH 05/20] microfix --- applications/main/subghz/scenes/subghz_scene_saved_menu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/applications/main/subghz/scenes/subghz_scene_saved_menu.c b/applications/main/subghz/scenes/subghz_scene_saved_menu.c index 3672be9e4..6ced59de2 100644 --- a/applications/main/subghz/scenes/subghz_scene_saved_menu.c +++ b/applications/main/subghz/scenes/subghz_scene_saved_menu.c @@ -4,7 +4,7 @@ enum SubmenuIndex { SubmenuIndexEmulate, SubmenuIndexEdit, SubmenuIndexDelete, - SubmenuIndesEditCnt, + SubmenuIndexEditCnt, }; void subghz_scene_saved_menu_submenu_callback(void* context, uint32_t index) { @@ -20,7 +20,7 @@ void subghz_scene_saved_menu_on_enter(void* context) { SubmenuIndexEmulate, subghz_scene_saved_menu_submenu_callback, subghz); - + submenu_add_item( subghz->submenu, "Edit counter", From df5b2cbddd98511beb5b4ae92155047f2c641551 Mon Sep 17 00:00:00 2001 From: Eng1n33r <101719414+Eng1n33r@users.noreply.github.com> Date: Tue, 22 Aug 2023 23:58:49 +0300 Subject: [PATCH 06/20] fix misspelling --- lib/subghz/protocols/somfy_keytis.c | 2 +- lib/subghz/protocols/somfy_telis.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/subghz/protocols/somfy_keytis.c b/lib/subghz/protocols/somfy_keytis.c index be8ebacf5..22d2b5e9f 100644 --- a/lib/subghz/protocols/somfy_keytis.c +++ b/lib/subghz/protocols/somfy_keytis.c @@ -200,7 +200,7 @@ bool subghz_protocol_somfy_keytis_create_data( /** * Generating an upload from data. - * @param instance Pointer to a SubGhzProtocolEncoderKeeloq instance + * @param instance Pointer to a SubGhzProtocolEncoderSomfyKeytis instance * @return true On success */ static bool subghz_protocol_encoder_somfy_keytis_get_upload( diff --git a/lib/subghz/protocols/somfy_telis.c b/lib/subghz/protocols/somfy_telis.c index 9a3882d87..b198ce491 100644 --- a/lib/subghz/protocols/somfy_telis.c +++ b/lib/subghz/protocols/somfy_telis.c @@ -189,7 +189,7 @@ bool subghz_protocol_somfy_telis_create_data( /** * Generating an upload from data. - * @param instance Pointer to a SubGhzProtocolEncoderKeeloq instance + * @param instance Pointer to a SubGhzProtocolEncoderSomfyTelis instance * @return true On success */ static bool subghz_protocol_encoder_somfy_telis_get_upload( From 09aabff55bbb9a1785efa6b7596bd8925680f51b Mon Sep 17 00:00:00 2001 From: Eng1n33r <101719414+Eng1n33r@users.noreply.github.com> Date: Thu, 24 Aug 2023 00:00:28 +0300 Subject: [PATCH 07/20] EditCnt rework [in progress] --- .../main/subghz/helpers/subghz_custom_event.h | 1 + .../main/subghz/scenes/subghz_scene_edit_cnt.c | 5 +---- .../main/subghz/scenes/subghz_scene_saved_menu.c | 13 ------------- .../main/subghz/scenes/subghz_scene_transmitter.c | 4 ++++ lib/subghz/protocols/keeloq.c | 8 -------- lib/subghz/protocols/keeloq.h | 7 ------- 6 files changed, 6 insertions(+), 32 deletions(-) diff --git a/applications/main/subghz/helpers/subghz_custom_event.h b/applications/main/subghz/helpers/subghz_custom_event.h index e5321264e..ea6f0a911 100644 --- a/applications/main/subghz/helpers/subghz_custom_event.h +++ b/applications/main/subghz/helpers/subghz_custom_event.h @@ -105,6 +105,7 @@ typedef enum { SubGhzCustomEventViewTransmitterBack, SubGhzCustomEventViewTransmitterSendStart, SubGhzCustomEventViewTransmitterSendStop, + SubGhzCustomEventViewTransmitterEditCnt, SubGhzCustomEventViewTransmitterError, SubGhzCustomEventViewFreqAnalOkShort, diff --git a/applications/main/subghz/scenes/subghz_scene_edit_cnt.c b/applications/main/subghz/scenes/subghz_scene_edit_cnt.c index f5d0d483b..4a25256f3 100644 --- a/applications/main/subghz/scenes/subghz_scene_edit_cnt.c +++ b/applications/main/subghz/scenes/subghz_scene_edit_cnt.c @@ -36,10 +36,7 @@ bool subghz_scene_edit_cnt_on_event(void* context, SceneManagerEvent event) { cnt = subghz->secure_data->cnt[0] << 24 | subghz->secure_data->cnt[1] << 16 | subghz->secure_data->cnt[2] << 8 | subghz->secure_data->cnt[3]; FURI_LOG_I(TAG, "cnt = %08lX", cnt); - if(subghz_protocol_keeloq_edit_cnt(subghz->txrx, cnt)) { - FURI_LOG_I(TAG, "Hook func from scene to protocol OK"); - }; - + // TO DO scene_manager_next_scene(subghz->scene_manager, SubGhzSceneTransmitter); consumed = true; } diff --git a/applications/main/subghz/scenes/subghz_scene_saved_menu.c b/applications/main/subghz/scenes/subghz_scene_saved_menu.c index 6ced59de2..a65830f4b 100644 --- a/applications/main/subghz/scenes/subghz_scene_saved_menu.c +++ b/applications/main/subghz/scenes/subghz_scene_saved_menu.c @@ -4,7 +4,6 @@ enum SubmenuIndex { SubmenuIndexEmulate, SubmenuIndexEdit, SubmenuIndexDelete, - SubmenuIndexEditCnt, }; void subghz_scene_saved_menu_submenu_callback(void* context, uint32_t index) { @@ -21,13 +20,6 @@ void subghz_scene_saved_menu_on_enter(void* context) { subghz_scene_saved_menu_submenu_callback, subghz); - submenu_add_item( - subghz->submenu, - "Edit counter", - SubmenuIndexEditCnt, - subghz_scene_saved_menu_submenu_callback, - subghz); - submenu_add_item( subghz->submenu, "Rename", @@ -68,11 +60,6 @@ bool subghz_scene_saved_menu_on_event(void* context, SceneManagerEvent event) { subghz->scene_manager, SubGhzSceneSavedMenu, SubmenuIndexEdit); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveName); return true; - } else if(event.event == SubmenuIndexEditCnt) { - scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneSavedMenu, SubmenuIndexEditCnt); - scene_manager_next_scene(subghz->scene_manager, SubGhzSceneEditCnt); - return true; } } return false; diff --git a/applications/main/subghz/scenes/subghz_scene_transmitter.c b/applications/main/subghz/scenes/subghz_scene_transmitter.c index 9a38cecd7..512bf26c3 100644 --- a/applications/main/subghz/scenes/subghz_scene_transmitter.c +++ b/applications/main/subghz/scenes/subghz_scene_transmitter.c @@ -85,6 +85,10 @@ bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) { furi_hal_subghz_set_rolling_counter_mult(tmp_counter); } return true; + } else if(event.event == SubGhzCustomEventViewTransmitterEditCnt) { + subghz->state_notifications = SubGhzNotificationStateIDLE; + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneEditCnt); + return true; } else if(event.event == SubGhzCustomEventViewTransmitterBack) { subghz->state_notifications = SubGhzNotificationStateIDLE; scene_manager_search_and_switch_to_previous_scene( diff --git a/lib/subghz/protocols/keeloq.c b/lib/subghz/protocols/keeloq.c index 1e12146bc..a274602f3 100644 --- a/lib/subghz/protocols/keeloq.c +++ b/lib/subghz/protocols/keeloq.c @@ -454,14 +454,6 @@ static bool return true; } -bool subghz_protocol_keeloq_edit_cnt(void* context, uint32_t cnt) { - furi_assert(context); - SubGhzProtocolEncoderKeeloq* instance = context; - instance->generic.cnt = cnt; - FURI_LOG_I(TAG, "edit_cnt value : %08lX", cnt); - return true; -} - SubGhzProtocolStatus subghz_protocol_encoder_keeloq_deserialize(void* context, FlipperFormat* flipper_format) { furi_assert(context); diff --git a/lib/subghz/protocols/keeloq.h b/lib/subghz/protocols/keeloq.h index d90d3e2d3..a757e82d5 100644 --- a/lib/subghz/protocols/keeloq.h +++ b/lib/subghz/protocols/keeloq.h @@ -11,13 +11,6 @@ extern const SubGhzProtocolDecoder subghz_protocol_keeloq_decoder; extern const SubGhzProtocolEncoder subghz_protocol_keeloq_encoder; extern const SubGhzProtocol subghz_protocol_keeloq; -/** - * Edit counter function - * @param context Pointer to a SubGhzProtocolEncoderKeeloq instance - * @param cnt Counter - */ -bool subghz_protocol_keeloq_edit_cnt(void* context, uint32_t cnt); - /** * Allocate SubGhzProtocolEncoderKeeloq. * @param environment Pointer to a SubGhzEnvironment instance From 32fb94f5db4fbc7702b18353b9e3d04f12720d0a Mon Sep 17 00:00:00 2001 From: Eng1n33r <101719414+Eng1n33r@users.noreply.github.com> Date: Thu, 24 Aug 2023 19:23:05 +0300 Subject: [PATCH 08/20] Cnt value edit [in progress] --- .../main/subghz/helpers/subghz_custom_event.h | 1 - .../helpers/subghz_txrx_create_protocol_key.c | 2 +- .../main/subghz/scenes/subghz_scene_edit_cnt.c | 8 +------- .../main/subghz/scenes/subghz_scene_saved_menu.c | 13 +++++++++++++ .../subghz/scenes/subghz_scene_transmitter.c | 16 ++++++++++++---- firmware/targets/f7/api_symbols.csv | 4 +++- firmware/targets/f7/furi_hal/furi_hal_subghz.c | 10 ++++++++++ firmware/targets/f7/furi_hal/furi_hal_subghz.h | 10 ++++++++++ 8 files changed, 50 insertions(+), 14 deletions(-) diff --git a/applications/main/subghz/helpers/subghz_custom_event.h b/applications/main/subghz/helpers/subghz_custom_event.h index ea6f0a911..e5321264e 100644 --- a/applications/main/subghz/helpers/subghz_custom_event.h +++ b/applications/main/subghz/helpers/subghz_custom_event.h @@ -105,7 +105,6 @@ typedef enum { SubGhzCustomEventViewTransmitterBack, SubGhzCustomEventViewTransmitterSendStart, SubGhzCustomEventViewTransmitterSendStop, - SubGhzCustomEventViewTransmitterEditCnt, SubGhzCustomEventViewTransmitterError, SubGhzCustomEventViewFreqAnalOkShort, diff --git a/applications/main/subghz/helpers/subghz_txrx_create_protocol_key.c b/applications/main/subghz/helpers/subghz_txrx_create_protocol_key.c index cf4c07673..ba72652f2 100644 --- a/applications/main/subghz/helpers/subghz_txrx_create_protocol_key.c +++ b/applications/main/subghz/helpers/subghz_txrx_create_protocol_key.c @@ -229,7 +229,7 @@ bool subghz_txrx_gen_faac_slh_protocol( } flipper_format_write_hex(txrx->fff_data, "Seed", seed_data, sizeof(uint32_t)); - flipper_format_write_string_cstr(txrx->fff_data, "Valid", "1\n"); + flipper_format_write_string_cstr(txrx->fff_data, "Valid", "1\r\n"); FURI_LOG_I(TAG, "Flag write to SD is OK"); } diff --git a/applications/main/subghz/scenes/subghz_scene_edit_cnt.c b/applications/main/subghz/scenes/subghz_scene_edit_cnt.c index 4a25256f3..0373779f6 100644 --- a/applications/main/subghz/scenes/subghz_scene_edit_cnt.c +++ b/applications/main/subghz/scenes/subghz_scene_edit_cnt.c @@ -1,7 +1,6 @@ #include "../subghz_i.h" -#include -#define TAG "SubGhzEditCnt" +#define TAG "subghz_scene_edit_cnt" void subghz_scene_edit_cnt_byte_input_callback(void* context) { SubGhz* subghz = context; @@ -29,14 +28,9 @@ void subghz_scene_edit_cnt_on_enter(void* context) { bool subghz_scene_edit_cnt_on_event(void* context, SceneManagerEvent event) { SubGhz* subghz = context; bool consumed = false; - uint32_t cnt; if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubGhzCustomEventByteInputDone) { - cnt = subghz->secure_data->cnt[0] << 24 | subghz->secure_data->cnt[1] << 16 | - subghz->secure_data->cnt[2] << 8 | subghz->secure_data->cnt[3]; - FURI_LOG_I(TAG, "cnt = %08lX", cnt); - // TO DO scene_manager_next_scene(subghz->scene_manager, SubGhzSceneTransmitter); consumed = true; } diff --git a/applications/main/subghz/scenes/subghz_scene_saved_menu.c b/applications/main/subghz/scenes/subghz_scene_saved_menu.c index a65830f4b..d02e7930f 100644 --- a/applications/main/subghz/scenes/subghz_scene_saved_menu.c +++ b/applications/main/subghz/scenes/subghz_scene_saved_menu.c @@ -4,6 +4,7 @@ enum SubmenuIndex { SubmenuIndexEmulate, SubmenuIndexEdit, SubmenuIndexDelete, + SubmenuIndexEditCnt, }; void subghz_scene_saved_menu_submenu_callback(void* context, uint32_t index) { @@ -19,6 +20,13 @@ void subghz_scene_saved_menu_on_enter(void* context) { SubmenuIndexEmulate, subghz_scene_saved_menu_submenu_callback, subghz); + + submenu_add_item( + subghz->submenu, + "Edit counter", + SubmenuIndexEditCnt, + subghz_scene_saved_menu_submenu_callback, + subghz); submenu_add_item( subghz->submenu, @@ -60,6 +68,11 @@ bool subghz_scene_saved_menu_on_event(void* context, SceneManagerEvent event) { subghz->scene_manager, SubGhzSceneSavedMenu, SubmenuIndexEdit); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveName); return true; + } else if(event.event == SubmenuIndexEditCnt) { + scene_manager_set_scene_state( + subghz->scene_manager, SubGhzSceneSavedMenu, SubmenuIndexEditCnt); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneEditCnt); + return true; } } return false; diff --git a/applications/main/subghz/scenes/subghz_scene_transmitter.c b/applications/main/subghz/scenes/subghz_scene_transmitter.c index 512bf26c3..45efdce18 100644 --- a/applications/main/subghz/scenes/subghz_scene_transmitter.c +++ b/applications/main/subghz/scenes/subghz_scene_transmitter.c @@ -4,6 +4,8 @@ #include +#define TAG "subghz_scene_transmitter" + void subghz_scene_transmitter_callback(SubGhzCustomEvent event, void* context) { furi_assert(context); SubGhz* subghz = context; @@ -20,6 +22,16 @@ bool subghz_scene_transmitter_update_data_show(void* context) { FuriString* frequency_str = furi_string_alloc(); FuriString* modulation_str = furi_string_alloc(); + if(scene_manager_has_previous_scene(subghz->scene_manager, SubGhzSceneEditCnt)) { + FURI_LOG_I(TAG, " has previous scene "); + uint32_t cnt_temp; + cnt_temp = subghz->secure_data->cnt[0] << 24 | subghz->secure_data->cnt[1] << 16 | + subghz->secure_data->cnt[2] << 8 | subghz->secure_data->cnt[3]; + FURI_LOG_I(TAG, "cnt = %08lX", cnt_temp); + furi_hal_subghz_set_rolling_counter_value(cnt_temp); + FURI_LOG_I(TAG, "furi_hal_subghz.rolling_counter_value == %08lX", cnt_temp); + } + if(subghz_protocol_decoder_base_deserialize( decoder, subghz_txrx_get_fff_data(subghz->txrx)) == SubGhzProtocolStatusOk) { subghz_protocol_decoder_base_get_string(decoder, key_str); @@ -85,10 +97,6 @@ bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) { furi_hal_subghz_set_rolling_counter_mult(tmp_counter); } return true; - } else if(event.event == SubGhzCustomEventViewTransmitterEditCnt) { - subghz->state_notifications = SubGhzNotificationStateIDLE; - scene_manager_next_scene(subghz->scene_manager, SubGhzSceneEditCnt); - return true; } else if(event.event == SubGhzCustomEventViewTransmitterBack) { subghz->state_notifications = SubGhzNotificationStateIDLE; scene_manager_search_and_switch_to_previous_scene( diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 847c76643..870642478 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,35.1,, +Version,+,35.2,, Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/cli/cli.h,, @@ -1419,6 +1419,7 @@ Function,+,furi_hal_subghz_get_data_gpio,const GpioPin*, Function,+,furi_hal_subghz_get_ext_power_amp,_Bool, Function,+,furi_hal_subghz_get_lqi,uint8_t, Function,+,furi_hal_subghz_get_rolling_counter_mult,uint8_t, +Function,+,furi_hal_subghz_get_rolling_counter_value,uint32_t, Function,+,furi_hal_subghz_get_rssi,float, Function,+,furi_hal_subghz_idle,void, Function,-,furi_hal_subghz_init,void, @@ -1439,6 +1440,7 @@ Function,+,furi_hal_subghz_set_frequency,uint32_t,uint32_t Function,+,furi_hal_subghz_set_frequency_and_path,uint32_t,uint32_t Function,+,furi_hal_subghz_set_path,void,FuriHalSubGhzPath Function,+,furi_hal_subghz_set_rolling_counter_mult,void,uint8_t +Function,+,furi_hal_subghz_set_rolling_counter_value,void,uint32_t Function,+,furi_hal_subghz_shutdown,void, Function,+,furi_hal_subghz_sleep,void, Function,+,furi_hal_subghz_start_async_rx,void,"FuriHalSubGhzCaptureCallback, void*" diff --git a/firmware/targets/f7/furi_hal/furi_hal_subghz.c b/firmware/targets/f7/furi_hal/furi_hal_subghz.c index 1ea5334ee..fe583784e 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_subghz.c +++ b/firmware/targets/f7/furi_hal/furi_hal_subghz.c @@ -53,6 +53,7 @@ typedef struct { const GpioPin* async_mirror_pin; uint8_t rolling_counter_mult; + uint32_t rolling_counter_value; bool ext_power_amp : 1; bool dangerous_frequency_i : 1; } FuriHalSubGhz; @@ -62,6 +63,7 @@ volatile FuriHalSubGhz furi_hal_subghz = { .regulation = SubGhzRegulationTxRx, .async_mirror_pin = NULL, .rolling_counter_mult = 1, + .rolling_counter_value = 0x0, .ext_power_amp = false, .dangerous_frequency_i = false, }; @@ -74,6 +76,14 @@ void furi_hal_subghz_set_rolling_counter_mult(uint8_t mult) { furi_hal_subghz.rolling_counter_mult = mult; } +uint32_t furi_hal_subghz_get_rolling_counter_value(void) { + return furi_hal_subghz.rolling_counter_value; +} + +void furi_hal_subghz_set_rolling_counter_value(uint32_t value) { + furi_hal_subghz.rolling_counter_value = value; +} + void furi_hal_subghz_set_dangerous_frequency(bool state_i) { furi_hal_subghz.dangerous_frequency_i = state_i; } diff --git a/firmware/targets/f7/furi_hal/furi_hal_subghz.h b/firmware/targets/f7/furi_hal/furi_hal_subghz.h index b390ac6cc..e9a3e7a03 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_subghz.h +++ b/firmware/targets/f7/furi_hal/furi_hal_subghz.h @@ -183,6 +183,16 @@ uint8_t furi_hal_subghz_get_rolling_counter_mult(void); */ void furi_hal_subghz_set_rolling_counter_mult(uint8_t mult); +/** Get the current rolling protocols counter value + * @return uint32_t current value + */ +uint32_t furi_hal_subghz_get_rolling_counter_value(void); + +/** Set the current rolling protocols counter value + * @param value uint32_t = 0xFFFF / 0xFFFFF / 0xFFFFFFFF + */ +void furi_hal_subghz_set_rolling_counter_value(uint32_t value); + /** Set frequency * * @param value frequency in Hz From ce1336c0ed1aa42e7e0b24157dc80876aad8b3c9 Mon Sep 17 00:00:00 2001 From: Eng1n33r <101719414+Eng1n33r@users.noreply.github.com> Date: Thu, 24 Aug 2023 22:14:00 +0300 Subject: [PATCH 09/20] fix anomaly --- lib/subghz/protocols/faac_slh.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/subghz/protocols/faac_slh.c b/lib/subghz/protocols/faac_slh.c index a69be67be..b01e3a02e 100644 --- a/lib/subghz/protocols/faac_slh.c +++ b/lib/subghz/protocols/faac_slh.c @@ -111,16 +111,16 @@ void subghz_protocol_encoder_faac_slh_free(void* context) { free(instance); } -static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* instance, FlipperFormat* flipper_format) { - FuriString* valid = furi_string_alloc(); - if(flipper_format_read_string(flipper_format, "Valid", valid)) { - bvalid = true; - FURI_LOG_I(TAG, "[gen_data] is valid ? : %i", bvalid); - } else { - bvalid = false; - FURI_LOG_I(TAG, "[gen_data] is valid ? : %i", bvalid); - } - furi_string_free(valid); +static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* instance) { + //FuriString* valid = furi_string_alloc(); + //if(flipper_format_read_string(flipper_format, "Valid", valid)) { + //bvalid = true; + //FURI_LOG_I(TAG, "[gen_data] is valid ? : %i", bvalid); + //} else { + //bvalid = false; + //FURI_LOG_I(TAG, "[gen_data] is valid ? : %i", bvalid); + //} + //furi_string_free(valid); if(bvalid) { instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); FURI_LOG_I(TAG, "[gen_data] TRUE : %i", bvalid); @@ -185,7 +185,7 @@ bool subghz_protocol_faac_slh_create_data( instance->generic.seed = seed; instance->manufacture_name = manufacture_name; instance->generic.data_count_bit = 64; - bool res = subghz_protocol_faac_slh_gen_data(instance, flipper_format); + bool res = subghz_protocol_faac_slh_gen_data(instance); if(res) { return SubGhzProtocolStatusOk == subghz_block_generic_serialize(&instance->generic, flipper_format, preset); @@ -198,10 +198,10 @@ bool subghz_protocol_faac_slh_create_data( * @param instance Pointer to a SubGhzProtocolEncoderFaacSLH instance * @return true On success */ -static bool subghz_protocol_encoder_faac_slh_get_upload(SubGhzProtocolEncoderFaacSLH* instance, FlipperFormat* flipper_format) { +static bool subghz_protocol_encoder_faac_slh_get_upload(SubGhzProtocolEncoderFaacSLH* instance) { furi_assert(instance); - subghz_protocol_faac_slh_gen_data(instance, flipper_format); + subghz_protocol_faac_slh_gen_data(instance); size_t index = 0; size_t size_upload = 2 + (instance->generic.data_count_bit * 2); if(size_upload > instance->encoder.size_upload) { @@ -274,7 +274,7 @@ SubGhzProtocolStatus flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_faac_slh_get_upload(instance, flipper_format); + subghz_protocol_encoder_faac_slh_get_upload(instance); if(!flipper_format_rewind(flipper_format)) { FURI_LOG_E(TAG, "Rewind error"); From a772408ee6def5fc464e23f110499246b7bb9bc1 Mon Sep 17 00:00:00 2001 From: Eng1n33r <101719414+Eng1n33r@users.noreply.github.com> Date: Mon, 28 Aug 2023 00:02:48 +0300 Subject: [PATCH 10/20] Good Monday [SubGhz / RadioSettings] More flexible rolling counter rate; Remove unused stuff & small UI revisal --- .../main/subghz/scenes/subghz_scene_config.h | 3 +- .../subghz/scenes/subghz_scene_edit_cnt.c | 48 ------------------- .../scenes/subghz_scene_radio_settings.c | 20 +++++++- .../subghz/scenes/subghz_scene_saved_menu.c | 13 ----- .../main/subghz/scenes/subghz_scene_set_cnt.c | 2 +- .../subghz/scenes/subghz_scene_transmitter.c | 13 +---- firmware/targets/f7/api_symbols.csv | 6 +-- .../targets/f7/furi_hal/furi_hal_subghz.c | 16 ++----- .../targets/f7/furi_hal/furi_hal_subghz.h | 22 +++------ 9 files changed, 33 insertions(+), 110 deletions(-) delete mode 100644 applications/main/subghz/scenes/subghz_scene_edit_cnt.c diff --git a/applications/main/subghz/scenes/subghz_scene_config.h b/applications/main/subghz/scenes/subghz_scene_config.h index 311f954c5..b12a66f98 100644 --- a/applications/main/subghz/scenes/subghz_scene_config.h +++ b/applications/main/subghz/scenes/subghz_scene_config.h @@ -23,5 +23,4 @@ ADD_SCENE(subghz, more_raw, MoreRAW) ADD_SCENE(subghz, decode_raw, DecodeRAW) ADD_SCENE(subghz, delete_raw, DeleteRAW) ADD_SCENE(subghz, need_saving, NeedSaving) -ADD_SCENE(subghz, rpc, Rpc) -ADD_SCENE(subghz, edit_cnt, EditCnt) \ No newline at end of file +ADD_SCENE(subghz, rpc, Rpc) \ No newline at end of file diff --git a/applications/main/subghz/scenes/subghz_scene_edit_cnt.c b/applications/main/subghz/scenes/subghz_scene_edit_cnt.c deleted file mode 100644 index 0373779f6..000000000 --- a/applications/main/subghz/scenes/subghz_scene_edit_cnt.c +++ /dev/null @@ -1,48 +0,0 @@ -#include "../subghz_i.h" - -#define TAG "subghz_scene_edit_cnt" - -void subghz_scene_edit_cnt_byte_input_callback(void* context) { - SubGhz* subghz = context; - - view_dispatcher_send_custom_event(subghz->view_dispatcher, SubGhzCustomEventByteInputDone); -} - -void subghz_scene_edit_cnt_on_enter(void* context) { - SubGhz* subghz = context; - - // Setup view - ByteInput* byte_input = subghz->byte_input; - - byte_input_set_header_text(byte_input, "Enter COUNTER in hex"); - byte_input_set_result_callback( - byte_input, - subghz_scene_edit_cnt_byte_input_callback, - NULL, - subghz, - subghz->secure_data->cnt, - 4); - view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdByteInput); -} - -bool subghz_scene_edit_cnt_on_event(void* context, SceneManagerEvent event) { - SubGhz* subghz = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == SubGhzCustomEventByteInputDone) { - scene_manager_next_scene(subghz->scene_manager, SubGhzSceneTransmitter); - consumed = true; - } - memset(subghz->secure_data->cnt, 0, sizeof(subghz->secure_data->cnt)); - } - return consumed; -} - -void subghz_scene_edit_cnt_on_exit(void* context) { - SubGhz* subghz = context; - - // Clear view - byte_input_set_result_callback(subghz->byte_input, NULL, NULL, NULL, NULL, 0); - byte_input_set_header_text(subghz->byte_input, ""); -} \ No newline at end of file diff --git a/applications/main/subghz/scenes/subghz_scene_radio_settings.c b/applications/main/subghz/scenes/subghz_scene_radio_settings.c index 0bd2b1f3e..864df6326 100644 --- a/applications/main/subghz/scenes/subghz_scene_radio_settings.c +++ b/applications/main/subghz/scenes/subghz_scene_radio_settings.c @@ -32,7 +32,7 @@ const char* const debug_pin_text[DEBUG_P_COUNT] = { "17(1W)", }; -#define DEBUG_COUNTER_COUNT 6 +#define DEBUG_COUNTER_COUNT 15 const char* const debug_counter_text[DEBUG_COUNTER_COUNT] = { "+1", "+2", @@ -40,6 +40,15 @@ const char* const debug_counter_text[DEBUG_COUNTER_COUNT] = { "+4", "+5", "+10", + "+100", + "0", + "-1", + "-2", + "-3", + "-4", + "-5", + "-10", + "-100", }; const uint32_t debug_counter_val[DEBUG_COUNTER_COUNT] = { 1, @@ -48,6 +57,15 @@ const uint32_t debug_counter_val[DEBUG_COUNTER_COUNT] = { 4, 5, 10, + 100, + 0, + -1, + -2, + -3, + -4, + -5, + -10, + -100, }; static void subghz_scene_radio_settings_set_device(VariableItem* item) { diff --git a/applications/main/subghz/scenes/subghz_scene_saved_menu.c b/applications/main/subghz/scenes/subghz_scene_saved_menu.c index d02e7930f..6897a2d8a 100644 --- a/applications/main/subghz/scenes/subghz_scene_saved_menu.c +++ b/applications/main/subghz/scenes/subghz_scene_saved_menu.c @@ -4,7 +4,6 @@ enum SubmenuIndex { SubmenuIndexEmulate, SubmenuIndexEdit, SubmenuIndexDelete, - SubmenuIndexEditCnt, }; void subghz_scene_saved_menu_submenu_callback(void* context, uint32_t index) { @@ -21,13 +20,6 @@ void subghz_scene_saved_menu_on_enter(void* context) { subghz_scene_saved_menu_submenu_callback, subghz); - submenu_add_item( - subghz->submenu, - "Edit counter", - SubmenuIndexEditCnt, - subghz_scene_saved_menu_submenu_callback, - subghz); - submenu_add_item( subghz->submenu, "Rename", @@ -68,11 +60,6 @@ bool subghz_scene_saved_menu_on_event(void* context, SceneManagerEvent event) { subghz->scene_manager, SubGhzSceneSavedMenu, SubmenuIndexEdit); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveName); return true; - } else if(event.event == SubmenuIndexEditCnt) { - scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneSavedMenu, SubmenuIndexEditCnt); - scene_manager_next_scene(subghz->scene_manager, SubGhzSceneEditCnt); - return true; } } return false; diff --git a/applications/main/subghz/scenes/subghz_scene_set_cnt.c b/applications/main/subghz/scenes/subghz_scene_set_cnt.c index 35c6c1c92..008ffa1ad 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_cnt.c +++ b/applications/main/subghz/scenes/subghz_scene_set_cnt.c @@ -29,7 +29,7 @@ void subghz_scene_set_cnt_on_enter(void* context) { break; case SubmenuIndexFaacSLH_433: case SubmenuIndexFaacSLH_868: - byte_input_set_header_text(byte_input, "Enter COUNTER in hex"); + byte_input_set_header_text(byte_input, "Enter COUNTER in hex [20 bits]"); byte_input_set_result_callback( byte_input, subghz_scene_set_cnt_byte_input_callback, diff --git a/applications/main/subghz/scenes/subghz_scene_transmitter.c b/applications/main/subghz/scenes/subghz_scene_transmitter.c index 45efdce18..5f1be6c21 100644 --- a/applications/main/subghz/scenes/subghz_scene_transmitter.c +++ b/applications/main/subghz/scenes/subghz_scene_transmitter.c @@ -4,8 +4,6 @@ #include -#define TAG "subghz_scene_transmitter" - void subghz_scene_transmitter_callback(SubGhzCustomEvent event, void* context) { furi_assert(context); SubGhz* subghz = context; @@ -22,15 +20,6 @@ bool subghz_scene_transmitter_update_data_show(void* context) { FuriString* frequency_str = furi_string_alloc(); FuriString* modulation_str = furi_string_alloc(); - if(scene_manager_has_previous_scene(subghz->scene_manager, SubGhzSceneEditCnt)) { - FURI_LOG_I(TAG, " has previous scene "); - uint32_t cnt_temp; - cnt_temp = subghz->secure_data->cnt[0] << 24 | subghz->secure_data->cnt[1] << 16 | - subghz->secure_data->cnt[2] << 8 | subghz->secure_data->cnt[3]; - FURI_LOG_I(TAG, "cnt = %08lX", cnt_temp); - furi_hal_subghz_set_rolling_counter_value(cnt_temp); - FURI_LOG_I(TAG, "furi_hal_subghz.rolling_counter_value == %08lX", cnt_temp); - } if(subghz_protocol_decoder_base_deserialize( decoder, subghz_txrx_get_fff_data(subghz->txrx)) == SubGhzProtocolStatusOk) { @@ -89,7 +78,7 @@ bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) { subghz_txrx_stop(subghz->txrx); if(subghz_custom_btn_get() != SUBGHZ_CUSTOM_BTN_OK) { subghz_custom_btn_set(SUBGHZ_CUSTOM_BTN_OK); - uint8_t tmp_counter = furi_hal_subghz_get_rolling_counter_mult(); + int8_t tmp_counter = furi_hal_subghz_get_rolling_counter_mult(); furi_hal_subghz_set_rolling_counter_mult(0); // Calling restore! subghz_tx_start(subghz, subghz_txrx_get_fff_data(subghz->txrx)); diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 870642478..95b05fdaf 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -1418,8 +1418,7 @@ Function,+,furi_hal_subghz_flush_tx,void, Function,+,furi_hal_subghz_get_data_gpio,const GpioPin*, Function,+,furi_hal_subghz_get_ext_power_amp,_Bool, Function,+,furi_hal_subghz_get_lqi,uint8_t, -Function,+,furi_hal_subghz_get_rolling_counter_mult,uint8_t, -Function,+,furi_hal_subghz_get_rolling_counter_value,uint32_t, +Function,+,furi_hal_subghz_get_rolling_counter_mult,int8_t, Function,+,furi_hal_subghz_get_rssi,float, Function,+,furi_hal_subghz_idle,void, Function,-,furi_hal_subghz_init,void, @@ -1439,8 +1438,7 @@ Function,+,furi_hal_subghz_set_ext_power_amp,void,_Bool Function,+,furi_hal_subghz_set_frequency,uint32_t,uint32_t Function,+,furi_hal_subghz_set_frequency_and_path,uint32_t,uint32_t Function,+,furi_hal_subghz_set_path,void,FuriHalSubGhzPath -Function,+,furi_hal_subghz_set_rolling_counter_mult,void,uint8_t -Function,+,furi_hal_subghz_set_rolling_counter_value,void,uint32_t +Function,+,furi_hal_subghz_set_rolling_counter_mult,void,int8_t Function,+,furi_hal_subghz_shutdown,void, Function,+,furi_hal_subghz_sleep,void, Function,+,furi_hal_subghz_start_async_rx,void,"FuriHalSubGhzCaptureCallback, void*" diff --git a/firmware/targets/f7/furi_hal/furi_hal_subghz.c b/firmware/targets/f7/furi_hal/furi_hal_subghz.c index fe583784e..323f737f4 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_subghz.c +++ b/firmware/targets/f7/furi_hal/furi_hal_subghz.c @@ -52,8 +52,7 @@ typedef struct { volatile SubGhzRegulation regulation; const GpioPin* async_mirror_pin; - uint8_t rolling_counter_mult; - uint32_t rolling_counter_value; + int8_t rolling_counter_mult; bool ext_power_amp : 1; bool dangerous_frequency_i : 1; } FuriHalSubGhz; @@ -63,27 +62,18 @@ volatile FuriHalSubGhz furi_hal_subghz = { .regulation = SubGhzRegulationTxRx, .async_mirror_pin = NULL, .rolling_counter_mult = 1, - .rolling_counter_value = 0x0, .ext_power_amp = false, .dangerous_frequency_i = false, }; -uint8_t furi_hal_subghz_get_rolling_counter_mult(void) { +int8_t furi_hal_subghz_get_rolling_counter_mult(void) { return furi_hal_subghz.rolling_counter_mult; } -void furi_hal_subghz_set_rolling_counter_mult(uint8_t mult) { +void furi_hal_subghz_set_rolling_counter_mult(int8_t mult) { furi_hal_subghz.rolling_counter_mult = mult; } -uint32_t furi_hal_subghz_get_rolling_counter_value(void) { - return furi_hal_subghz.rolling_counter_value; -} - -void furi_hal_subghz_set_rolling_counter_value(uint32_t value) { - furi_hal_subghz.rolling_counter_value = value; -} - void furi_hal_subghz_set_dangerous_frequency(bool state_i) { furi_hal_subghz.dangerous_frequency_i = state_i; } diff --git a/firmware/targets/f7/furi_hal/furi_hal_subghz.h b/firmware/targets/f7/furi_hal/furi_hal_subghz.h index e9a3e7a03..136a2af41 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_subghz.h +++ b/firmware/targets/f7/furi_hal/furi_hal_subghz.h @@ -173,25 +173,15 @@ uint32_t furi_hal_subghz_set_frequency_and_path(uint32_t value); */ bool furi_hal_subghz_is_tx_allowed(uint32_t value); -/** Get the current rolling protocols counter ++ value - * @return uint8_t current value +/** Get the current rolling protocols counter ++/-- value + * @return int8_t current value */ -uint8_t furi_hal_subghz_get_rolling_counter_mult(void); +int8_t furi_hal_subghz_get_rolling_counter_mult(void); -/** Set the current rolling protocols counter ++ value - * @param mult uint8_t = 1, 2, 4, 8 +/** Set the current rolling protocols counter ++/-- value + * @param mult int8_t = -1, -10, -100, 0, 1, 10, 100 */ -void furi_hal_subghz_set_rolling_counter_mult(uint8_t mult); - -/** Get the current rolling protocols counter value - * @return uint32_t current value - */ -uint32_t furi_hal_subghz_get_rolling_counter_value(void); - -/** Set the current rolling protocols counter value - * @param value uint32_t = 0xFFFF / 0xFFFFF / 0xFFFFFFFF - */ -void furi_hal_subghz_set_rolling_counter_value(uint32_t value); +void furi_hal_subghz_set_rolling_counter_mult(int8_t mult); /** Set frequency * From b91f8d009e13735b2f0b6317cd0dd9554851dbac Mon Sep 17 00:00:00 2001 From: Eng1n33r <101719414+Eng1n33r@users.noreply.github.com> Date: Thu, 31 Aug 2023 22:39:22 +0300 Subject: [PATCH 11/20] Fix KL unknown mf cnt bug --- lib/subghz/protocols/keeloq.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/subghz/protocols/keeloq.c b/lib/subghz/protocols/keeloq.c index a274602f3..0bda954ba 100644 --- a/lib/subghz/protocols/keeloq.c +++ b/lib/subghz/protocols/keeloq.c @@ -990,7 +990,7 @@ static void subghz_protocol_keeloq_check_remote_controller( instance->cnt = temp_counter; } else { // Counter protection - furi_crash("Unsuported Prog Mode"); + furi_crash("Unsupported Prog Mode"); } instance->serial = key_fix & 0x0FFFFFFF; @@ -1249,6 +1249,23 @@ void subghz_protocol_decoder_keeloq_get_string(void* context, FuriString* output instance->generic.btn, instance->manufacture_name, instance->generic.seed); + } else if(strcmp(instance->manufacture_name, "Unknown") == 0) { + instance->generic.cnt = 0x0; + furi_string_cat_printf( + output, + "%s %dbit\r\n" + "Key:%08lX%08lX\r\n" + "Fix:0x%08lX Cnt:????\r\n" + "Hop:0x%08lX Btn:%01X\r\n" + "MF:%s", + instance->generic.protocol_name, + instance->generic.data_count_bit, + code_found_hi, + code_found_lo, + code_found_reverse_hi, + code_found_reverse_lo, + instance->generic.btn, + instance->manufacture_name); } else { furi_string_cat_printf( output, From 3898e6e71d7134becb07bff72ccf3ec7e640eeba Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 2 Sep 2023 16:00:24 +0300 Subject: [PATCH 12/20] Fixes and de-kostilying --- .../helpers/subghz_txrx_create_protocol_key.c | 4 +- .../scenes/subghz_scene_radio_settings.c | 6 +-- lib/subghz/blocks/generic.h | 1 + lib/subghz/protocols/faac_slh.c | 40 +++++-------------- 4 files changed, 15 insertions(+), 36 deletions(-) diff --git a/applications/main/subghz/helpers/subghz_txrx_create_protocol_key.c b/applications/main/subghz/helpers/subghz_txrx_create_protocol_key.c index ba72652f2..149d1d711 100644 --- a/applications/main/subghz/helpers/subghz_txrx_create_protocol_key.c +++ b/applications/main/subghz/helpers/subghz_txrx_create_protocol_key.c @@ -228,9 +228,9 @@ bool subghz_txrx_gen_faac_slh_protocol( seed_data[sizeof(uint32_t) - i - 1] = (seed >> i * 8) & 0xFF; } + bool allow_zero_seed = true; flipper_format_write_hex(txrx->fff_data, "Seed", seed_data, sizeof(uint32_t)); - flipper_format_write_string_cstr(txrx->fff_data, "Valid", "1\r\n"); - FURI_LOG_I(TAG, "Flag write to SD is OK"); + flipper_format_write_bool(txrx->fff_data, "AllowZeroSeed", &allow_zero_seed, 1); } subghz_transmitter_free(txrx->transmitter); diff --git a/applications/main/subghz/scenes/subghz_scene_radio_settings.c b/applications/main/subghz/scenes/subghz_scene_radio_settings.c index 864df6326..1b83510a9 100644 --- a/applications/main/subghz/scenes/subghz_scene_radio_settings.c +++ b/applications/main/subghz/scenes/subghz_scene_radio_settings.c @@ -32,7 +32,7 @@ const char* const debug_pin_text[DEBUG_P_COUNT] = { "17(1W)", }; -#define DEBUG_COUNTER_COUNT 15 +#define DEBUG_COUNTER_COUNT 13 const char* const debug_counter_text[DEBUG_COUNTER_COUNT] = { "+1", "+2", @@ -40,7 +40,6 @@ const char* const debug_counter_text[DEBUG_COUNTER_COUNT] = { "+4", "+5", "+10", - "+100", "0", "-1", "-2", @@ -48,7 +47,6 @@ const char* const debug_counter_text[DEBUG_COUNTER_COUNT] = { "-4", "-5", "-10", - "-100", }; const uint32_t debug_counter_val[DEBUG_COUNTER_COUNT] = { 1, @@ -57,7 +55,6 @@ const uint32_t debug_counter_val[DEBUG_COUNTER_COUNT] = { 4, 5, 10, - 100, 0, -1, -2, @@ -65,7 +62,6 @@ const uint32_t debug_counter_val[DEBUG_COUNTER_COUNT] = { -4, -5, -10, - -100, }; static void subghz_scene_radio_settings_set_device(VariableItem* item) { diff --git a/lib/subghz/blocks/generic.h b/lib/subghz/blocks/generic.h index 10e7b63fa..be61f533e 100644 --- a/lib/subghz/blocks/generic.h +++ b/lib/subghz/blocks/generic.h @@ -25,6 +25,7 @@ struct SubGhzBlockGeneric { uint32_t cnt; uint8_t cnt_2; uint32_t seed; + bool allow_zero_seed; }; /** diff --git a/lib/subghz/protocols/faac_slh.c b/lib/subghz/protocols/faac_slh.c index b01e3a02e..319c6288f 100644 --- a/lib/subghz/protocols/faac_slh.c +++ b/lib/subghz/protocols/faac_slh.c @@ -10,8 +10,6 @@ #define TAG "SubGhzProtocolFaacSLH" -bool bvalid; - static const SubGhzBlockConst subghz_protocol_faac_slh_const = { .te_short = 255, .te_long = 595, @@ -112,21 +110,10 @@ void subghz_protocol_encoder_faac_slh_free(void* context) { } static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* instance) { - //FuriString* valid = furi_string_alloc(); - //if(flipper_format_read_string(flipper_format, "Valid", valid)) { - //bvalid = true; - //FURI_LOG_I(TAG, "[gen_data] is valid ? : %i", bvalid); - //} else { - //bvalid = false; - //FURI_LOG_I(TAG, "[gen_data] is valid ? : %i", bvalid); - //} - //furi_string_free(valid); - if(bvalid) { + if(instance->generic.allow_zero_seed) { instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); - FURI_LOG_I(TAG, "[gen_data] TRUE : %i", bvalid); } else { // Do not generate new data, send data from buffer - FURI_LOG_I(TAG, "[gen_data] FALSE : %i", bvalid); return true; } uint32_t fix = instance->generic.serial << 4 | instance->generic.btn; @@ -255,15 +242,13 @@ SubGhzProtocolStatus FURI_LOG_E(TAG, "Missing Seed"); break; } - FuriString* valid = furi_string_alloc(); - if(flipper_format_read_string(flipper_format, "Valid", valid)) { - bvalid = true; - FURI_LOG_I(TAG, "[encoder_des] True : %i", bvalid); + bool allow_zero_seed; + if(flipper_format_read_bool(flipper_format, "AllowZeroSeed", &allow_zero_seed, 1)) { + instance->generic.allow_zero_seed = true; } else { - bvalid = false; - FURI_LOG_I(TAG, "[encoder_des] False : %i", bvalid); + instance->generic.allow_zero_seed = false; } - furi_string_free(valid); + instance->generic.seed = seed_data[0] << 24 | seed_data[1] << 16 | seed_data[2] << 8 | seed_data[3]; @@ -508,15 +493,12 @@ SubGhzProtocolStatus FURI_LOG_E(TAG, "Missing Seed"); break; } - FuriString* valid = furi_string_alloc(); - if(flipper_format_read_string(flipper_format, "Valid", valid)) { - bvalid = true; - FURI_LOG_I(TAG, "[decoder_des] TRUE : %i", bvalid); + bool allow_zero_seed; + if(flipper_format_read_bool(flipper_format, "AllowZeroSeed", &allow_zero_seed, 1)) { + instance->generic.allow_zero_seed = true; } else { - bvalid = false; - FURI_LOG_I(TAG, "[decoder_des] FALSE : %i", bvalid); + instance->generic.allow_zero_seed = false; } - furi_string_free(valid); instance->generic.seed = seed_data[0] << 24 | seed_data[1] << 16 | seed_data[2] << 8 | seed_data[3]; @@ -538,7 +520,7 @@ void subghz_protocol_decoder_faac_slh_get_string(void* context, FuriString* outp uint32_t code_fix = instance->generic.data >> 32; uint32_t code_hop = instance->generic.data & 0xFFFFFFFF; - if(bvalid == false) { + if(instance->generic.allow_zero_seed == false) { furi_string_cat_printf( output, "%s %dbit\r\n" From 72e6f5f59e009233924529b556570a31b15b34ce Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 2 Sep 2023 16:02:32 +0300 Subject: [PATCH 13/20] fix --- assets/protobuf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/protobuf b/assets/protobuf index 7e011a958..327163d58 160000 --- a/assets/protobuf +++ b/assets/protobuf @@ -1 +1 @@ -Subproject commit 7e011a95863716e72e7c6b5d552bca241d688304 +Subproject commit 327163d5867c7aa3051334c93ced718d15bfe4da From 265d2592e7bf60b4ff2f1ed5e293abf6b093059f Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 2 Sep 2023 16:26:19 +0300 Subject: [PATCH 14/20] proper check --- lib/subghz/protocols/faac_slh.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/subghz/protocols/faac_slh.c b/lib/subghz/protocols/faac_slh.c index 319c6288f..1d9b66d29 100644 --- a/lib/subghz/protocols/faac_slh.c +++ b/lib/subghz/protocols/faac_slh.c @@ -110,7 +110,7 @@ void subghz_protocol_encoder_faac_slh_free(void* context) { } static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* instance) { - if(instance->generic.allow_zero_seed) { + if(instance->generic.allow_zero_seed || (instance->generic.seed != 0x0)) { instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); } else { // Do not generate new data, send data from buffer From 06a528f497b08e6517802431d8892dd7386dce0d Mon Sep 17 00:00:00 2001 From: Eng1n33r <101719414+Eng1n33r@users.noreply.github.com> Date: Sat, 2 Sep 2023 19:00:45 +0300 Subject: [PATCH 15/20] FAAC SLH prog mode [beta] --- lib/subghz/blocks/generic.h | 1 + lib/subghz/protocols/faac_slh.c | 96 ++++++++++++++++++++++++++++++++- 2 files changed, 96 insertions(+), 1 deletion(-) diff --git a/lib/subghz/blocks/generic.h b/lib/subghz/blocks/generic.h index be61f533e..6f3395620 100644 --- a/lib/subghz/blocks/generic.h +++ b/lib/subghz/blocks/generic.h @@ -25,6 +25,7 @@ struct SubGhzBlockGeneric { uint32_t cnt; uint8_t cnt_2; uint32_t seed; + bool prg_mode; bool allow_zero_seed; }; diff --git a/lib/subghz/protocols/faac_slh.c b/lib/subghz/protocols/faac_slh.c index 1d9b66d29..2d3510002 100644 --- a/lib/subghz/protocols/faac_slh.c +++ b/lib/subghz/protocols/faac_slh.c @@ -112,6 +112,43 @@ void subghz_protocol_encoder_faac_slh_free(void* context) { static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* instance) { if(instance->generic.allow_zero_seed || (instance->generic.seed != 0x0)) { instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + } else if(instance->generic.prg_mode == true) { + uint8_t data_tmp = 0; + uint8_t data_prg[8]; + + instance->generic.cnt_2++; + + data_prg[0] = 0x00; + + data_prg[1] = instance->generic.cnt_2; + + data_prg[2] = (uint8_t)(instance->generic.seed & 0xFF); + data_prg[3] = (uint8_t)(instance->generic.seed >> 8 & 0xFF); + data_prg[4] = (uint8_t)(instance->generic.seed >> 16 & 0xFF); + data_prg[5] = (uint8_t)(instance->generic.seed >> 24); + + data_prg[2] ^= data_prg[1]; + data_prg[3] ^= data_prg[1]; + data_prg[4] ^= data_prg[1]; + data_prg[5] ^= data_prg[1]; + + for(uint8_t i=data_prg[1] & 0x0F ; i!=0; i--) { + data_tmp = data_prg[5]; + + data_prg[5] = ((data_prg[5] << 1) & 0xFF) | (data_prg[4] & 0x80) >> 7; + data_prg[4] = ((data_prg[4] << 1) & 0xFF) | (data_prg[3] & 0x80) >> 7; + data_prg[3] = ((data_prg[3] << 1) & 0xFF) | (data_prg[2] & 0x80) >> 7; + data_prg[2] = ((data_prg[2] << 1) & 0xFF) | (data_tmp & 0x80) >> 7; + } + data_prg[6] = 0x0F; + data_prg[7] = 0x52; + + uint32_t enc_prg_1 = data_prg[7] << 24 | data_prg[6] << 16 | data_prg[5] << 8 | data_prg[4]; + uint32_t enc_prg_2 = data_prg[3] << 24 | data_prg[2] << 16 | data_prg[1] << 8 | data_prg[0]; + instance->generic.data = (uint64_t)enc_prg_1 << 32 | enc_prg_2; + FURI_LOG_I(TAG, "New MasterKey encrypted : %016llX\r", instance->generic.data); + + return true; } else { // Do not generate new data, send data from buffer return true; @@ -415,6 +452,48 @@ static void subghz_protocol_faac_slh_check_remote_controller( uint32_t decrypt = 0; uint64_t man; + uint8_t data_tmp = 0; + uint8_t data_prg[8]; + data_prg[0] = (code_hop & 0xFF); + data_prg[1] = ((code_hop >> 8) & 0xFF); + data_prg[2] = ((code_hop >> 16) & 0xFF); + data_prg[3] = (code_hop >> 24); + data_prg[4] = (code_fix & 0xFF); + data_prg[5] = ((code_fix >> 8) & 0xFF); + data_prg[6] = ((code_fix >> 16) & 0xFF); + data_prg[7] = (code_fix >> 24); + + if( (data_prg[7] == 0x52) && (data_prg[6] == 0x0F) && (data_prg[0] == 0x00) ) { + instance->prg_mode = true; + // ProgMode ON + FURI_LOG_I(TAG, "Master Key detected!"); + + for(uint8_t i = data_prg[1] & 0xF; i != 0; i--) { + + data_tmp = data_prg[2]; + + data_prg[2] = data_prg[2] >> 1 | (data_prg[3] & 1) << 7; + data_prg[3] = data_prg[3] >> 1 | (data_prg[4] & 1) << 7; + data_prg[4] = data_prg[4] >> 1 | (data_prg[5] & 1) << 7; + data_prg[5] = data_prg[5] >> 1 | (data_tmp & 1) << 7; + + } + data_prg[2] ^= data_prg[1]; + data_prg[3] ^= data_prg[1]; + data_prg[4] ^= data_prg[1]; + data_prg[5] ^= data_prg[1]; + FURI_LOG_I(TAG, "Got SEED value!"); + instance->seed = data_prg[5] << 24 | data_prg[4] << 16 | data_prg[3] << 8 | data_prg[2]; + FURI_LOG_I(TAG, "SEED = %08lX", instance->seed); + uint32_t dec_prg_1 = data_prg[7] << 24 | data_prg[6] << 16 | data_prg[5] << 8 | data_prg[4]; + uint32_t dec_prg_2 = data_prg[3] << 24 | data_prg[2] << 16 | data_prg[1] << 8 | data_prg[0]; + instance->data_2 = (uint64_t)dec_prg_1 << 32 | dec_prg_2; + FURI_LOG_I(TAG, "MasterKey decrypted : %016llX\r", instance->data_2); + instance->cnt_2 = data_prg[1]; + } else { + instance->prg_mode = false; + } + for M_EACH(manufacture_code, *subghz_keystore_get_data(keystore), SubGhzKeyArray_t) { switch(manufacture_code->type) { @@ -520,7 +599,22 @@ void subghz_protocol_decoder_faac_slh_get_string(void* context, FuriString* outp uint32_t code_fix = instance->generic.data >> 32; uint32_t code_hop = instance->generic.data & 0xFFFFFFFF; - if(instance->generic.allow_zero_seed == false) { + if(instance->generic.prg_mode == true) { + furi_string_cat_printf( + output, + "%s %dbit\r\n" + "Ke:%lX%08lX\r\n" + "Kd:%lX%08lX\r\n" + "Seed:%08lX mCnt:%02X", + instance->generic.protocol_name, + instance->generic.data_count_bit, + (uint32_t)(instance->generic.data >> 32), + (uint32_t)instance->generic.data, + (uint32_t)(instance->generic.data_2 >> 32), + (uint32_t)instance->generic.data_2, + instance->generic.seed, + instance->generic.cnt_2); + } else if(instance->generic.allow_zero_seed == false) { furi_string_cat_printf( output, "%s %dbit\r\n" From 7d2deb5939a42285f934193ad04c2e3483240145 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 2 Sep 2023 21:45:51 +0300 Subject: [PATCH 16/20] add some non working code --- lib/subghz/blocks/custom_btn_i.h | 1 + lib/subghz/blocks/generic.h | 3 +- lib/subghz/protocols/faac_slh.c | 152 +++++++++++++++++++++++++++++-- 3 files changed, 148 insertions(+), 8 deletions(-) diff --git a/lib/subghz/blocks/custom_btn_i.h b/lib/subghz/blocks/custom_btn_i.h index f75ba4068..2aadba6f4 100644 --- a/lib/subghz/blocks/custom_btn_i.h +++ b/lib/subghz/blocks/custom_btn_i.h @@ -5,6 +5,7 @@ #define PROG_MODE_OFF (0U) #define PROG_MODE_KEELOQ_BFT (1U) #define PROG_MODE_KEELOQ_APRIMATIC (2U) +#define PROG_MODE_FAAC_SLH (3U) typedef uint8_t ProgMode; diff --git a/lib/subghz/blocks/generic.h b/lib/subghz/blocks/generic.h index be61f533e..4b2b6a017 100644 --- a/lib/subghz/blocks/generic.h +++ b/lib/subghz/blocks/generic.h @@ -25,7 +25,8 @@ struct SubGhzBlockGeneric { uint32_t cnt; uint8_t cnt_2; uint32_t seed; - bool allow_zero_seed; + bool allow_zero_seed : 1; + bool prg_mode : 1; }; /** diff --git a/lib/subghz/protocols/faac_slh.c b/lib/subghz/protocols/faac_slh.c index 1d9b66d29..1cddcec85 100644 --- a/lib/subghz/protocols/faac_slh.c +++ b/lib/subghz/protocols/faac_slh.c @@ -8,6 +8,8 @@ #include "../blocks/generic.h" #include "../blocks/math.h" +#include "../blocks/custom_btn_i.h" + #define TAG "SubGhzProtocolFaacSLH" static const SubGhzBlockConst subghz_protocol_faac_slh_const = { @@ -110,11 +112,77 @@ void subghz_protocol_encoder_faac_slh_free(void* context) { } static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* instance) { - if(instance->generic.allow_zero_seed || (instance->generic.seed != 0x0)) { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); - } else { - // Do not generate new data, send data from buffer + // Stupid bypass for custom button, remake later + if(subghz_custom_btn_get_original() == 0) { + subghz_custom_btn_set_original(0xF); + } + + uint8_t custom_btn_id = subghz_custom_btn_get(); + ProgMode prog_mode_btn_status = subghz_custom_btn_get_prog_mode(); + bool button_for_programming = false; + + FURI_LOG_I("GENDATA", "CUSTOMBTN: %d\r", subghz_custom_btn_get()); + + // If custom button left is pressed, enable programming mode and disable it on Ok button + if((custom_btn_id == SUBGHZ_CUSTOM_BTN_OK)) { + if(prog_mode_btn_status == PROG_MODE_FAAC_SLH) { + button_for_programming = false; + prog_mode_btn_status = PROG_MODE_OFF; + } + } else if(custom_btn_id == SUBGHZ_CUSTOM_BTN_UP) { + button_for_programming = true; + prog_mode_btn_status = PROG_MODE_FAAC_SLH; + } + subghz_custom_btn_set_prog_mode(prog_mode_btn_status); + FURI_LOG_I("FAAC", "Button for programming: %d\r", button_for_programming); + FURI_LOG_I("FAAC", "Programming mode: %d\r", instance->generic.prg_mode); + + if(button_for_programming) { + uint8_t data_tmp = 0; + uint8_t data_prg[8]; + + data_prg[0] = 0x00; + + if(instance->generic.allow_zero_seed || (instance->generic.seed != 0x0)) { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + } + + data_prg[1] = instance->generic.cnt & 0xFF; + + data_prg[2] = (uint8_t)(instance->generic.seed & 0xFF); + data_prg[3] = (uint8_t)(instance->generic.seed >> 8 & 0xFF); + data_prg[4] = (uint8_t)(instance->generic.seed >> 16 & 0xFF); + data_prg[5] = (uint8_t)(instance->generic.seed >> 24); + + data_prg[2] ^= data_prg[1]; + data_prg[3] ^= data_prg[1]; + data_prg[4] ^= data_prg[1]; + data_prg[5] ^= data_prg[1]; + + for(uint8_t i = data_prg[1] & 0x0F; i != 0; i--) { + data_tmp = data_prg[5]; + + data_prg[5] = ((data_prg[5] << 1) & 0xFF) | (data_prg[4] & 0x80) >> 7; + data_prg[4] = ((data_prg[4] << 1) & 0xFF) | (data_prg[3] & 0x80) >> 7; + data_prg[3] = ((data_prg[3] << 1) & 0xFF) | (data_prg[2] & 0x80) >> 7; + data_prg[2] = ((data_prg[2] << 1) & 0xFF) | (data_tmp & 0x80) >> 7; + } + data_prg[6] = 0x0F; + data_prg[7] = 0x52; + + uint32_t enc_prg_1 = data_prg[7] << 24 | data_prg[6] << 16 | data_prg[5] << 8 | + data_prg[4]; + uint32_t enc_prg_2 = data_prg[3] << 24 | data_prg[2] << 16 | data_prg[1] << 8 | + data_prg[0]; + instance->generic.data = (uint64_t)enc_prg_1 << 32 | enc_prg_2; + FURI_LOG_I(TAG, "New MasterKey encrypted : %016llX\r", instance->generic.data); + return true; + } else { + if(!instance->generic.allow_zero_seed && (instance->generic.seed == 0x0)) { + // Do not generate new data, send data from buffer + return true; + } } uint32_t fix = instance->generic.serial << 4 | instance->generic.btn; uint32_t hop = 0; @@ -126,6 +194,11 @@ static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* inst for(int i = 0; i < 8; i++) { fixx[i] = (fix >> (shiftby -= 4)) & 0xF; } + + if(instance->generic.allow_zero_seed || (instance->generic.seed != 0x0)) { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + } + if((instance->generic.cnt % 2) == 0) { decrypt = fixx[6] << 28 | fixx[7] << 24 | fixx[5] << 20 | (instance->generic.cnt & 0xFFFFF); @@ -172,6 +245,7 @@ bool subghz_protocol_faac_slh_create_data( instance->generic.seed = seed; instance->manufacture_name = manufacture_name; instance->generic.data_count_bit = 64; + instance->generic.allow_zero_seed = true; bool res = subghz_protocol_faac_slh_gen_data(instance); if(res) { return SubGhzProtocolStatusOk == @@ -410,11 +484,59 @@ static void subghz_protocol_faac_slh_check_remote_controller( const char** manufacture_name) { uint32_t code_fix = instance->data >> 32; uint32_t code_hop = instance->data & 0xFFFFFFFF; - instance->serial = code_fix >> 4; - instance->btn = code_fix & 0xF; uint32_t decrypt = 0; uint64_t man; + // Stupid bypass for custom button, remake later + if(subghz_custom_btn_get_original() == 0) { + subghz_custom_btn_set_original(0xF); + } + + subghz_custom_btn_set_max(1); + FURI_LOG_I("RMC", "CUSTOMBTN: %d\r", subghz_custom_btn_get()); + uint8_t data_tmp = 0; + uint8_t data_prg[8]; + data_prg[0] = (code_hop & 0xFF); + data_prg[1] = ((code_hop >> 8) & 0xFF); + data_prg[2] = ((code_hop >> 16) & 0xFF); + data_prg[3] = (code_hop >> 24); + data_prg[4] = (code_fix & 0xFF); + data_prg[5] = ((code_fix >> 8) & 0xFF); + data_prg[6] = ((code_fix >> 16) & 0xFF); + data_prg[7] = (code_fix >> 24); + + if(((data_prg[7] == 0x52) && (data_prg[6] == 0x0F) && (data_prg[0] == 0x00))) { + instance->prg_mode = true; + // ProgMode ON + for(uint8_t i = data_prg[1] & 0xF; i != 0; i--) { + data_tmp = data_prg[2]; + + data_prg[2] = data_prg[2] >> 1 | (data_prg[3] & 1) << 7; + data_prg[3] = data_prg[3] >> 1 | (data_prg[4] & 1) << 7; + data_prg[4] = data_prg[4] >> 1 | (data_prg[5] & 1) << 7; + data_prg[5] = data_prg[5] >> 1 | (data_tmp & 1) << 7; + } + data_prg[2] ^= data_prg[1]; + data_prg[3] ^= data_prg[1]; + data_prg[4] ^= data_prg[1]; + data_prg[5] ^= data_prg[1]; + instance->seed = data_prg[5] << 24 | data_prg[4] << 16 | data_prg[3] << 8 | data_prg[2]; + uint32_t dec_prg_1 = data_prg[7] << 24 | data_prg[6] << 16 | data_prg[5] << 8 | + data_prg[4]; + uint32_t dec_prg_2 = data_prg[3] << 24 | data_prg[2] << 16 | data_prg[1] << 8 | + data_prg[0]; + instance->data_2 = (uint64_t)dec_prg_1 << 32 | dec_prg_2; + instance->cnt = data_prg[1]; + + *manufacture_name = "FAAC_SLH"; + return; + } else { + instance->serial = code_fix >> 4; + instance->btn = code_fix & 0xF; + + instance->prg_mode = false; + } + for M_EACH(manufacture_code, *subghz_keystore_get_data(keystore), SubGhzKeyArray_t) { switch(manufacture_code->type) { @@ -520,7 +642,23 @@ void subghz_protocol_decoder_faac_slh_get_string(void* context, FuriString* outp uint32_t code_fix = instance->generic.data >> 32; uint32_t code_hop = instance->generic.data & 0xFFFFFFFF; - if(instance->generic.allow_zero_seed == false) { + if(instance->generic.prg_mode == true) { + furi_string_cat_printf( + output, + "%s %dbit\r\n" + "Master Remote Prog Mode\r\n" + "Ke:%lX%08lX\r\n" + "Kd:%lX%08lX\r\n" + "Seed:%08lX mCnt:%02X", + instance->generic.protocol_name, + instance->generic.data_count_bit, + (uint32_t)(instance->generic.data >> 32), + (uint32_t)instance->generic.data, + (uint32_t)(instance->generic.data_2 >> 32), + (uint32_t)instance->generic.data_2, + instance->generic.seed, + (uint8_t)(instance->generic.cnt & 0xFF)); + } else if(instance->generic.allow_zero_seed == false) { furi_string_cat_printf( output, "%s %dbit\r\n" From 2a789ae1c1996e40a9e3d6e69b93c2dd00f8a250 Mon Sep 17 00:00:00 2001 From: Eng1n33r <101719414+Eng1n33r@users.noreply.github.com> Date: Mon, 4 Sep 2023 23:55:08 +0300 Subject: [PATCH 17/20] faac beta-3 --- lib/subghz/protocols/faac_slh.c | 137 ++++++++++++-------------------- 1 file changed, 50 insertions(+), 87 deletions(-) diff --git a/lib/subghz/protocols/faac_slh.c b/lib/subghz/protocols/faac_slh.c index 1cddcec85..14e3b1789 100644 --- a/lib/subghz/protocols/faac_slh.c +++ b/lib/subghz/protocols/faac_slh.c @@ -8,8 +8,6 @@ #include "../blocks/generic.h" #include "../blocks/math.h" -#include "../blocks/custom_btn_i.h" - #define TAG "SubGhzProtocolFaacSLH" static const SubGhzBlockConst subghz_protocol_faac_slh_const = { @@ -112,42 +110,18 @@ void subghz_protocol_encoder_faac_slh_free(void* context) { } static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* instance) { - // Stupid bypass for custom button, remake later - if(subghz_custom_btn_get_original() == 0) { - subghz_custom_btn_set_original(0xF); - } - - uint8_t custom_btn_id = subghz_custom_btn_get(); - ProgMode prog_mode_btn_status = subghz_custom_btn_get_prog_mode(); - bool button_for_programming = false; - - FURI_LOG_I("GENDATA", "CUSTOMBTN: %d\r", subghz_custom_btn_get()); - - // If custom button left is pressed, enable programming mode and disable it on Ok button - if((custom_btn_id == SUBGHZ_CUSTOM_BTN_OK)) { - if(prog_mode_btn_status == PROG_MODE_FAAC_SLH) { - button_for_programming = false; - prog_mode_btn_status = PROG_MODE_OFF; - } - } else if(custom_btn_id == SUBGHZ_CUSTOM_BTN_UP) { - button_for_programming = true; - prog_mode_btn_status = PROG_MODE_FAAC_SLH; - } - subghz_custom_btn_set_prog_mode(prog_mode_btn_status); - FURI_LOG_I("FAAC", "Button for programming: %d\r", button_for_programming); - FURI_LOG_I("FAAC", "Programming mode: %d\r", instance->generic.prg_mode); - - if(button_for_programming) { + if(instance->generic.allow_zero_seed || (instance->generic.seed != 0x0)) { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + FURI_LOG_I(TAG, "Counter ++"); + } else if(instance->generic.prg_mode == true) { uint8_t data_tmp = 0; uint8_t data_prg[8]; + instance->generic.cnt_2++; + data_prg[0] = 0x00; - if(instance->generic.allow_zero_seed || (instance->generic.seed != 0x0)) { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); - } - - data_prg[1] = instance->generic.cnt & 0xFF; + data_prg[1] = instance->generic.cnt_2; data_prg[2] = (uint8_t)(instance->generic.seed & 0xFF); data_prg[3] = (uint8_t)(instance->generic.seed >> 8 & 0xFF); @@ -159,30 +133,27 @@ static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* inst data_prg[4] ^= data_prg[1]; data_prg[5] ^= data_prg[1]; - for(uint8_t i = data_prg[1] & 0x0F; i != 0; i--) { - data_tmp = data_prg[5]; + for(uint8_t i=data_prg[1] & 0x0F ; i!=0; i--) { + data_tmp = data_prg[5]; - data_prg[5] = ((data_prg[5] << 1) & 0xFF) | (data_prg[4] & 0x80) >> 7; - data_prg[4] = ((data_prg[4] << 1) & 0xFF) | (data_prg[3] & 0x80) >> 7; - data_prg[3] = ((data_prg[3] << 1) & 0xFF) | (data_prg[2] & 0x80) >> 7; - data_prg[2] = ((data_prg[2] << 1) & 0xFF) | (data_tmp & 0x80) >> 7; - } + data_prg[5] = ((data_prg[5] << 1) & 0xFF) | (data_prg[4] & 0x80) >> 7; + data_prg[4] = ((data_prg[4] << 1) & 0xFF) | (data_prg[3] & 0x80) >> 7; + data_prg[3] = ((data_prg[3] << 1) & 0xFF) | (data_prg[2] & 0x80) >> 7; + data_prg[2] = ((data_prg[2] << 1) & 0xFF) | (data_tmp & 0x80) >> 7; + } data_prg[6] = 0x0F; data_prg[7] = 0x52; - uint32_t enc_prg_1 = data_prg[7] << 24 | data_prg[6] << 16 | data_prg[5] << 8 | - data_prg[4]; - uint32_t enc_prg_2 = data_prg[3] << 24 | data_prg[2] << 16 | data_prg[1] << 8 | - data_prg[0]; + uint32_t enc_prg_1 = data_prg[7] << 24 | data_prg[6] << 16 | data_prg[5] << 8 | data_prg[4]; + uint32_t enc_prg_2 = data_prg[3] << 24 | data_prg[2] << 16 | data_prg[1] << 8 | data_prg[0]; instance->generic.data = (uint64_t)enc_prg_1 << 32 | enc_prg_2; - FURI_LOG_I(TAG, "New MasterKey encrypted : %016llX\r", instance->generic.data); + FURI_LOG_I(TAG, "New MasterKey encrypted : %016llX", instance->generic.data); return true; } else { - if(!instance->generic.allow_zero_seed && (instance->generic.seed == 0x0)) { - // Do not generate new data, send data from buffer - return true; - } + // Do not generate new data, send data from buffer + FURI_LOG_I(TAG, "Unknown / Static mode"); + return true; } uint32_t fix = instance->generic.serial << 4 | instance->generic.btn; uint32_t hop = 0; @@ -194,11 +165,6 @@ static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* inst for(int i = 0; i < 8; i++) { fixx[i] = (fix >> (shiftby -= 4)) & 0xF; } - - if(instance->generic.allow_zero_seed || (instance->generic.seed != 0x0)) { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); - } - if((instance->generic.cnt % 2) == 0) { decrypt = fixx[6] << 28 | fixx[7] << 24 | fixx[5] << 20 | (instance->generic.cnt & 0xFFFFF); @@ -319,8 +285,10 @@ SubGhzProtocolStatus bool allow_zero_seed; if(flipper_format_read_bool(flipper_format, "AllowZeroSeed", &allow_zero_seed, 1)) { instance->generic.allow_zero_seed = true; + FURI_LOG_I(TAG, "Enc. des. TRUE"); } else { instance->generic.allow_zero_seed = false; + FURI_LOG_I(TAG, "Enc. des. FALSE"); } instance->generic.seed = seed_data[0] << 24 | seed_data[1] << 16 | seed_data[2] << 8 | @@ -484,16 +452,11 @@ static void subghz_protocol_faac_slh_check_remote_controller( const char** manufacture_name) { uint32_t code_fix = instance->data >> 32; uint32_t code_hop = instance->data & 0xFFFFFFFF; + instance->serial = code_fix >> 4; + instance->btn = code_fix & 0xF; uint32_t decrypt = 0; uint64_t man; - // Stupid bypass for custom button, remake later - if(subghz_custom_btn_get_original() == 0) { - subghz_custom_btn_set_original(0xF); - } - - subghz_custom_btn_set_max(1); - FURI_LOG_I("RMC", "CUSTOMBTN: %d\r", subghz_custom_btn_get()); uint8_t data_tmp = 0; uint8_t data_prg[8]; data_prg[0] = (code_hop & 0xFF); @@ -505,37 +468,36 @@ static void subghz_protocol_faac_slh_check_remote_controller( data_prg[6] = ((code_fix >> 16) & 0xFF); data_prg[7] = (code_fix >> 24); - if(((data_prg[7] == 0x52) && (data_prg[6] == 0x0F) && (data_prg[0] == 0x00))) { + if( (data_prg[7] == 0x52) && (data_prg[6] == 0x0F) && (data_prg[0] == 0x00) ) { instance->prg_mode = true; // ProgMode ON + FURI_LOG_I(TAG, "Master Key detected!"); + for(uint8_t i = data_prg[1] & 0xF; i != 0; i--) { - data_tmp = data_prg[2]; - data_prg[2] = data_prg[2] >> 1 | (data_prg[3] & 1) << 7; - data_prg[3] = data_prg[3] >> 1 | (data_prg[4] & 1) << 7; - data_prg[4] = data_prg[4] >> 1 | (data_prg[5] & 1) << 7; - data_prg[5] = data_prg[5] >> 1 | (data_tmp & 1) << 7; - } - data_prg[2] ^= data_prg[1]; - data_prg[3] ^= data_prg[1]; - data_prg[4] ^= data_prg[1]; - data_prg[5] ^= data_prg[1]; - instance->seed = data_prg[5] << 24 | data_prg[4] << 16 | data_prg[3] << 8 | data_prg[2]; - uint32_t dec_prg_1 = data_prg[7] << 24 | data_prg[6] << 16 | data_prg[5] << 8 | - data_prg[4]; - uint32_t dec_prg_2 = data_prg[3] << 24 | data_prg[2] << 16 | data_prg[1] << 8 | - data_prg[0]; - instance->data_2 = (uint64_t)dec_prg_1 << 32 | dec_prg_2; - instance->cnt = data_prg[1]; + data_tmp = data_prg[2]; - *manufacture_name = "FAAC_SLH"; - return; + data_prg[2] = data_prg[2] >> 1 | (data_prg[3] & 1) << 7; + data_prg[3] = data_prg[3] >> 1 | (data_prg[4] & 1) << 7; + data_prg[4] = data_prg[4] >> 1 | (data_prg[5] & 1) << 7; + data_prg[5] = data_prg[5] >> 1 | (data_tmp & 1) << 7; + + } + data_prg[2] ^= data_prg[1]; + data_prg[3] ^= data_prg[1]; + data_prg[4] ^= data_prg[1]; + data_prg[5] ^= data_prg[1]; + FURI_LOG_I(TAG, "Got SEED value!"); + instance->seed = data_prg[5] << 24 | data_prg[4] << 16 | data_prg[3] << 8 | data_prg[2]; + FURI_LOG_I(TAG, "SEED = %08lX", instance->seed); + uint32_t dec_prg_1 = data_prg[7] << 24 | data_prg[6] << 16 | data_prg[5] << 8 | data_prg[4]; + uint32_t dec_prg_2 = data_prg[3] << 24 | data_prg[2] << 16 | data_prg[1] << 8 | data_prg[0]; + instance->data_2 = (uint64_t)dec_prg_1 << 32 | dec_prg_2; + FURI_LOG_I(TAG, "MasterKey decrypted : %016llX", instance->data_2); + instance->cnt_2 = data_prg[1]; } else { - instance->serial = code_fix >> 4; - instance->btn = code_fix & 0xF; - instance->prg_mode = false; - } + } for M_EACH(manufacture_code, *subghz_keystore_get_data(keystore), SubGhzKeyArray_t) { @@ -618,8 +580,10 @@ SubGhzProtocolStatus bool allow_zero_seed; if(flipper_format_read_bool(flipper_format, "AllowZeroSeed", &allow_zero_seed, 1)) { instance->generic.allow_zero_seed = true; + FURI_LOG_I(TAG, "Dec. des. TRUE"); } else { instance->generic.allow_zero_seed = false; + FURI_LOG_I(TAG, "Dec. des. FALSE"); } instance->generic.seed = seed_data[0] << 24 | seed_data[1] << 16 | seed_data[2] << 8 | seed_data[3]; @@ -646,7 +610,6 @@ void subghz_protocol_decoder_faac_slh_get_string(void* context, FuriString* outp furi_string_cat_printf( output, "%s %dbit\r\n" - "Master Remote Prog Mode\r\n" "Ke:%lX%08lX\r\n" "Kd:%lX%08lX\r\n" "Seed:%08lX mCnt:%02X", @@ -657,7 +620,7 @@ void subghz_protocol_decoder_faac_slh_get_string(void* context, FuriString* outp (uint32_t)(instance->generic.data_2 >> 32), (uint32_t)instance->generic.data_2, instance->generic.seed, - (uint8_t)(instance->generic.cnt & 0xFF)); + instance->generic.cnt_2); } else if(instance->generic.allow_zero_seed == false) { furi_string_cat_printf( output, From 0eb06ba2b7c696751a42a54c41a38b10f939d10f Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Tue, 5 Sep 2023 05:31:03 +0300 Subject: [PATCH 18/20] Actually working progmode, new add manually options + bonus fixes --- .../main/subghz/helpers/subghz_custom_event.h | 2 + .../main/subghz/helpers/subghz_txrx.c | 2 + .../subghz/scenes/subghz_scene_save_name.c | 7 +- .../main/subghz/scenes/subghz_scene_set_cnt.c | 8 +- .../main/subghz/scenes/subghz_scene_set_fix.c | 2 +- .../subghz/scenes/subghz_scene_set_seed.c | 10 +- .../subghz/scenes/subghz_scene_set_type.c | 60 +++++- .../subghz/scenes/subghz_scene_transmitter.c | 5 +- lib/subghz/blocks/custom_btn.c | 2 +- lib/subghz/blocks/custom_btn_i.h | 3 +- lib/subghz/blocks/generic.h | 2 - lib/subghz/protocols/faac_slh.c | 190 ++++++++++++------ lib/subghz/protocols/faac_slh.h | 4 + 13 files changed, 208 insertions(+), 89 deletions(-) diff --git a/applications/main/subghz/helpers/subghz_custom_event.h b/applications/main/subghz/helpers/subghz_custom_event.h index e5321264e..d59d0ea3c 100644 --- a/applications/main/subghz/helpers/subghz_custom_event.h +++ b/applications/main/subghz/helpers/subghz_custom_event.h @@ -6,6 +6,8 @@ typedef enum { SubGhzCustomEventManagerSetRAW, //SubmenuIndex + SubmenuIndexFaacSLH_Manual_433, + SubmenuIndexFaacSLH_Manual_868, SubmenuIndexFaacSLH_433, SubmenuIndexFaacSLH_868, SubmenuIndexBFTClone, diff --git a/applications/main/subghz/helpers/subghz_txrx.c b/applications/main/subghz/helpers/subghz_txrx.c index 5c36a781a..0f8a8da32 100644 --- a/applications/main/subghz/helpers/subghz_txrx.c +++ b/applications/main/subghz/helpers/subghz_txrx.c @@ -665,6 +665,8 @@ void subghz_txrx_reset_dynamic_and_custom_btns(SubGhzTxRx* instance) { furi_assert(instance); subghz_environment_reset_keeloq(instance->environment); + faac_slh_reset_prog_mode(); + subghz_custom_btns_reset(); } diff --git a/applications/main/subghz/scenes/subghz_scene_save_name.c b/applications/main/subghz/scenes/subghz_scene_save_name.c index f523aaddf..6320c12f2 100644 --- a/applications/main/subghz/scenes/subghz_scene_save_name.c +++ b/applications/main/subghz/scenes/subghz_scene_save_name.c @@ -132,7 +132,12 @@ bool subghz_scene_save_name_on_event(void* context, SceneManagerEvent event) { furi_string_set(subghz->file_path, subghz->file_path_tmp); } } - scene_manager_previous_scene(subghz->scene_manager); + if(scene_manager_has_previous_scene(subghz->scene_manager, SubGhzSceneSetSeed)) { + scene_manager_search_and_switch_to_previous_scene( + subghz->scene_manager, SubGhzSceneSetType); + } else { + scene_manager_previous_scene(subghz->scene_manager); + } return true; } else if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubGhzCustomEventSceneSaveName) { diff --git a/applications/main/subghz/scenes/subghz_scene_set_cnt.c b/applications/main/subghz/scenes/subghz_scene_set_cnt.c index 008ffa1ad..0a07557fb 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_cnt.c +++ b/applications/main/subghz/scenes/subghz_scene_set_cnt.c @@ -18,7 +18,7 @@ void subghz_scene_set_cnt_on_enter(void* context) { switch(state) { case SubmenuIndexBFTClone: - byte_input_set_header_text(byte_input, "Enter COUNTER in hex"); + byte_input_set_header_text(byte_input, "Enter COUNTER in Hex"); byte_input_set_result_callback( byte_input, subghz_scene_set_cnt_byte_input_callback, @@ -27,9 +27,9 @@ void subghz_scene_set_cnt_on_enter(void* context) { subghz->secure_data->cnt, 2); break; - case SubmenuIndexFaacSLH_433: - case SubmenuIndexFaacSLH_868: - byte_input_set_header_text(byte_input, "Enter COUNTER in hex [20 bits]"); + case SubmenuIndexFaacSLH_Manual_433: + case SubmenuIndexFaacSLH_Manual_868: + byte_input_set_header_text(byte_input, "Enter COUNTER in Hex 20 bits"); byte_input_set_result_callback( byte_input, subghz_scene_set_cnt_byte_input_callback, diff --git a/applications/main/subghz/scenes/subghz_scene_set_fix.c b/applications/main/subghz/scenes/subghz_scene_set_fix.c index 7564fb24d..b58f39ddd 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_fix.c +++ b/applications/main/subghz/scenes/subghz_scene_set_fix.c @@ -13,7 +13,7 @@ void subghz_scene_set_fix_on_enter(void* context) { // Setup view ByteInput* byte_input = subghz->byte_input; - byte_input_set_header_text(byte_input, "Enter FIX in hex"); + byte_input_set_header_text(byte_input, "Enter FIX in Hex"); byte_input_set_result_callback( byte_input, subghz_scene_set_fix_byte_input_callback, diff --git a/applications/main/subghz/scenes/subghz_scene_set_seed.c b/applications/main/subghz/scenes/subghz_scene_set_seed.c index f7727f0d6..c1f3662cb 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_seed.c +++ b/applications/main/subghz/scenes/subghz_scene_set_seed.c @@ -14,7 +14,7 @@ void subghz_scene_set_seed_on_enter(void* context) { // Setup view ByteInput* byte_input = subghz->byte_input; - byte_input_set_header_text(byte_input, "Enter SEED in hex"); + byte_input_set_header_text(byte_input, "Enter SEED in Hex"); byte_input_set_result_callback( byte_input, subghz_scene_set_seed_byte_input_callback, @@ -62,8 +62,8 @@ bool subghz_scene_set_seed_on_event(void* context, SceneManagerEvent event) { } consumed = true; break; - case SubmenuIndexFaacSLH_433: - case SubmenuIndexFaacSLH_868: + case SubmenuIndexFaacSLH_Manual_433: + case SubmenuIndexFaacSLH_Manual_868: fix_part = subghz->secure_data->fix[0] << 24 | subghz->secure_data->fix[1] << 16 | subghz->secure_data->fix[2] << 8 | subghz->secure_data->fix[3]; @@ -73,7 +73,7 @@ bool subghz_scene_set_seed_on_event(void* context, SceneManagerEvent event) { seed = subghz->secure_data->seed[0] << 24 | subghz->secure_data->seed[1] << 16 | subghz->secure_data->seed[2] << 8 | subghz->secure_data->seed[3]; - if(state == SubmenuIndexFaacSLH_433) { + if(state == SubmenuIndexFaacSLH_Manual_433) { generated_protocol = subghz_txrx_gen_faac_slh_protocol( subghz->txrx, "AM650", @@ -83,7 +83,7 @@ bool subghz_scene_set_seed_on_event(void* context, SceneManagerEvent event) { (cnt & 0xFFFFF), seed, "FAAC_SLH"); - } else if(state == SubmenuIndexFaacSLH_868) { + } else if(state == SubmenuIndexFaacSLH_Manual_868) { generated_protocol = subghz_txrx_gen_faac_slh_protocol( subghz->txrx, "AM650", diff --git a/applications/main/subghz/scenes/subghz_scene_set_type.c b/applications/main/subghz/scenes/subghz_scene_set_type.c index e5a92608e..9f5b61499 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_type.c +++ b/applications/main/subghz/scenes/subghz_scene_set_type.c @@ -13,6 +13,24 @@ void subghz_scene_set_type_submenu_callback(void* context, uint32_t index) { void subghz_scene_set_type_on_enter(void* context) { SubGhz* subghz = context; + submenu_add_item( + subghz->submenu, + "Faac SLH [Man.] 868MHz", + SubmenuIndexFaacSLH_Manual_868, + subghz_scene_set_type_submenu_callback, + subghz); + submenu_add_item( + subghz->submenu, + "Faac SLH [Man.] 433MHz", + SubmenuIndexFaacSLH_Manual_433, + subghz_scene_set_type_submenu_callback, + subghz); + submenu_add_item( + subghz->submenu, + "BFT [Manual] 433MHz", + SubmenuIndexBFTClone, + subghz_scene_set_type_submenu_callback, + subghz); submenu_add_item( subghz->submenu, "Faac SLH 868MHz", @@ -25,12 +43,6 @@ void subghz_scene_set_type_on_enter(void* context) { SubmenuIndexFaacSLH_433, subghz_scene_set_type_submenu_callback, subghz); - submenu_add_item( - subghz->submenu, - "BFT [Manual] 433MHz", - SubmenuIndexBFTClone, - subghz_scene_set_type_submenu_callback, - subghz); submenu_add_item( subghz->submenu, "BFT Mitto 433MHz", @@ -319,10 +331,10 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { uint32_t key = (uint32_t)rand(); switch(event.event) { - case SubmenuIndexFaacSLH_868: + case SubmenuIndexFaacSLH_Manual_868: scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSetFix); break; - case SubmenuIndexFaacSLH_433: + case SubmenuIndexFaacSLH_Manual_433: scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSetFix); break; case SubmenuIndexBFTClone: @@ -390,6 +402,38 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) { generated_protocol = subghz_txrx_gen_data_protocol( subghz->txrx, "AM650", 433920000, SUBGHZ_PROTOCOL_GATE_TX_NAME, rev_key, 24); break; + case SubmenuIndexFaacSLH_433: + generated_protocol = subghz_txrx_gen_faac_slh_protocol( + subghz->txrx, + "AM650", + 433920000, + ((key & 0x00FFFFF0) | 0xA0000006) >> 4, + 0x6, + 0x00002, + key, + "FAAC_SLH"); + if(!generated_protocol) { + furi_string_set( + subghz->error_str, "Function requires\nan SD card with\nfresh databases."); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); + } + break; + case SubmenuIndexFaacSLH_868: + generated_protocol = subghz_txrx_gen_faac_slh_protocol( + subghz->txrx, + "AM650", + 868350000, + ((key & 0x00FFFFF0) | 0xA0000006) >> 4, + 0x6, + 0x00002, + key, + "FAAC_SLH"); + if(!generated_protocol) { + furi_string_set( + subghz->error_str, "Function requires\nan SD card with\nfresh databases."); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); + } + break; case SubmenuIndexBeninca433: generated_protocol = subghz_txrx_gen_keeloq_protocol( subghz->txrx, diff --git a/applications/main/subghz/scenes/subghz_scene_transmitter.c b/applications/main/subghz/scenes/subghz_scene_transmitter.c index 5f1be6c21..bb51c073d 100644 --- a/applications/main/subghz/scenes/subghz_scene_transmitter.c +++ b/applications/main/subghz/scenes/subghz_scene_transmitter.c @@ -20,7 +20,6 @@ bool subghz_scene_transmitter_update_data_show(void* context) { FuriString* frequency_str = furi_string_alloc(); FuriString* modulation_str = furi_string_alloc(); - if(subghz_protocol_decoder_base_deserialize( decoder, subghz_txrx_get_fff_data(subghz->txrx)) == SubGhzProtocolStatusOk) { subghz_protocol_decoder_base_get_string(decoder, key_str); @@ -83,6 +82,10 @@ bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) { // Calling restore! subghz_tx_start(subghz, subghz_txrx_get_fff_data(subghz->txrx)); subghz_txrx_stop(subghz->txrx); + // Calling restore 2nd time special for FAAC SLH! + // TODO: Find better way to restore after custom button is used!!! + subghz_tx_start(subghz, subghz_txrx_get_fff_data(subghz->txrx)); + subghz_txrx_stop(subghz->txrx); furi_hal_subghz_set_rolling_counter_mult(tmp_counter); } return true; diff --git a/lib/subghz/blocks/custom_btn.c b/lib/subghz/blocks/custom_btn.c index 1919fc5e4..e33f79887 100644 --- a/lib/subghz/blocks/custom_btn.c +++ b/lib/subghz/blocks/custom_btn.c @@ -48,4 +48,4 @@ void subghz_custom_btn_set_prog_mode(ProgMode prog_mode) { ProgMode subghz_custom_btn_get_prog_mode() { return controller_programming_mode; -} \ No newline at end of file +} diff --git a/lib/subghz/blocks/custom_btn_i.h b/lib/subghz/blocks/custom_btn_i.h index 2aadba6f4..33ea6be9f 100644 --- a/lib/subghz/blocks/custom_btn_i.h +++ b/lib/subghz/blocks/custom_btn_i.h @@ -5,7 +5,6 @@ #define PROG_MODE_OFF (0U) #define PROG_MODE_KEELOQ_BFT (1U) #define PROG_MODE_KEELOQ_APRIMATIC (2U) -#define PROG_MODE_FAAC_SLH (3U) typedef uint8_t ProgMode; @@ -15,4 +14,4 @@ void subghz_custom_btn_set_max(uint8_t b); void subghz_custom_btn_set_prog_mode(ProgMode prog_mode); -ProgMode subghz_custom_btn_get_prog_mode(); \ No newline at end of file +ProgMode subghz_custom_btn_get_prog_mode(); diff --git a/lib/subghz/blocks/generic.h b/lib/subghz/blocks/generic.h index 19c5f3fbe..10e7b63fa 100644 --- a/lib/subghz/blocks/generic.h +++ b/lib/subghz/blocks/generic.h @@ -25,8 +25,6 @@ struct SubGhzBlockGeneric { uint32_t cnt; uint8_t cnt_2; uint32_t seed; - bool prg_mode : 1; - bool allow_zero_seed : 1; }; /** diff --git a/lib/subghz/protocols/faac_slh.c b/lib/subghz/protocols/faac_slh.c index 14e3b1789..702dcb537 100644 --- a/lib/subghz/protocols/faac_slh.c +++ b/lib/subghz/protocols/faac_slh.c @@ -8,6 +8,8 @@ #include "../blocks/generic.h" #include "../blocks/math.h" +#include "../blocks/custom_btn_i.h" + #define TAG "SubGhzProtocolFaacSLH" static const SubGhzBlockConst subghz_protocol_faac_slh_const = { @@ -17,6 +19,18 @@ static const SubGhzBlockConst subghz_protocol_faac_slh_const = { .min_count_bit_for_found = 64, }; +static uint32_t temp_fix_backup = 0; +static uint32_t temp_counter_backup = 0; +static bool faac_prog_mode = false; +static bool allow_zero_seed = false; + +void faac_slh_reset_prog_mode() { + temp_fix_backup = 0; + temp_counter_backup = 0; + faac_prog_mode = false; + allow_zero_seed = false; +} + struct SubGhzProtocolDecoderFaacSLH { SubGhzProtocolDecoderBase base; @@ -110,18 +124,35 @@ void subghz_protocol_encoder_faac_slh_free(void* context) { } static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* instance) { - if(instance->generic.allow_zero_seed || (instance->generic.seed != 0x0)) { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); - FURI_LOG_I(TAG, "Counter ++"); - } else if(instance->generic.prg_mode == true) { + // TODO: Stupid bypass for custom button, remake later + if(subghz_custom_btn_get_original() == 0) { + subghz_custom_btn_set_original(0xF); + } + + uint8_t custom_btn_id = subghz_custom_btn_get(); + bool button_for_programming = false; + + // If custom button left is pressed, enable programming mode and disable it on Ok button + if((custom_btn_id == SUBGHZ_CUSTOM_BTN_OK)) { + button_for_programming = false; + } else if(custom_btn_id == SUBGHZ_CUSTOM_BTN_UP) { + button_for_programming = true; + } + // If we are using UP button - generate programming mode key and send it, otherwise - send regular key if possible + if(button_for_programming) { uint8_t data_tmp = 0; uint8_t data_prg[8]; - instance->generic.cnt_2++; - data_prg[0] = 0x00; - data_prg[1] = instance->generic.cnt_2; + if(allow_zero_seed || (instance->generic.seed != 0x0)) { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + if(temp_counter_backup != 0x0) { + temp_counter_backup += furi_hal_subghz_get_rolling_counter_mult(); + } + } + + data_prg[1] = instance->generic.cnt & 0xFF; data_prg[2] = (uint8_t)(instance->generic.seed & 0xFF); data_prg[3] = (uint8_t)(instance->generic.seed >> 8 & 0xFF); @@ -133,27 +164,42 @@ static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* inst data_prg[4] ^= data_prg[1]; data_prg[5] ^= data_prg[1]; - for(uint8_t i=data_prg[1] & 0x0F ; i!=0; i--) { - data_tmp = data_prg[5]; + for(uint8_t i = data_prg[1] & 0x0F; i != 0; i--) { + data_tmp = data_prg[5]; - data_prg[5] = ((data_prg[5] << 1) & 0xFF) | (data_prg[4] & 0x80) >> 7; - data_prg[4] = ((data_prg[4] << 1) & 0xFF) | (data_prg[3] & 0x80) >> 7; - data_prg[3] = ((data_prg[3] << 1) & 0xFF) | (data_prg[2] & 0x80) >> 7; - data_prg[2] = ((data_prg[2] << 1) & 0xFF) | (data_tmp & 0x80) >> 7; - } + data_prg[5] = ((data_prg[5] << 1) & 0xFF) | (data_prg[4] & 0x80) >> 7; + data_prg[4] = ((data_prg[4] << 1) & 0xFF) | (data_prg[3] & 0x80) >> 7; + data_prg[3] = ((data_prg[3] << 1) & 0xFF) | (data_prg[2] & 0x80) >> 7; + data_prg[2] = ((data_prg[2] << 1) & 0xFF) | (data_tmp & 0x80) >> 7; + } data_prg[6] = 0x0F; data_prg[7] = 0x52; - uint32_t enc_prg_1 = data_prg[7] << 24 | data_prg[6] << 16 | data_prg[5] << 8 | data_prg[4]; - uint32_t enc_prg_2 = data_prg[3] << 24 | data_prg[2] << 16 | data_prg[1] << 8 | data_prg[0]; + uint32_t enc_prg_1 = data_prg[7] << 24 | data_prg[6] << 16 | data_prg[5] << 8 | + data_prg[4]; + uint32_t enc_prg_2 = data_prg[3] << 24 | data_prg[2] << 16 | data_prg[1] << 8 | + data_prg[0]; instance->generic.data = (uint64_t)enc_prg_1 << 32 | enc_prg_2; - FURI_LOG_I(TAG, "New MasterKey encrypted : %016llX", instance->generic.data); + //FURI_LOG_D(TAG, "New Prog Mode Key Generated: %016llX\r", instance->generic.data); return true; } else { - // Do not generate new data, send data from buffer - FURI_LOG_I(TAG, "Unknown / Static mode"); - return true; + if(!allow_zero_seed && (instance->generic.seed == 0x0)) { + // Do not generate new data, send data from buffer + return true; + } + // If we are in prog mode and regular Send button is used - Do not generate new data, send data from buffer + if((faac_prog_mode == true) && (instance->generic.serial == 0x0) && + (instance->generic.btn == 0x0) && (temp_fix_backup == 0x0)) { + return true; + } + } + // Restore main remote data when we exit programming mode + if((instance->generic.serial == 0x0) && (instance->generic.btn == 0x0) && + (temp_fix_backup != 0x0) && !faac_prog_mode) { + instance->generic.serial = temp_fix_backup >> 4; + instance->generic.btn = temp_fix_backup & 0xF; + instance->generic.cnt = temp_counter_backup; } uint32_t fix = instance->generic.serial << 4 | instance->generic.btn; uint32_t hop = 0; @@ -165,6 +211,11 @@ static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* inst for(int i = 0; i < 8; i++) { fixx[i] = (fix >> (shiftby -= 4)) & 0xF; } + + if(allow_zero_seed || (instance->generic.seed != 0x0)) { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + } + if((instance->generic.cnt % 2) == 0) { decrypt = fixx[6] << 28 | fixx[7] << 24 | fixx[5] << 20 | (instance->generic.cnt & 0xFFFFF); @@ -211,7 +262,7 @@ bool subghz_protocol_faac_slh_create_data( instance->generic.seed = seed; instance->manufacture_name = manufacture_name; instance->generic.data_count_bit = 64; - instance->generic.allow_zero_seed = true; + allow_zero_seed = true; bool res = subghz_protocol_faac_slh_gen_data(instance); if(res) { return SubGhzProtocolStatusOk == @@ -282,13 +333,11 @@ SubGhzProtocolStatus FURI_LOG_E(TAG, "Missing Seed"); break; } - bool allow_zero_seed; - if(flipper_format_read_bool(flipper_format, "AllowZeroSeed", &allow_zero_seed, 1)) { - instance->generic.allow_zero_seed = true; - FURI_LOG_I(TAG, "Enc. des. TRUE"); + bool tmp_allow_zero_seed; + if(flipper_format_read_bool(flipper_format, "AllowZeroSeed", &tmp_allow_zero_seed, 1)) { + allow_zero_seed = true; } else { - instance->generic.allow_zero_seed = false; - FURI_LOG_I(TAG, "Enc. des. FALSE"); + allow_zero_seed = false; } instance->generic.seed = seed_data[0] << 24 | seed_data[1] << 16 | seed_data[2] << 8 | @@ -452,11 +501,16 @@ static void subghz_protocol_faac_slh_check_remote_controller( const char** manufacture_name) { uint32_t code_fix = instance->data >> 32; uint32_t code_hop = instance->data & 0xFFFFFFFF; - instance->serial = code_fix >> 4; - instance->btn = code_fix & 0xF; uint32_t decrypt = 0; uint64_t man; + // TODO: Stupid bypass for custom button, remake later + if(subghz_custom_btn_get_original() == 0) { + subghz_custom_btn_set_original(0xF); + } + + subghz_custom_btn_set_max(1); + uint8_t data_tmp = 0; uint8_t data_prg[8]; data_prg[0] = (code_hop & 0xFF); @@ -468,36 +522,40 @@ static void subghz_protocol_faac_slh_check_remote_controller( data_prg[6] = ((code_fix >> 16) & 0xFF); data_prg[7] = (code_fix >> 24); - if( (data_prg[7] == 0x52) && (data_prg[6] == 0x0F) && (data_prg[0] == 0x00) ) { - instance->prg_mode = true; + if(((data_prg[7] == 0x52) && (data_prg[6] == 0x0F) && (data_prg[0] == 0x00))) { + faac_prog_mode = true; // ProgMode ON - FURI_LOG_I(TAG, "Master Key detected!"); - for(uint8_t i = data_prg[1] & 0xF; i != 0; i--) { + data_tmp = data_prg[2]; - data_tmp = data_prg[2]; - - data_prg[2] = data_prg[2] >> 1 | (data_prg[3] & 1) << 7; - data_prg[3] = data_prg[3] >> 1 | (data_prg[4] & 1) << 7; - data_prg[4] = data_prg[4] >> 1 | (data_prg[5] & 1) << 7; - data_prg[5] = data_prg[5] >> 1 | (data_tmp & 1) << 7; - - } - data_prg[2] ^= data_prg[1]; - data_prg[3] ^= data_prg[1]; - data_prg[4] ^= data_prg[1]; - data_prg[5] ^= data_prg[1]; - FURI_LOG_I(TAG, "Got SEED value!"); - instance->seed = data_prg[5] << 24 | data_prg[4] << 16 | data_prg[3] << 8 | data_prg[2]; - FURI_LOG_I(TAG, "SEED = %08lX", instance->seed); - uint32_t dec_prg_1 = data_prg[7] << 24 | data_prg[6] << 16 | data_prg[5] << 8 | data_prg[4]; - uint32_t dec_prg_2 = data_prg[3] << 24 | data_prg[2] << 16 | data_prg[1] << 8 | data_prg[0]; - instance->data_2 = (uint64_t)dec_prg_1 << 32 | dec_prg_2; - FURI_LOG_I(TAG, "MasterKey decrypted : %016llX", instance->data_2); - instance->cnt_2 = data_prg[1]; - } else { - instance->prg_mode = false; + data_prg[2] = data_prg[2] >> 1 | (data_prg[3] & 1) << 7; + data_prg[3] = data_prg[3] >> 1 | (data_prg[4] & 1) << 7; + data_prg[4] = data_prg[4] >> 1 | (data_prg[5] & 1) << 7; + data_prg[5] = data_prg[5] >> 1 | (data_tmp & 1) << 7; } + data_prg[2] ^= data_prg[1]; + data_prg[3] ^= data_prg[1]; + data_prg[4] ^= data_prg[1]; + data_prg[5] ^= data_prg[1]; + instance->seed = data_prg[5] << 24 | data_prg[4] << 16 | data_prg[3] << 8 | data_prg[2]; + uint32_t dec_prg_1 = data_prg[7] << 24 | data_prg[6] << 16 | data_prg[5] << 8 | + data_prg[4]; + uint32_t dec_prg_2 = data_prg[3] << 24 | data_prg[2] << 16 | data_prg[1] << 8 | + data_prg[0]; + instance->data_2 = (uint64_t)dec_prg_1 << 32 | dec_prg_2; + instance->cnt = data_prg[1]; + + *manufacture_name = "FAAC_SLH"; + return; + } else { + if(code_fix != 0x0) { + temp_fix_backup = code_fix; + instance->serial = code_fix >> 4; + instance->btn = code_fix & 0xF; + } + + faac_prog_mode = false; + } for M_EACH(manufacture_code, *subghz_keystore_get_data(keystore), SubGhzKeyArray_t) { @@ -512,6 +570,10 @@ static void subghz_protocol_faac_slh_check_remote_controller( } } instance->cnt = decrypt & 0xFFFFF; + // Backup counter in case when we need to use programming mode + if(code_fix != 0x0) { + temp_counter_backup = instance->cnt; + } } uint8_t subghz_protocol_decoder_faac_slh_get_hash_data(void* context) { @@ -530,6 +592,7 @@ SubGhzProtocolStatus subghz_protocol_decoder_faac_slh_serialize( // Reset seed leftover from previous decoded signal instance->generic.seed = 0x0; + temp_fix_backup = 0x0; SubGhzProtocolStatus res = subghz_block_generic_serialize(&instance->generic, flipper_format, preset); @@ -577,13 +640,11 @@ SubGhzProtocolStatus FURI_LOG_E(TAG, "Missing Seed"); break; } - bool allow_zero_seed; - if(flipper_format_read_bool(flipper_format, "AllowZeroSeed", &allow_zero_seed, 1)) { - instance->generic.allow_zero_seed = true; - FURI_LOG_I(TAG, "Dec. des. TRUE"); + bool tmp_allow_zero_seed; + if(flipper_format_read_bool(flipper_format, "AllowZeroSeed", &tmp_allow_zero_seed, 1)) { + allow_zero_seed = true; } else { - instance->generic.allow_zero_seed = false; - FURI_LOG_I(TAG, "Dec. des. FALSE"); + allow_zero_seed = false; } instance->generic.seed = seed_data[0] << 24 | seed_data[1] << 16 | seed_data[2] << 8 | seed_data[3]; @@ -606,10 +667,11 @@ void subghz_protocol_decoder_faac_slh_get_string(void* context, FuriString* outp uint32_t code_fix = instance->generic.data >> 32; uint32_t code_hop = instance->generic.data & 0xFFFFFFFF; - if(instance->generic.prg_mode == true) { + if(faac_prog_mode == true) { furi_string_cat_printf( output, "%s %dbit\r\n" + "Master Remote Prog Mode\r\n" "Ke:%lX%08lX\r\n" "Kd:%lX%08lX\r\n" "Seed:%08lX mCnt:%02X", @@ -620,8 +682,8 @@ void subghz_protocol_decoder_faac_slh_get_string(void* context, FuriString* outp (uint32_t)(instance->generic.data_2 >> 32), (uint32_t)instance->generic.data_2, instance->generic.seed, - instance->generic.cnt_2); - } else if(instance->generic.allow_zero_seed == false) { + (uint8_t)(instance->generic.cnt & 0xFF)); + } else if(allow_zero_seed == false) { furi_string_cat_printf( output, "%s %dbit\r\n" diff --git a/lib/subghz/protocols/faac_slh.h b/lib/subghz/protocols/faac_slh.h index bab042ca6..8d03d7907 100644 --- a/lib/subghz/protocols/faac_slh.h +++ b/lib/subghz/protocols/faac_slh.h @@ -129,3 +129,7 @@ SubGhzProtocolStatus * @param output Resulting text */ void subghz_protocol_decoder_faac_slh_get_string(void* context, FuriString* output); + +// Reset prog mode vars +// TODO: Remake in proper way +void faac_slh_reset_prog_mode(); \ No newline at end of file From ffc6f726f00992397dc2417952f44c5ef417a2e6 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Tue, 5 Sep 2023 05:43:06 +0300 Subject: [PATCH 19/20] fix small bug --- lib/subghz/protocols/faac_slh.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/subghz/protocols/faac_slh.c b/lib/subghz/protocols/faac_slh.c index 702dcb537..be52983c4 100644 --- a/lib/subghz/protocols/faac_slh.c +++ b/lib/subghz/protocols/faac_slh.c @@ -139,7 +139,7 @@ static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* inst button_for_programming = true; } // If we are using UP button - generate programming mode key and send it, otherwise - send regular key if possible - if(button_for_programming) { + if(button_for_programming && !(!allow_zero_seed && (instance->generic.seed == 0x0))) { uint8_t data_tmp = 0; uint8_t data_prg[8]; From b24fba6ad702214ef98907486127e59ab60c28ca Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Tue, 5 Sep 2023 05:44:09 +0300 Subject: [PATCH 20/20] just in case --- .../main/subghz/helpers/subghz_txrx_create_protocol_key.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/applications/main/subghz/helpers/subghz_txrx_create_protocol_key.c b/applications/main/subghz/helpers/subghz_txrx_create_protocol_key.c index 149d1d711..040aff46c 100644 --- a/applications/main/subghz/helpers/subghz_txrx_create_protocol_key.c +++ b/applications/main/subghz/helpers/subghz_txrx_create_protocol_key.c @@ -228,9 +228,9 @@ bool subghz_txrx_gen_faac_slh_protocol( seed_data[sizeof(uint32_t) - i - 1] = (seed >> i * 8) & 0xFF; } - bool allow_zero_seed = true; + bool tmp_allow_zero_seed = true; flipper_format_write_hex(txrx->fff_data, "Seed", seed_data, sizeof(uint32_t)); - flipper_format_write_bool(txrx->fff_data, "AllowZeroSeed", &allow_zero_seed, 1); + flipper_format_write_bool(txrx->fff_data, "AllowZeroSeed", &tmp_allow_zero_seed, 1); } subghz_transmitter_free(txrx->transmitter);