derskythe 3 lat temu
rodzic
commit
ea76e7fb4f

+ 3 - 2
helpers/subbrute_worker.c

@@ -78,7 +78,8 @@ bool subbrute_worker_init_default_attack(
     SubBruteWorker* instance,
     SubBruteAttacks attack_type,
     uint64_t step,
-    const SubBruteProtocol* protocol) {
+    const SubBruteProtocol* protocol,
+    uint8_t extra_repeats) {
     furi_assert(instance);
 
     if(instance->worker_running) {
@@ -93,7 +94,7 @@ bool subbrute_worker_init_default_attack(
     instance->step = step;
     instance->bits = protocol->bits;
     instance->te = protocol->te;
-    instance->repeat = protocol->repeat;
+    instance->repeat = protocol->repeat + extra_repeats;
     instance->load_index = 0;
     instance->file_key = NULL;
     instance->max_value = subbrute_protocol_calc_max_value(instance->attack, instance->bits);

+ 2 - 1
helpers/subbrute_worker.h

@@ -22,7 +22,8 @@ bool subbrute_worker_init_default_attack(
     SubBruteWorker* instance,
     SubBruteAttacks attack_type,
     uint64_t step,
-    const SubBruteProtocol* protocol);
+    const SubBruteProtocol* protocol,
+    uint8_t extra_repeats);
 bool subbrute_worker_init_file_attack(
     SubBruteWorker* instance,
     uint64_t step,

+ 6 - 3
scenes/subbrute_scene_setup_attack.c

@@ -45,7 +45,8 @@ void subbrute_scene_setup_attack_on_enter(void* context) {
         instance->device->attack,
         instance->device->max_value,
         instance->device->key_index,
-        false);
+        false,
+        instance->device->extra_repeats);
 
     instance->current_view = SubBruteViewAttack;
     subbrute_attack_view_set_callback(view, subbrute_scene_setup_attack_callback, instance);
@@ -78,7 +79,8 @@ bool subbrute_scene_setup_attack_on_event(void* context, SceneManagerEvent event
                 instance->device->attack,
                 instance->device->max_value,
                 instance->device->key_index,
-                false);
+                false,
+                instance->device->extra_repeats);
             scene_manager_next_scene(instance->scene_manager, SubBruteSceneSaveName);
         } else if(event.event == SubBruteCustomEventTypeBackPressed) {
             subbrute_attack_view_init_values(
@@ -86,7 +88,8 @@ bool subbrute_scene_setup_attack_on_event(void* context, SceneManagerEvent event
                 instance->device->attack,
                 instance->device->max_value,
                 instance->device->key_index,
-                false);
+                false,
+                instance->device->extra_repeats);
             scene_manager_next_scene(instance->scene_manager, SubBruteSceneStart);
         } else if(event.event == SubBruteCustomEventTypeError) {
             notification_message(instance->notifications, &sequence_error);

+ 5 - 1
scenes/subbrute_scene_start.c

@@ -56,13 +56,17 @@ bool subbrute_scene_start_on_event(void* context, SceneManagerEvent event) {
                    instance->worker,
                    attack,
                    instance->device->key_index,
-                   instance->device->protocol_info)) {
+                   instance->device->protocol_info,
+        instance->device->extra_repeats)) {
                 furi_crash("Invalid attack set!");
             }
+            instance->device->extra_repeats =
+                subbrute_main_view_get_extra_repeats(instance->view_main);
             scene_manager_next_scene(instance->scene_manager, SubBruteSceneSetupAttack);
 
             consumed = true;
         } else if(event.event == SubBruteCustomEventTypeLoadFile) {
+            instance->device->extra_repeats = 0;
             scene_manager_next_scene(instance->scene_manager, SubBruteSceneLoadFile);
             consumed = true;
         }

+ 1 - 0
subbrute_device.h

@@ -48,6 +48,7 @@ typedef struct {
     // Attack state
     SubBruteAttacks attack;
     uint64_t max_value;
+    uint8_t extra_repeats;
 
     // Loaded info for attack type
     char current_key[SUBBRUTE_PAYLOAD_SIZE];

+ 0 - 9
subbrute_protocols.h

@@ -4,15 +4,6 @@
 #include <furi_hal_subghz.h>
 #include <core/string.h>
 #include <toolbox/stream/stream.h>
-//typedef enum {
-//    FrequencyProtocolField,
-//    BitsProtocolField,
-//    HasTeProtocolField,
-//    RepeatProtocolField,
-//    PresetProtocolField,
-//    FileProtocolField,
-//    TotalProtocolFields
-//} ProtocolFields;
 
 typedef enum {
     CAMEFileProtocol,

+ 16 - 63
views/subbrute_attack_view.c

@@ -20,6 +20,7 @@ typedef struct {
     SubBruteAttacks index;
     uint64_t max_value;
     uint64_t current_step;
+    uint8_t extra_repeats;
     bool is_attacking;
     bool is_continuous_worker;
     IconAnimation* icon;
@@ -65,12 +66,6 @@ bool subbrute_attack_view_input(InputEvent* event, void* context) {
         { is_attacking = model->is_attacking; },
         false);
 
-    //    if(!is_attacking) {
-    //        instance->callback(SubBruteCustomEventTypeTransmitNotStarted, instance->context);
-    //    } else {
-    //        instance->callback(SubBruteCustomEventTypeTransmitStarted, instance->context);
-    //    }
-
     if(!is_attacking) {
         if(event->type == InputTypeShort && event->key == InputKeyOk) {
 #ifdef FURI_DEBUG
@@ -87,32 +82,6 @@ bool subbrute_attack_view_input(InputEvent* event, void* context) {
                 },
                 true);
             instance->callback(SubBruteCustomEventTypeTransmitStarted, instance->context);
-            /*if(event->type == InputTypeRepeat && event->key == InputKeyOk) {
-#ifdef FURI_DEBUG
-            FURI_LOG_D(TAG, "InputKey: %d OK. SubBruteCustomEventTypeTransmitContinuousStarted", event->key);
-#endif
-            with_view_model(
-                instance->view, (SubBruteAttackViewModel * model) {
-                    model->is_attacking = true;
-                    model->is_continuous_worker = true;
-                    icon_animation_stop(model->icon);
-                    icon_animation_start(model->icon);
-                    return true;
-                });
-            instance->callback(SubBruteCustomEventTypeTransmitContinuousStarted, instance->context);
-        } else if(event->type == InputTypeShort && event->key == InputKeyOk) {
-#ifdef FURI_DEBUG
-            FURI_LOG_D(TAG, "InputKey: %d OK", event->key);
-#endif
-            with_view_model(
-                instance->view, (SubBruteAttackViewModel * model) {
-                    model->is_attacking = true;
-                    model->is_continuous_worker = false;
-                    icon_animation_stop(model->icon);
-                    icon_animation_start(model->icon);
-                    return true;
-                });
-            instance->callback(SubBruteCustomEventTypeTransmitStarted, instance->context);*/
         } else if(event->key == InputKeyUp) {
             instance->callback(SubBruteCustomEventTypeSaveFile, instance->context);
         } else if(event->key == InputKeyDown) {
@@ -123,34 +92,12 @@ bool subbrute_attack_view_input(InputEvent* event, void* context) {
             } else if(event->key == InputKeyRight) {
                 instance->callback(SubBruteCustomEventTypeChangeStepUp, instance->context);
             }
-            //            with_view_model(
-            //                instance->view, (SubBruteAttackViewModel * model) {
-            //                    if(event->key == InputKeyLeft) {
-            //                        model->current_step =
-            //                            ((model->current_step - 1) + model->max_value) % model->max_value;
-            //                    } else if(event->key == InputKeyRight) {
-            //                        model->current_step = (model->current_step + 1) % model->max_value;
-            //                    }
-            //                    return true;
-            //                });
-            //            instance->callback(SubBruteCustomEventTypeChangeStep, instance->context);
         } else if(event->type == InputTypeRepeat) {
             if(event->key == InputKeyLeft) {
                 instance->callback(SubBruteCustomEventTypeChangeStepDownMore, instance->context);
             } else if(event->key == InputKeyRight) {
                 instance->callback(SubBruteCustomEventTypeChangeStepUpMore, instance->context);
             }
-            /*with_view_model(
-                instance->view, (SubBruteAttackViewModel * model) {
-                    if(event->key == InputKeyLeft) {
-                        model->current_step =
-                            ((model->current_step - 100) + model->max_value) % model->max_value;
-                    } else if(event->key == InputKeyRight) {
-                        model->current_step = (model->current_step + 100) % model->max_value;
-                    }
-                    return true;
-                });
-            instance->callback(SubBruteCustomEventTypeChangeStep, instance->context);*/
         }
     } else {
         if((event->type == InputTypeShort || event->type == InputTypeRepeat) &&
@@ -254,7 +201,8 @@ void subbrute_attack_view_init_values(
     uint8_t index,
     uint64_t max_value,
     uint64_t current_step,
-    bool is_attacking) {
+    bool is_attacking,
+    uint8_t extra_repeats) {
 #ifdef FURI_DEBUG
     FURI_LOG_D(
         TAG,
@@ -271,6 +219,7 @@ void subbrute_attack_view_init_values(
             model->index = index;
             model->current_step = current_step;
             model->is_attacking = is_attacking;
+            model->extra_repeats = extra_repeats;
             if(is_attacking) {
                 icon_animation_start(model->icon);
             } else {
@@ -313,10 +262,12 @@ void elements_button_top_left(Canvas* canvas, const char* str) {
     const uint8_t x = 0;
     const uint8_t y = 0 + button_height;
 
-    canvas_draw_box(canvas, x, y - button_height, button_width, button_height);
-    canvas_draw_line(canvas, x + button_width + 0, y - button_height, x + button_width + 0, y - 1);
-    canvas_draw_line(canvas, x + button_width + 1, y - button_height, x + button_width + 1, y - 2);
-    canvas_draw_line(canvas, x + button_width + 2, y - button_height, x + button_width + 2, y - 3);
+    uint8_t line_x = x + button_width;
+    uint8_t line_y = y - button_height;
+    canvas_draw_box(canvas, x, line_y, button_width, button_height);
+    canvas_draw_line(canvas, line_x + 0, line_y, line_x + 0, y - 1);
+    canvas_draw_line(canvas, line_x + 1, line_y, line_x + 1, y - 2);
+    canvas_draw_line(canvas, line_x + 2, line_y, line_x + 2, y - 3);
 
     canvas_invert_color(canvas);
     canvas_draw_icon(canvas, x + horizontal_offset, y - icon_v_offset, icon);
@@ -345,10 +296,12 @@ void elements_button_top_right(Canvas* canvas, const char* str) {
     const uint8_t x = canvas_width(canvas);
     const uint8_t y = 0 + button_height;
 
-    canvas_draw_box(canvas, x - button_width, y - button_height, button_width, button_height);
-    canvas_draw_line(canvas, x - button_width - 1, y - button_height, x - button_width - 1, y - 1);
-    canvas_draw_line(canvas, x - button_width - 2, y - button_height, x - button_width - 2, y - 2);
-    canvas_draw_line(canvas, x - button_width - 3, y - button_height, x - button_width - 3, y - 3);
+    uint8_t line_x = x - button_width;
+    uint8_t line_y = y - button_height;
+    canvas_draw_box(canvas, line_x, line_y, button_width, button_height);
+    canvas_draw_line(canvas, line_x - 1, line_y, line_x - 1, y - 1);
+    canvas_draw_line(canvas, line_x - 2, line_y, line_x - 2, y - 2);
+    canvas_draw_line(canvas, line_x - 3, line_y, line_x - 3, y - 3);
 
     canvas_invert_color(canvas);
     canvas_draw_str(canvas, x - button_width + horizontal_offset, y - vertical_offset, str);

+ 2 - 1
views/subbrute_attack_view.h

@@ -22,4 +22,5 @@ void subbrute_attack_view_init_values(
     uint8_t index,
     uint64_t max_value,
     uint64_t current_step,
-    bool is_attacking);
+    bool is_attacking,
+    uint8_t extra_repeats);

+ 33 - 9
views/subbrute_main_view.c

@@ -18,6 +18,7 @@ struct SubBruteMainView {
 
 typedef struct {
     uint8_t index;
+    uint8_t extra_repeats;
     uint8_t window_position;
     bool is_select_byte;
     const char* key_field;
@@ -80,8 +81,6 @@ FuriString* center_displayed_key(const char* key_cstr, uint8_t index) {
 }
 
 void subbrute_main_view_draw(Canvas* canvas, SubBruteMainViewModel* model) {
-    SubBruteMainViewModel* m = model;
-
     // Title
     canvas_set_font(canvas, FontPrimary);
     canvas_draw_box(canvas, 0, 0, canvas_width(canvas), STATUS_BAR_Y_SHIFT);
@@ -89,17 +88,17 @@ void subbrute_main_view_draw(Canvas* canvas, SubBruteMainViewModel* model) {
     canvas_draw_str_aligned(canvas, 64, 3, AlignCenter, AlignTop, "Sub-GHz BruteForcer 3.1");
     canvas_invert_color(canvas);
 
-    if(m->is_select_byte) {
+    if(model->is_select_byte) {
 #ifdef FURI_DEBUG
-        //FURI_LOG_D(TAG, "key_field: %s", m->key_field);
+        //FURI_LOG_D(TAG, "key_field: %s", model->key_field);
 #endif
         char msg_index[18];
-        snprintf(msg_index, sizeof(msg_index), "Field index : %d", m->index);
+        snprintf(msg_index, sizeof(msg_index), "Field index : %d", model->index);
         canvas_draw_str_aligned(canvas, 64, 26, AlignCenter, AlignTop, msg_index);
 
         FuriString* menu_items;
 
-        menu_items = center_displayed_key(m->key_field, m->index);
+        menu_items = center_displayed_key(model->key_field, model->index);
         canvas_set_font(canvas, FontSecondary);
         canvas_draw_str_aligned(
             canvas, 64, 40, AlignCenter, AlignTop, furi_string_get_cstr(menu_items));
@@ -118,13 +117,13 @@ void subbrute_main_view_draw(Canvas* canvas, SubBruteMainViewModel* model) {
         const uint8_t item_height = 16;
 
 #ifdef FURI_DEBUG
-        //FURI_LOG_D(TAG, "window_position: %d, index: %d", model->window_position, m->index);
+        //FURI_LOG_D(TAG, "window_position: %d, index: %d", model->window_position, model->index);
 #endif
         for(uint8_t position = 0; position < SubBruteAttackTotalCount; ++position) {
             uint8_t item_position = position - model->window_position;
 
             if(item_position < items_on_screen) {
-                if(m->index == position) {
+                if(model->index == position) {
                     canvas_draw_str_aligned(
                         canvas,
                         4,
@@ -132,6 +131,7 @@ void subbrute_main_view_draw(Canvas* canvas, SubBruteMainViewModel* model) {
                         AlignLeft,
                         AlignCenter,
                         subbrute_protocol_name(position));
+
                     elements_frame(
                         canvas, 1, 1 + (item_position * item_height) + STATUS_BAR_Y_SHIFT, 124, 15);
                 } else {
@@ -151,7 +151,7 @@ void subbrute_main_view_draw(Canvas* canvas, SubBruteMainViewModel* model) {
             canvas_width(canvas),
             STATUS_BAR_Y_SHIFT + 2,
             canvas_height(canvas) - STATUS_BAR_Y_SHIFT,
-            m->index,
+            model->index,
             SubBruteAttackTotalCount);
     }
 }
@@ -277,6 +277,16 @@ 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");
@@ -307,6 +317,7 @@ SubBruteMainView* subbrute_main_view_alloc() {
         {
             model->index = 0;
             model->window_position = 0;
+            model->extra_repeats = 0;
             model->key_field = NULL;
             model->is_select_byte = false;
         },
@@ -377,4 +388,17 @@ SubBruteAttacks subbrute_main_view_get_index(SubBruteMainView* instance) {
 #endif
 
     return idx;
+}
+
+uint8_t subbrute_main_view_get_extra_repeats(SubBruteMainView* instance) {
+    furi_assert(instance);
+
+    uint8_t extra_repeats = 0;
+    with_view_model(
+        instance->view,
+        SubBruteMainViewModel * model,
+        { extra_repeats = model->extra_repeats; },
+        false);
+
+    return extra_repeats;
 }

+ 3 - 1
views/subbrute_main_view.h

@@ -1,6 +1,7 @@
 #pragma once
 
 #include "../subbrute_custom_event.h"
+#include "../subbrute_protocols.h"
 #include <gui/view.h>
 #include <input/input.h>
 #include <gui/elements.h>
@@ -21,7 +22,8 @@ void subbrute_main_view_set_index(
     uint8_t idx,
     bool is_select_byte,
     const char* key_field);
-uint8_t subbrute_main_view_get_index(SubBruteMainView* instance);
+SubBruteAttacks subbrute_main_view_get_index(SubBruteMainView* instance);
+uint8_t subbrute_main_view_get_extra_repeats(SubBruteMainView* instance);
 void subbrute_attack_view_enter(void* context);
 void subbrute_attack_view_exit(void* context);
 bool subbrute_attack_view_input(InputEvent* event, void* context);