diff --git a/applications/plugins/subbrute/helpers/subbrute_worker.c b/applications/plugins/subbrute/helpers/subbrute_worker.c index 1f84ac932..4a9ad17da 100644 --- a/applications/plugins/subbrute/helpers/subbrute_worker.c +++ b/applications/plugins/subbrute/helpers/subbrute_worker.c @@ -123,7 +123,8 @@ bool subbrute_worker_init_file_attack( uint64_t step, uint8_t load_index, const char* file_key, - SubBruteProtocol* protocol) { + SubBruteProtocol* protocol, + uint8_t extra_repeats) { furi_assert(instance); if(instance->worker_running) { @@ -139,7 +140,7 @@ bool subbrute_worker_init_file_attack( instance->bits = protocol->bits; instance->te = protocol->te; instance->load_index = load_index; - instance->repeat = protocol->repeat; + instance->repeat = protocol->repeat + extra_repeats; instance->file_key = file_key; instance->max_value = subbrute_protocol_calc_max_value(instance->attack, instance->bits); diff --git a/applications/plugins/subbrute/helpers/subbrute_worker.h b/applications/plugins/subbrute/helpers/subbrute_worker.h index a3a4930a8..31c5eab16 100644 --- a/applications/plugins/subbrute/helpers/subbrute_worker.h +++ b/applications/plugins/subbrute/helpers/subbrute_worker.h @@ -29,7 +29,8 @@ bool subbrute_worker_init_file_attack( uint64_t step, uint8_t load_index, const char* file_key, - SubBruteProtocol* protocol); + SubBruteProtocol* protocol, + uint8_t extra_repeats); bool subbrute_worker_start(SubBruteWorker* instance); void subbrute_worker_stop(SubBruteWorker* instance); bool subbrute_worker_transmit_current_key(SubBruteWorker* instance, uint64_t step); diff --git a/applications/plugins/subbrute/scenes/subbrute_scene_load_file.c b/applications/plugins/subbrute/scenes/subbrute_scene_load_file.c index b11ebc2f8..3ddcecf90 100644 --- a/applications/plugins/subbrute/scenes/subbrute_scene_load_file.c +++ b/applications/plugins/subbrute/scenes/subbrute_scene_load_file.c @@ -37,14 +37,18 @@ void subbrute_scene_load_file_on_enter(void* context) { load_result = subbrute_device_load_from_file(instance->device, furi_string_get_cstr(load_path)); if(load_result == SubBruteFileResultOk) { - load_result = subbrute_device_attack_set(instance->device, SubBruteAttackLoadFile, 0); + uint8_t extra_repeats = subbrute_main_view_get_extra_repeats(instance->view_main); + + load_result = subbrute_device_attack_set( + instance->device, SubBruteAttackLoadFile, extra_repeats); if(load_result == SubBruteFileResultOk) { if(!subbrute_worker_init_file_attack( instance->worker, instance->device->key_index, instance->device->load_index, instance->device->file_key, - instance->device->file_protocol_info)) { + instance->device->file_protocol_info, + extra_repeats)) { furi_crash("Invalid attack set!"); } // Ready to run! diff --git a/applications/plugins/subbrute/scenes/subbrute_scene_load_select.c b/applications/plugins/subbrute/scenes/subbrute_scene_load_select.c index 77db3f64b..0ec9fbc91 100644 --- a/applications/plugins/subbrute/scenes/subbrute_scene_load_select.c +++ b/applications/plugins/subbrute/scenes/subbrute_scene_load_select.c @@ -39,12 +39,15 @@ bool subbrute_scene_load_select_on_event(void* context, SceneManagerEvent event) if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubBruteCustomEventTypeIndexSelected) { instance->device->load_index = subbrute_main_view_get_index(instance->view_main); + uint8_t extra_repeats = subbrute_main_view_get_extra_repeats(instance->view_main); + if(!subbrute_worker_init_file_attack( instance->worker, instance->device->key_index, instance->device->load_index, instance->device->file_key, - instance->device->file_protocol_info)) { + instance->device->file_protocol_info, + extra_repeats)) { furi_crash("Invalid attack set!"); } scene_manager_next_scene(instance->scene_manager, SubBruteSceneSetupAttack); diff --git a/applications/plugins/subbrute/scenes/subbrute_scene_start.c b/applications/plugins/subbrute/scenes/subbrute_scene_start.c index fb01a3339..9ac29d37f 100644 --- a/applications/plugins/subbrute/scenes/subbrute_scene_start.c +++ b/applications/plugins/subbrute/scenes/subbrute_scene_start.c @@ -52,21 +52,23 @@ bool subbrute_scene_start_on_event(void* context, SceneManagerEvent event) { SubBruteAttacks attack = subbrute_main_view_get_index(instance->view_main); uint8_t extra_repeats = subbrute_main_view_get_extra_repeats(instance->view_main); - if(subbrute_device_attack_set(instance->device, attack, extra_repeats) != - SubBruteFileResultOk || - !subbrute_worker_init_default_attack( + if((subbrute_device_attack_set(instance->device, attack, extra_repeats) != + SubBruteFileResultOk) || + (!subbrute_worker_init_default_attack( instance->worker, attack, instance->device->key_index, instance->device->protocol_info, - instance->device->extra_repeats)) { + instance->device->extra_repeats))) { furi_crash("Invalid attack set!"); } scene_manager_next_scene(instance->scene_manager, SubBruteSceneSetupAttack); consumed = true; } else if(event.event == SubBruteCustomEventTypeLoadFile) { - instance->device->extra_repeats = 0; + //uint8_t extra_repeats = subbrute_main_view_get_extra_repeats(instance->view_main); + + //instance->device->extra_repeats = extra_repeats; scene_manager_next_scene(instance->scene_manager, SubBruteSceneLoadFile); consumed = true; } diff --git a/applications/plugins/subbrute/subbrute_device.c b/applications/plugins/subbrute/subbrute_device.c index 2847bc458..8cc98b9d9 100644 --- a/applications/plugins/subbrute/subbrute_device.c +++ b/applications/plugins/subbrute/subbrute_device.c @@ -146,9 +146,10 @@ SubBruteFileResult subbrute_device_attack_set( if(type != SubBruteAttackLoadFile) { subbrute_device_free_protocol_info(instance); instance->protocol_info = subbrute_protocol(type); - instance->extra_repeats = extra_repeats; } + instance->extra_repeats = extra_repeats; + // For non-file types we didn't set SubGhzProtocolDecoderBase instance->receiver = subghz_receiver_alloc_init(instance->environment); subghz_receiver_set_filter(instance->receiver, SubGhzProtocolFlag_Decodable); @@ -290,11 +291,12 @@ uint8_t subbrute_device_load_from_file(SubBruteDevice* instance, const char* fil #endif } - instance->decoder_result = - subghz_receiver_search_decoder_base_by_name(instance->receiver, protocol_file); + instance->decoder_result = subghz_receiver_search_decoder_base_by_name( + instance->receiver, furi_string_get_cstr(temp_str)); - if(!instance->decoder_result || strcmp(protocol_file, "RAW") == 0) { - FURI_LOG_E(TAG, "RAW unsupported"); + if((!instance->decoder_result) || (strcmp(protocol_file, "RAW") == 0) || + (strcmp(protocol_file, "Unknown") == 0)) { + FURI_LOG_E(TAG, "Protocol unsupported"); result = SubBruteFileResultProtocolNotSupported; break; } @@ -429,7 +431,7 @@ const char* subbrute_device_error_get_desc(SubBruteFileResult error_id) { result = "Missing Protocol"; break; case(SubBruteFileResultProtocolNotSupported): - result = "RAW unsupported"; + result = "Protocol unsupported"; break; case(SubBruteFileResultDynamicProtocolNotValid): result = "Dynamic protocol unsupported"; diff --git a/applications/plugins/subbrute/subbrute_protocols.c b/applications/plugins/subbrute/subbrute_protocols.c index d75ff77e0..461241310 100644 --- a/applications/plugins/subbrute/subbrute_protocols.c +++ b/applications/plugins/subbrute/subbrute_protocols.c @@ -205,7 +205,7 @@ const SubBruteProtocol subbrute_protocol_linear_10bit_310 = { * BF existing dump */ const SubBruteProtocol subbrute_protocol_load_file = - {0, 0, 0, 3, FuriHalSubGhzPresetOok650Async, RAWFileProtocol}; + {0, 0, 0, 3, FuriHalSubGhzPresetOok650Async, UnknownFileProtocol}; static const char* subbrute_protocol_names[] = { [SubBruteAttackCAME12bit303] = "CAME 12bit 303MHz", @@ -267,7 +267,14 @@ static const char* subbrute_protocol_file_types[] = { [ChamberlainFileProtocol] = "Cham_Code", [LinearFileProtocol] = "Linear", [PrincetonFileProtocol] = "Princeton", - [RAWFileProtocol] = "RAW"}; + [RAWFileProtocol] = "RAW", + [BETTFileProtocol] = "BETT", + [ClemsaFileProtocol] = "Clemsa", + [DoitrandFileProtocol] = "Doitrand", + [GateTXFileProtocol] = "GateTX", + [MagellanFileProtocol] = "Magellan", + [IntertechnoV3FileProtocol] = "Intertechno_V3", + [UnknownFileProtocol] = "Unknown"}; /** * Values to not use less memory for packet parse operations @@ -316,7 +323,7 @@ SubBruteFileProtocol subbrute_protocol_file_protocol_name(FuriString* name) { } } - return RAWFileProtocol; + return UnknownFileProtocol; } void subbrute_protocol_default_payload( diff --git a/applications/plugins/subbrute/subbrute_protocols.h b/applications/plugins/subbrute/subbrute_protocols.h index ead03dad7..eeb3f3426 100644 --- a/applications/plugins/subbrute/subbrute_protocols.h +++ b/applications/plugins/subbrute/subbrute_protocols.h @@ -12,6 +12,13 @@ typedef enum { LinearFileProtocol, PrincetonFileProtocol, RAWFileProtocol, + BETTFileProtocol, + ClemsaFileProtocol, + DoitrandFileProtocol, + GateTXFileProtocol, + MagellanFileProtocol, + IntertechnoV3FileProtocol, + UnknownFileProtocol, TotalFileProtocol, } SubBruteFileProtocol; diff --git a/applications/plugins/subbrute/views/subbrute_main_view.c b/applications/plugins/subbrute/views/subbrute_main_view.c index cb59c94b3..287a33f2b 100644 --- a/applications/plugins/subbrute/views/subbrute_main_view.c +++ b/applications/plugins/subbrute/views/subbrute_main_view.c @@ -200,7 +200,6 @@ bool subbrute_main_view_input(InputEvent* event, void* context) { const uint8_t min_value = 0; const uint8_t correct_total = SubBruteAttackTotalCount - 1; uint8_t max_repeats = 9 - subbrute_protocol_repeats_count(instance->index); - uint8_t index = 0; bool updated = false; bool consumed = false; @@ -227,14 +226,16 @@ bool subbrute_main_view_input(InputEvent* event, void* context) { consumed = true; } else if(event->key == InputKeyLeft && is_short) { instance->extra_repeats = CLAMP(instance->extra_repeats - 1, max_repeats, 0); + updated = true; consumed = true; } else if(event->key == InputKeyRight && is_short) { instance->extra_repeats = CLAMP(instance->extra_repeats + 1, max_repeats, 0); + updated = true; consumed = true; } else if(event->key == InputKeyOk && is_short) { - if(index == SubBruteAttackLoadFile) { + if(instance->index == SubBruteAttackLoadFile) { instance->callback(SubBruteCustomEventTypeLoadFile, instance->context); } else { instance->callback(SubBruteCustomEventTypeMenuSelected, instance->context); @@ -293,16 +294,6 @@ bool subbrute_main_view_input(InputEvent* event, void* context) { void subbrute_main_view_enter(void* context) { furi_assert(context); - SubBruteMainView* instance = context; - - with_view_model( - instance->view, - SubBruteMainViewModel * model, - { - model->key_field = NULL; - model->is_select_byte = false; - }, - true); #ifdef FURI_DEBUG FURI_LOG_D(TAG, "subbrute_main_view_enter"); @@ -368,7 +359,7 @@ void subbrute_main_view_set_index( furi_assert(instance); furi_assert(idx < SubBruteAttackTotalCount); #ifdef FURI_DEBUG - FURI_LOG_I(TAG, "Set index: %d", idx); + FURI_LOG_I(TAG, "Set index: %d, IS_SELECT_BYTE: %d", idx, is_select_byte); #endif instance->is_select_byte = is_select_byte; instance->key_field = key_field;