DerSkythe 3 лет назад
Родитель
Сommit
aff5203fc2

+ 0 - 2
applications/plugins/subbrute/scenes/subbrute_scene_run_attack.c

@@ -1,7 +1,5 @@
 #include "../subbrute_i.h"
 #include "subbrute_scene.h"
-#include "../subbrute_custom_event.h"
-#include "../views/subbrute_attack_view.h"
 
 #define TAG "SubBruteSceneRunAttack"
 

+ 0 - 1
applications/plugins/subbrute/scenes/subbrute_scene_save_name.c

@@ -1,6 +1,5 @@
 #include "../subbrute_i.h"
 #include "subbrute_scene.h"
-#include <core/string.h>
 #include <lib/toolbox/random_name.h>
 
 #define TAG "SubBruteSceneSaveFile"

+ 1 - 62
applications/plugins/subbrute/subbrute.c

@@ -40,7 +40,7 @@ SubBruteState* subbrute_alloc() {
     view_dispatcher_set_navigation_event_callback(
         instance->view_dispatcher, subbrute_back_event_callback);
     view_dispatcher_set_tick_event_callback(
-        instance->view_dispatcher, subbrute_tick_event_callback, 10);
+        instance->view_dispatcher, subbrute_tick_event_callback, 100);
 
     //Dialog
     instance->dialogs = furi_record_open(RECORD_DIALOGS);
@@ -87,8 +87,6 @@ SubBruteState* subbrute_alloc() {
         SubBruteViewAttack,
         subbrute_attack_view_get_view(instance->view_attack));
 
-    // Loading
-    instance->loading = loading_alloc();
     //instance->flipper_format = flipper_format_string_alloc();
     //instance->environment = subghz_environment_alloc();
 
@@ -99,91 +97,49 @@ void subbrute_free(SubBruteState* instance) {
     furi_assert(instance);
 
     // SubBruteDevice
-#ifdef FURI_DEBUG
-    FURI_LOG_D(TAG, "free SubBruteDevice");
-#endif
     subbrute_worker_stop(instance->device);
     subbrute_device_free(instance->device);
 
     // Notifications
-#ifdef FURI_DEBUG
-    FURI_LOG_D(TAG, "free Notifications");
-#endif
     notification_message(instance->notifications, &sequence_blink_stop);
     furi_record_close(RECORD_NOTIFICATION);
     instance->notifications = NULL;
 
-    // Loading
-#ifdef FURI_DEBUG
-    FURI_LOG_D(TAG, "free loading");
-#endif
-    loading_free(instance->loading);
-
     // View Main
-#ifdef FURI_DEBUG
-    FURI_LOG_D(TAG, "free SubBruteViewMain");
-#endif
     view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewMain);
     subbrute_main_view_free(instance->view_main);
 
     // View Attack
-#ifdef FURI_DEBUG
-    FURI_LOG_D(TAG, "free SubBruteViewAttack");
-#endif
     view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewAttack);
     subbrute_attack_view_free(instance->view_attack);
 
     // TextInput
-#ifdef FURI_DEBUG
-    FURI_LOG_D(TAG, "free SubBruteViewTextInput");
-#endif
     view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewTextInput);
     text_input_free(instance->text_input);
 
     // Custom Widget
-#ifdef FURI_DEBUG
-    FURI_LOG_D(TAG, "free SubBruteViewWidget");
-#endif
     view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewWidget);
     widget_free(instance->widget);
 
     // Popup
-#ifdef FURI_DEBUG
-    FURI_LOG_D(TAG, "free SubBruteViewPopup");
-#endif
     view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewPopup);
     popup_free(instance->popup);
 
     // ViewStack
-#ifdef FURI_DEBUG
-    FURI_LOG_D(TAG, "free SubBruteViewStack");
-#endif
     view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewStack);
     view_stack_free(instance->view_stack);
 
     //Dialog
-#ifdef FURI_DEBUG
-    FURI_LOG_D(TAG, "free RECORD_DIALOGS");
-#endif
     furi_record_close(RECORD_DIALOGS);
     instance->dialogs = NULL;
 
     // Scene manager
-#ifdef FURI_DEBUG
-    FURI_LOG_D(TAG, "free scene_manager");
-#endif
     scene_manager_free(instance->scene_manager);
 
     // View Dispatcher
-#ifdef FURI_DEBUG
-    FURI_LOG_D(TAG, "free view_dispatcher");
-#endif
     view_dispatcher_free(instance->view_dispatcher);
 
     // GUI
-#ifdef FURI_DEBUG
-    FURI_LOG_D(TAG, "free RECORD_GUI");
-#endif
     furi_record_close(RECORD_GUI);
     instance->gui = NULL;
 
@@ -193,23 +149,6 @@ void subbrute_free(SubBruteState* instance) {
     free(instance);
 }
 
-void subbrute_show_loading_popup(void* context, bool show) {
-    TaskHandle_t timer_task = xTaskGetHandle(configTIMER_SERVICE_TASK_NAME);
-    SubBruteState* instance = context;
-    ViewStack* view_stack = instance->view_stack;
-    Loading* loading = instance->loading;
-
-    if(show) {
-        // Raise timer priority so that animations can play
-        vTaskPrioritySet(timer_task, configMAX_PRIORITIES - 1);
-        view_stack_add_view(view_stack, loading_get_view(loading));
-    } else {
-        view_stack_remove_view(view_stack, loading_get_view(loading));
-        // Restore default timer priority
-        vTaskPrioritySet(timer_task, configTIMER_TASK_PRIORITY);
-    }
-}
-
 void subbrute_text_input_callback(void* context) {
     furi_assert(context);
     SubBruteState* instance = context;

+ 0 - 3
applications/plugins/subbrute/subbrute_custom_event.h

@@ -1,8 +1,5 @@
 #pragma once
 
-#include <stdint.h>
-#include <stddef.h>
-
 typedef enum {
     // Reserve first 100 events for button types and indexes, starting from 0
     SubBruteCustomEventTypeReserved = 100,

+ 128 - 68
applications/plugins/subbrute/subbrute_device.c

@@ -40,6 +40,7 @@ SubBruteDevice* subbrute_device_alloc() {
     instance->callback = NULL;
 
     instance->protocol_info = NULL;
+    instance->file_protocol_info = NULL;
     instance->decoder_result = NULL;
     instance->transmitter = NULL;
     instance->receiver = NULL;
@@ -150,7 +151,8 @@ bool subbrute_worker_start(SubBruteDevice* instance) {
         FURI_LOG_W(TAG, "Worker cannot start, invalid device state: %d", instance->state);
         return false;
     }
-    if(instance->protocol_info == NULL) {
+    if((instance->protocol_info == NULL && instance->attack != SubBruteAttackLoadFile) ||
+       (instance->attack == SubBruteAttackLoadFile && instance->file_protocol_info == NULL)) {
         FURI_LOG_W(TAG, "Worker cannot start, protocol_info is NULL!");
         return false;
     }
@@ -230,9 +232,13 @@ void subbrute_device_subghz_transmit(SubBruteDevice* instance, FlipperFormat* fl
         instance->environment, subbrute_protocol_name(instance->attack));
     subghz_transmitter_deserialize(instance->transmitter, flipper_format);
     furi_hal_subghz_reset();
-    furi_hal_subghz_load_preset(instance->protocol_info->preset);
-    furi_hal_subghz_set_frequency_and_path(instance->protocol_info->preset);
-
+    if(instance->attack == SubBruteAttackLoadFile) {
+        furi_hal_subghz_load_preset(instance->file_protocol_info->preset);
+        furi_hal_subghz_set_frequency_and_path(instance->file_protocol_info->preset);
+    } else {
+        furi_hal_subghz_load_preset(instance->protocol_info->preset);
+        furi_hal_subghz_set_frequency_and_path(instance->protocol_info->preset);
+    }
     furi_hal_subghz_start_async_tx(subghz_transmitter_yield, instance->transmitter);
 
     while(!furi_hal_subghz_is_async_tx_complete()) {
@@ -348,6 +354,9 @@ bool subbrute_device_create_packet_parsed(
 
     FuriString* candidate = furi_string_alloc();
 
+    Stream* stream = flipper_format_get_raw_stream(flipper_format);
+    stream_clean(stream);
+
     if(instance->attack == SubBruteAttackLoadFile) {
         if(step >= sizeof(instance->file_key)) {
             return false;
@@ -357,6 +366,42 @@ bool subbrute_device_create_packet_parsed(
         snprintf(subbrute_payload_byte, 4, "%02X ", (uint8_t)step);
         furi_string_replace_at(candidate, instance->load_index * 3, 3, subbrute_payload_byte);
         //snprintf(step_payload, sizeof(step_payload), "%02X", (uint8_t)instance->file_key[step]);
+
+        if(small) {
+            if(instance->file_protocol_info->te) {
+                stream_write_format(
+                    stream,
+                    subbrute_key_small_with_tail,
+                    instance->file_protocol_info->bits,
+                    furi_string_get_cstr(candidate),
+                    instance->file_protocol_info->te,
+                    instance->file_protocol_info->repeat);
+            } else {
+                stream_write_format(
+                    stream,
+                    subbrute_key_small_no_tail,
+                    instance->file_protocol_info->bits,
+                    furi_string_get_cstr(candidate),
+                    instance->file_protocol_info->repeat);
+            }
+        } else {
+            if(instance->file_protocol_info->te) {
+                stream_write_format(
+                    stream,
+                    subbrute_key_file_key_with_tail,
+                    instance->file_template,
+                    furi_string_get_cstr(candidate),
+                    instance->file_protocol_info->te,
+                    instance->file_protocol_info->repeat);
+            } else {
+                stream_write_format(
+                    stream,
+                    subbrute_key_file_key,
+                    instance->file_template,
+                    furi_string_get_cstr(candidate),
+                    instance->file_protocol_info->repeat);
+            }
+        }
     } else {
         //snprintf(step_payload, sizeof(step_payload), "%16X", step);
         //snprintf(step_payload, sizeof(step_payload), "%016llX", step);
@@ -375,53 +420,50 @@ bool subbrute_device_create_packet_parsed(
             }
         }
         furi_string_free(buffer);
-    }
 
 #ifdef FURI_DEBUG
-    FURI_LOG_D(TAG, "candidate: %s, step: %lld", furi_string_get_cstr(candidate), step);
+        FURI_LOG_D(TAG, "candidate: %s, step: %lld", furi_string_get_cstr(candidate), step);
 #endif
 
-    Stream* stream = flipper_format_get_raw_stream(flipper_format);
-    stream_clean(stream);
-
-    if(small) {
-        if(instance->protocol_info->te) {
-            stream_write_format(
-                stream,
-                subbrute_key_small_with_tail,
-                instance->protocol_info->bits,
-                furi_string_get_cstr(candidate),
-                instance->protocol_info->te,
-                instance->protocol_info->repeat);
-        } else {
-            stream_write_format(
-                stream,
-                subbrute_key_small_no_tail,
-                instance->protocol_info->bits,
-                furi_string_get_cstr(candidate),
-                instance->protocol_info->repeat);
-        }
-    } else {
-        if(instance->protocol_info->te) {
-            stream_write_format(
-                stream,
-                subbrute_key_file_key_with_tail,
-                instance->file_template,
-                furi_string_get_cstr(candidate),
-                instance->protocol_info->te,
-                instance->protocol_info->repeat);
+        if(small) {
+            if(instance->protocol_info->te) {
+                stream_write_format(
+                    stream,
+                    subbrute_key_small_with_tail,
+                    instance->protocol_info->bits,
+                    furi_string_get_cstr(candidate),
+                    instance->protocol_info->te,
+                    instance->protocol_info->repeat);
+            } else {
+                stream_write_format(
+                    stream,
+                    subbrute_key_small_no_tail,
+                    instance->protocol_info->bits,
+                    furi_string_get_cstr(candidate),
+                    instance->protocol_info->repeat);
+            }
         } else {
-            stream_write_format(
-                stream,
-                subbrute_key_file_key,
-                instance->file_template,
-                furi_string_get_cstr(candidate),
-                instance->protocol_info->repeat);
+            if(instance->protocol_info->te) {
+                stream_write_format(
+                    stream,
+                    subbrute_key_file_key_with_tail,
+                    instance->file_template,
+                    furi_string_get_cstr(candidate),
+                    instance->protocol_info->te,
+                    instance->protocol_info->repeat);
+            } else {
+                stream_write_format(
+                    stream,
+                    subbrute_key_file_key,
+                    instance->file_template,
+                    furi_string_get_cstr(candidate),
+                    instance->protocol_info->repeat);
+            }
         }
-    }
 #ifdef FURI_DEBUG
-    //FURI_LOG_D(TAG, "payload: %s", instance->payload);
+        //FURI_LOG_D(TAG, "payload: %s", instance->payload);
 #endif
+    }
 
     furi_string_free(candidate);
 
@@ -471,6 +513,17 @@ SubBruteFileResult subbrute_device_attack_set(SubBruteDevice* instance, SubBrute
     // Calc max value
     if(instance->attack == SubBruteAttackLoadFile) {
         instance->max_value = 0x3F;
+
+        // Now we are ready to set file template for using in the future with snprintf
+        // for sending attack payload ONLY for files!
+        snprintf(
+            instance->file_template,
+            sizeof(instance->file_template),
+            subbrute_key_file_start,
+            instance->file_protocol_info->frequency,
+            subbrute_protocol_preset(instance->file_protocol_info->preset),
+            subbrute_protocol_file(instance->file_protocol_info->file),
+            instance->file_protocol_info->bits);
     } else {
         FuriString* max_value_s;
         max_value_s = furi_string_alloc();
@@ -479,22 +532,22 @@ SubBruteFileResult subbrute_device_attack_set(SubBruteDevice* instance, SubBrute
         }
         instance->max_value = (uint64_t)strtol(furi_string_get_cstr(max_value_s), NULL, 2);
         furi_string_free(max_value_s);
-    }
 
-    // Now we are ready to set file template for using in the future with snprintf
-    // for sending attack payload
-    snprintf(
-        instance->file_template,
-        sizeof(instance->file_template),
-        subbrute_key_file_start,
-        instance->protocol_info->frequency,
-        subbrute_protocol_preset(instance->protocol_info->preset),
-        subbrute_protocol_file(instance->protocol_info->file),
-        instance->protocol_info->bits);
+        // Now we are ready to set file template for using in the future with snprintf
+        // for sending attack payload
+        snprintf(
+            instance->file_template,
+            sizeof(instance->file_template),
+            subbrute_key_file_start,
+            instance->protocol_info->frequency,
+            subbrute_protocol_preset(instance->protocol_info->preset),
+            subbrute_protocol_file(instance->protocol_info->file),
+            instance->protocol_info->bits);
 #ifdef FURI_DEBUG
-    FURI_LOG_D(
-        TAG, "tail: %d, file_template: %s", instance->protocol_info->te, instance->file_template);
+        FURI_LOG_D(
+            TAG, "tail: %d, file_template: %s", instance->protocol_info->te, instance->file_template);
 #endif
+    }
 
     // Init payload
     FlipperFormat* flipper_format = flipper_format_string_alloc();
@@ -517,6 +570,9 @@ uint8_t subbrute_device_load_from_file(SubBruteDevice* instance, const char* fil
     Storage* storage = furi_record_open(RECORD_STORAGE);
     FlipperFormat* fff_data_file = flipper_format_file_alloc(storage);
 
+    subbrute_device_free_protocol_info(instance);
+    instance->file_protocol_info = malloc(sizeof(SubBruteProtocol));
+
     FuriString* temp_str;
     temp_str = furi_string_alloc();
     uint32_t temp_data32;
@@ -539,8 +595,8 @@ uint8_t subbrute_device_load_from_file(SubBruteDevice* instance, const char* fil
 
         // Frequency
         if(flipper_format_read_uint32(fff_data_file, "Frequency", &temp_data32, 1)) {
-            instance->protocol_info->frequency = temp_data32;
-            if(!furi_hal_subghz_is_tx_allowed(instance->protocol_info->frequency)) {
+            instance->file_protocol_info->frequency = temp_data32;
+            if(!furi_hal_subghz_is_tx_allowed(instance->file_protocol_info->frequency)) {
                 result = SubBruteFileResultFrequencyNotAllowed;
                 break;
             }
@@ -555,7 +611,7 @@ uint8_t subbrute_device_load_from_file(SubBruteDevice* instance, const char* fil
             FURI_LOG_E(TAG, "Preset FAIL");
             result = SubBruteFileResultPresetInvalid;
         } else {
-            instance->protocol_info->preset = subbrute_protocol_convert_preset(temp_str);
+            instance->file_protocol_info->preset = subbrute_protocol_convert_preset(temp_str);
         }
 
         const char* protocol_file = NULL;
@@ -565,8 +621,8 @@ uint8_t subbrute_device_load_from_file(SubBruteDevice* instance, const char* fil
             result = SubBruteFileResultMissingProtocol;
             break;
         } else {
-            instance->protocol_info->file = subbrute_protocol_file_protocol_name(temp_str);
-            protocol_file = subbrute_protocol_file(instance->protocol_info->file);
+            instance->file_protocol_info->file = subbrute_protocol_file_protocol_name(temp_str);
+            protocol_file = subbrute_protocol_file(instance->file_protocol_info->file);
 #ifdef FURI_DEBUG
             FURI_LOG_D(TAG, "Protocol: %s", protocol_file);
 #endif
@@ -598,9 +654,9 @@ uint8_t subbrute_device_load_from_file(SubBruteDevice* instance, const char* fil
             result = SubBruteFileResultMissingOrIncorrectBit;
             break;
         } else {
-            instance->protocol_info->bits = temp_data32;
+            instance->file_protocol_info->bits = temp_data32;
 #ifdef FURI_DEBUG
-            FURI_LOG_D(TAG, "Bit: %d", instance->protocol_info->bits);
+            FURI_LOG_D(TAG, "Bit: %d", instance->file_protocol_info->bits);
 #endif
         }
 
@@ -626,7 +682,7 @@ uint8_t subbrute_device_load_from_file(SubBruteDevice* instance, const char* fil
             //result = SubBruteFileResultMissingOrIncorrectTe;
             //break;
         } else {
-            instance->protocol_info->te = temp_data32 != 0;
+            instance->file_protocol_info->te = temp_data32 != 0;
         }
 
         // Repeat
@@ -634,12 +690,12 @@ uint8_t subbrute_device_load_from_file(SubBruteDevice* instance, const char* fil
 #ifdef FURI_DEBUG
             FURI_LOG_D(TAG, "Repeat: %ld", temp_data32);
 #endif
-            instance->protocol_info->repeat = (uint8_t)temp_data32;
+            instance->file_protocol_info->repeat = (uint8_t)temp_data32;
         } else {
 #ifdef FURI_DEBUG
             FURI_LOG_D(TAG, "Repeat: 3 (default)");
 #endif
-            instance->protocol_info->repeat = 3;
+            instance->file_protocol_info->repeat = 3;
         }
 
         result = SubBruteFileResultOk;
@@ -659,6 +715,8 @@ uint8_t subbrute_device_load_from_file(SubBruteDevice* instance, const char* fil
 #ifdef FURI_DEBUG
         FURI_LOG_D(TAG, "Loaded successfully");
 #endif
+    } else {
+        subbrute_device_free_protocol_info(instance);
     }
 
     return result;
@@ -742,7 +800,9 @@ const char* subbrute_device_error_get_desc(SubBruteFileResult error_id) {
 
 void subbrute_device_free_protocol_info(SubBruteDevice* instance) {
     furi_assert(instance);
-
-    free(instance->protocol_info);
     instance->protocol_info = NULL;
+    if(instance->file_protocol_info) {
+        free(instance->file_protocol_info);
+    }
+    instance->file_protocol_info = NULL;
 }

+ 2 - 1
applications/plugins/subbrute/subbrute_device.h

@@ -41,7 +41,8 @@ typedef enum {
 typedef void (*SubBruteDeviceWorkerCallback)(void* context, SubBruteDeviceState state);
 typedef struct {
     SubBruteDeviceState state;
-    SubBruteProtocol* protocol_info;
+    const SubBruteProtocol* protocol_info;
+    SubBruteProtocol* file_protocol_info;
     volatile bool worker_running;
 
     // Current step

+ 0 - 1
applications/plugins/subbrute/subbrute_i.h

@@ -47,7 +47,6 @@ struct SubBruteState {
     Popup* popup;
     Widget* widget;
     DialogsApp* dialogs;
-    Loading* loading;
 
     // Text store
     char text_store[SUBBRUTE_MAX_LEN_NAME];

+ 167 - 59
applications/plugins/subbrute/subbrute_protocols.c

@@ -1,41 +1,155 @@
 #include "subbrute_protocols.h"
 
-static const SubBruteProtocol subbrute_protocols[SubBruteAttackTotalCount] = {
-    [SubBruteAttackCAME12bit303] =
-        {303875000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol},
-    [SubBruteAttackCAME12bit307] =
-        {307800000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol},
-    [SubBruteAttackCAME12bit433] =
-        {433920000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol},
-    [SubBruteAttackCAME12bit868] =
-        {868350000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol},
-    [SubBruteAttackNICE12bit433] =
-        {433920000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, NICEFileProtocol},
-    [SubBruteAttackNICE12bit868] =
-        {868350000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, NICEFileProtocol},
-    [SubBruteAttackChamberlain9bit300] =
-        {300000000, 9, 0, 3, FuriHalSubGhzPresetOok650Async, ChamberlainFileProtocol},
-    [SubBruteAttackChamberlain9bit315] =
-        {315000000, 9, 0, 3, FuriHalSubGhzPresetOok650Async, ChamberlainFileProtocol},
-    [SubBruteAttackChamberlain9bit390] =
-        {390000000, 9, 0, 3, FuriHalSubGhzPresetOok650Async, ChamberlainFileProtocol},
-    [SubBruteAttackLinear10bit300] =
-        {300000000, 10, 0, 5, FuriHalSubGhzPresetOok650Async, LinearFileProtocol},
-    [SubBruteAttackLinear10bit310] =
-        {300000000, 10, 0, 5, FuriHalSubGhzPresetOok650Async, LinearFileProtocol},
-    [SubBruteAttackLoadFile] = {0, 0, 0, 3, FuriHalSubGhzPresetOok650Async, RAWFileProtocol},
-};
-//static const uint32_t subbrute_protocols[SubBruteAttackTotalCount][TotalProtocolFields] = {
-//    [SubBruteAttackCAME12bit307] = {307800000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol},
-//    [SubBruteAttackCAME12bit433] = {433920000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol},
-//    [SubBruteAttackCAME12bit868] = {868350000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol},
-//    [SubBruteAttackNICE12bit433] = {433920000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, NICEFileProtocol},
-//    [SubBruteAttackNICE12bit868] = {868350000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, NICEFileProtocol},
-//    [SubBruteAttackChamberlain9bit300] = {300000000, 9, 0, 3, FuriHalSubGhzPresetOok650Async, ChamberlainFileProtocol},
-//    [SubBruteAttackChamberlain9bit315] = {315000000, 9, 0, 3, FuriHalSubGhzPresetOok650Async, ChamberlainFileProtocol},
-//    [SubBruteAttackChamberlain9bit390] = {390000000, 9, 0, 3, FuriHalSubGhzPresetOok650Async, ChamberlainFileProtocol},
-//    [SubBruteAttackLinear10bit300] = {300000000, 10, 0, 5, FuriHalSubGhzPresetOok650Async, LinearFileProtocol},
-//    [SubBruteAttackLinear10bit310] = {300000000, 10, 0, 5, FuriHalSubGhzPresetOok650Async, LinearFileProtocol},
+/**
+ * CAME 12bit 303MHz
+ */
+const SubBruteProtocol subbrute_protocol_came_12bit_303 = {
+    .frequency = 303875000,
+    .bits = 12,
+    .te = 0,
+    .repeat = 3,
+    .preset = FuriHalSubGhzPresetOok650Async,
+    .file = CAMEFileProtocol};
+
+/**
+ * CAME 12bit 307MHz
+ */
+const SubBruteProtocol subbrute_protocol_came_12bit_307 = {
+    .frequency = 307800000,
+    .bits = 12,
+    .te = 0,
+    .repeat = 3,
+    .preset = FuriHalSubGhzPresetOok650Async,
+    .file = CAMEFileProtocol};
+
+/**
+ * CAME 12bit 433MHz
+ */
+const SubBruteProtocol subbrute_protocol_came_12bit_433 = {
+    .frequency = 433920000,
+    .bits = 12,
+    .te = 0,
+    .repeat = 3,
+    .preset = FuriHalSubGhzPresetOok650Async,
+    .file = CAMEFileProtocol};
+
+/**
+ * CAME 12bit 868MHz
+ */
+const SubBruteProtocol subbrute_protocol_came_12bit_868 = {
+    .frequency = 868350000,
+    .bits = 12,
+    .te = 0,
+    .repeat = 3,
+    .preset = FuriHalSubGhzPresetOok650Async,
+    .file = CAMEFileProtocol};
+
+/**
+ * NICE 12bit 433MHz
+ */
+const SubBruteProtocol subbrute_protocol_nice_12bit_433 = {
+    .frequency = 433920000,
+    .bits = 12,
+    .te = 0,
+    .repeat = 3,
+    .preset = FuriHalSubGhzPresetOok650Async,
+    .file = NICEFileProtocol};
+
+/**
+ * NICE 12bit 868MHz
+ */
+const SubBruteProtocol subbrute_protocol_nice_12bit_868 = {
+    .frequency = 868350000,
+    .bits = 12,
+    .te = 0,
+    .repeat = 3,
+    .preset = FuriHalSubGhzPresetOok650Async,
+    .file = NICEFileProtocol};
+
+/**
+ * Chamberlain 9bit 300MHz
+ */
+const SubBruteProtocol subbrute_protocol_chamberlain_9bit_300 = {
+    .frequency = 300000000,
+    .bits = 9,
+    .te = 0,
+    .repeat = 3,
+    .preset = FuriHalSubGhzPresetOok650Async,
+    .file = ChamberlainFileProtocol};
+
+/**
+ * Chamberlain 9bit 315MHz
+ */
+const SubBruteProtocol subbrute_protocol_chamberlain_9bit_315 = {
+    .frequency = 315000000,
+    .bits = 9,
+    .te = 0,
+    .repeat = 3,
+    .preset = FuriHalSubGhzPresetOok650Async,
+    .file = ChamberlainFileProtocol};
+
+/**
+ * Chamberlain 9bit 390MHz
+ */
+const SubBruteProtocol subbrute_protocol_chamberlain_9bit_390 = {
+    .frequency = 390000000,
+    .bits = 9,
+    .te = 0,
+    .repeat = 3,
+    .preset = FuriHalSubGhzPresetOok650Async,
+    .file = ChamberlainFileProtocol};
+
+/**
+ * Linear 10bit 300MHz
+ */
+const SubBruteProtocol subbrute_protocol_linear_10bit_300 = {
+    .frequency = 300000000,
+    .bits = 10,
+    .te = 0,
+    .repeat = 5,
+    .preset = FuriHalSubGhzPresetOok650Async,
+    .file = LinearFileProtocol};
+
+/**
+ * Linear 10bit 310MHz
+ */
+const SubBruteProtocol subbrute_protocol_linear_10bit_310 = {
+    .frequency = 310000000,
+    .bits = 10,
+    .te = 0,
+    .repeat = 5,
+    .preset = FuriHalSubGhzPresetOok650Async,
+    .file = LinearFileProtocol};
+
+/**
+ * BF existing dump
+ */
+const SubBruteProtocol subbrute_protocol_load_file =
+    {0, 0, 0, 3, FuriHalSubGhzPresetOok650Async, RAWFileProtocol};
+
+//static const SubBruteProtocol subbrute_protocols[SubBruteAttackTotalCount] = {
+//    [SubBruteAttackCAME12bit303] =
+//        {303875000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol},
+//    [SubBruteAttackCAME12bit307] =
+//        {307800000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol},
+//    [SubBruteAttackCAME12bit433] =
+//        {433920000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol},
+//    [SubBruteAttackCAME12bit868] =
+//        {868350000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol},
+//    [SubBruteAttackNICE12bit433] =
+//        {433920000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, NICEFileProtocol},
+//    [SubBruteAttackNICE12bit868] =
+//        {868350000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, NICEFileProtocol},
+//    [SubBruteAttackChamberlain9bit300] =
+//        {300000000, 9, 0, 3, FuriHalSubGhzPresetOok650Async, ChamberlainFileProtocol},
+//    [SubBruteAttackChamberlain9bit315] =
+//        {315000000, 9, 0, 3, FuriHalSubGhzPresetOok650Async, ChamberlainFileProtocol},
+//    [SubBruteAttackChamberlain9bit390] =
+//        {390000000, 9, 0, 3, FuriHalSubGhzPresetOok650Async, ChamberlainFileProtocol},
+//    [SubBruteAttackLinear10bit300] =
+//        {300000000, 10, 0, 5, FuriHalSubGhzPresetOok650Async, LinearFileProtocol},
+//    [SubBruteAttackLinear10bit310] =
+//        {300000000, 10, 0, 5, FuriHalSubGhzPresetOok650Async, LinearFileProtocol},
 //    [SubBruteAttackLoadFile] = {0, 0, 0, 3, FuriHalSubGhzPresetOok650Async, RAWFileProtocol},
 //};
 
@@ -65,7 +179,21 @@ static const char* subbrute_protocol_presets[] = {
     [FuriHalSubGhzPresetGFSK9_99KbAsync] = "FuriHalSubGhzPresetGFSK9_99KbAsync",
 };
 
-static const char* subbrute_protocol_file_types[TotalFileProtocol] = {
+const SubBruteProtocol* subbrute_protocol_registry[] = {
+    [SubBruteAttackCAME12bit303] = &subbrute_protocol_came_12bit_303,
+    [SubBruteAttackCAME12bit307] = &subbrute_protocol_came_12bit_307,
+    [SubBruteAttackCAME12bit433] = &subbrute_protocol_came_12bit_433,
+    [SubBruteAttackCAME12bit868] = &subbrute_protocol_came_12bit_868,
+    [SubBruteAttackNICE12bit433] = &subbrute_protocol_nice_12bit_433,
+    [SubBruteAttackNICE12bit868] = &subbrute_protocol_nice_12bit_868,
+    [SubBruteAttackChamberlain9bit300] = &subbrute_protocol_chamberlain_9bit_300,
+    [SubBruteAttackChamberlain9bit315] = &subbrute_protocol_chamberlain_9bit_315,
+    [SubBruteAttackChamberlain9bit390] = &subbrute_protocol_chamberlain_9bit_390,
+    [SubBruteAttackLinear10bit300] = &subbrute_protocol_linear_10bit_300,
+    [SubBruteAttackLinear10bit310] = &subbrute_protocol_linear_10bit_310,
+    [SubBruteAttackLoadFile] = &subbrute_protocol_load_file};
+
+static const char* subbrute_protocol_file_types[] = {
     [CAMEFileProtocol] = "CAME",
     [NICEFileProtocol] = "Nice FLO",
     [ChamberlainFileProtocol] = "Cham_Code",
@@ -73,32 +201,12 @@ static const char* subbrute_protocol_file_types[TotalFileProtocol] = {
     [PrincetonFileProtocol] = "Princeton",
     [RAWFileProtocol] = "RAW"};
 
-SubBruteProtocol* subbrute_protocol_alloc(void) {
-    SubBruteProtocol* protocol = malloc(sizeof(SubBruteProtocol));
-    protocol->frequency = subbrute_protocols[SubBruteAttackLoadFile].frequency;
-    protocol->repeat = subbrute_protocols[SubBruteAttackLoadFile].repeat;
-    protocol->preset = subbrute_protocols[SubBruteAttackLoadFile].preset;
-    protocol->file = subbrute_protocols[SubBruteAttackLoadFile].file;
-    protocol->te = subbrute_protocols[SubBruteAttackLoadFile].te;
-    protocol->bits = subbrute_protocols[SubBruteAttackLoadFile].bits;
-
-    return protocol;
-}
-
 const char* subbrute_protocol_name(SubBruteAttacks index) {
     return subbrute_protocol_names[index];
 }
 
-SubBruteProtocol* subbrute_protocol(SubBruteAttacks index) {
-    SubBruteProtocol* protocol = subbrute_protocol_alloc();
-    protocol->frequency = subbrute_protocols[index].frequency;
-    protocol->repeat = subbrute_protocols[index].repeat;
-    protocol->preset = subbrute_protocols[index].preset;
-    protocol->file = subbrute_protocols[index].file;
-    protocol->te = subbrute_protocols[index].te;
-    protocol->bits = subbrute_protocols[index].bits;
-
-    return protocol;
+const SubBruteProtocol* subbrute_protocol(SubBruteAttacks index) {
+    return subbrute_protocol_registry[index];
 }
 
 const char* subbrute_protocol_preset(FuriHalSubGhzPreset preset) {

+ 1 - 2
applications/plugins/subbrute/subbrute_protocols.h

@@ -49,8 +49,7 @@ typedef struct {
     SubBruteFileProtocol file;
 } SubBruteProtocol;
 
-SubBruteProtocol* subbrute_protocol_alloc(void);
-SubBruteProtocol* subbrute_protocol(SubBruteAttacks index);
+const SubBruteProtocol* subbrute_protocol(SubBruteAttacks index);
 const char* subbrute_protocol_preset(FuriHalSubGhzPreset preset);
 const char* subbrute_protocol_file(SubBruteFileProtocol protocol);
 FuriHalSubGhzPreset subbrute_protocol_convert_preset(FuriString* preset_name);

+ 10 - 10
applications/plugins/subbrute/views/subbrute_attack_view.c

@@ -2,11 +2,11 @@
 #include "../subbrute_i.h"
 #include "../subbrute_protocols.h"
 
-#include "assets_icons.h"
 #include <input/input.h>
 #include <gui/elements.h>
-#include <gui/icon_i.h>
-#include <gui/icon_animation_i.h>
+#include <gui/icon.h>
+#include <gui/icon_animation.h>
+#include <assets_icons.h>
 
 #define TAG "SubBruteAttackView"
 
@@ -291,8 +291,8 @@ void elements_button_top_left(Canvas* canvas, const char* str) {
     const uint8_t horizontal_offset = 3;
     const uint8_t string_width = canvas_string_width(canvas, str);
     const uint8_t icon_h_offset = 3;
-    const uint8_t icon_width_with_offset = icon->width + icon_h_offset;
-    const uint8_t icon_v_offset = icon->height; //
+    const uint8_t icon_width_with_offset = icon_get_width(icon) + icon_h_offset;
+    const uint8_t icon_v_offset = icon_get_height(icon); //
     const uint8_t button_width = string_width + horizontal_offset * 2 + icon_width_with_offset + 1;
 
     const uint8_t x = 0;
@@ -318,8 +318,8 @@ void elements_button_top_right(Canvas* canvas, const char* str) {
     const uint8_t horizontal_offset = 3;
     const uint8_t string_width = canvas_string_width(canvas, str);
     const uint8_t icon_h_offset = 3;
-    const uint8_t icon_width_with_offset = icon->width + icon_h_offset;
-    const uint8_t icon_v_offset = icon->height; // + vertical_offset;
+    const uint8_t icon_width_with_offset = icon_get_width(icon) + icon_h_offset;
+    const uint8_t icon_v_offset = icon_get_height(icon); // + vertical_offset;
     const uint8_t button_width = string_width + horizontal_offset * 2 + icon_width_with_offset + 1;
 
     const uint8_t x = canvas_width(canvas);
@@ -332,7 +332,7 @@ void elements_button_top_right(Canvas* canvas, const char* str) {
 
     canvas_invert_color(canvas);
     canvas_draw_str(canvas, x - button_width + horizontal_offset, y + vertical_offset, str);
-    canvas_draw_icon(canvas, x - horizontal_offset - icon->width, y + icon_v_offset, icon);
+    canvas_draw_icon(canvas, x - horizontal_offset - icon_get_width(icon), y + icon_v_offset, icon);
     canvas_invert_color(canvas);
 }
 
@@ -371,8 +371,8 @@ void subbrute_attack_view_draw(Canvas* canvas, void* context) {
         }
         // canvas_draw_icon_animation
         const uint8_t icon_h_offset = 0;
-        const uint8_t icon_width_with_offset = model->icon->icon->width + icon_h_offset;
-        const uint8_t icon_v_offset = model->icon->icon->height; // + vertical_offset;
+        const uint8_t icon_width_with_offset = icon_animation_get_width(model->icon) + icon_h_offset;
+        const uint8_t icon_v_offset = icon_animation_get_height(model->icon); // + vertical_offset;
         const uint8_t x = canvas_width(canvas);
         const uint8_t y = canvas_height(canvas);
         canvas_draw_icon_animation(

+ 0 - 3
applications/plugins/subbrute/views/subbrute_attack_view.h

@@ -2,11 +2,8 @@
 
 #include "../subbrute_custom_event.h"
 #include <gui/view.h>
-#include "assets_icons.h"
 #include <input/input.h>
 #include <gui/elements.h>
-#include <gui/icon.h>
-#include <subghz/types.h>
 
 typedef void (*SubBruteAttackViewCallback)(SubBruteCustomEvent event, void* context);
 typedef struct SubBruteAttackView SubBruteAttackView;

+ 1 - 1
applications/plugins/subbrute/views/subbrute_main_view.c

@@ -4,8 +4,8 @@
 
 #include <input/input.h>
 #include <gui/elements.h>
-#include "assets_icons.h"
 #include <gui/icon.h>
+#include <assets_icons.h>
 
 #define STATUS_BAR_Y_SHIFT 14
 #define TAG "SubBruteMainView"

+ 0 - 2
applications/plugins/subbrute/views/subbrute_main_view.h

@@ -2,10 +2,8 @@
 
 #include "../subbrute_custom_event.h"
 #include <gui/view.h>
-#include "assets_icons.h"
 #include <input/input.h>
 #include <gui/elements.h>
-#include <gui/icon.h>
 
 typedef void (*SubBruteMainViewCallback)(SubBruteCustomEvent event, void* context);
 typedef struct SubBruteMainView SubBruteMainView;