Przeglądaj źródła

Add main functionality, but unstable

DerSkythe 3 lat temu
rodzic
commit
c34dba41e8

+ 4 - 0
subbrute_protocols.c

@@ -287,6 +287,10 @@ const SubBruteProtocol* subbrute_protocol(SubBruteAttacks index) {
     return subbrute_protocol_registry[index];
 }
 
+uint8_t subbrute_protocol_repeats_count(SubBruteAttacks index) {
+    return subbrute_protocol_registry[index]->repeat;
+}
+
 const char* subbrute_protocol_preset(FuriHalSubGhzPreset preset) {
     return subbrute_protocol_presets[preset];
 }

+ 1 - 0
subbrute_protocols.h

@@ -52,6 +52,7 @@ const char* subbrute_protocol_preset(FuriHalSubGhzPreset preset);
 const char* subbrute_protocol_file(SubBruteFileProtocol protocol);
 FuriHalSubGhzPreset subbrute_protocol_convert_preset(FuriString* preset_name);
 SubBruteFileProtocol subbrute_protocol_file_protocol_name(FuriString* name);
+uint8_t subbrute_protocol_repeats_count(SubBruteAttacks index);
 const char* subbrute_protocol_name(SubBruteAttacks index);
 
 void subbrute_protocol_default_payload(

+ 23 - 9
views/subbrute_attack_view.c

@@ -18,6 +18,7 @@ struct SubBruteAttackView {
     uint64_t max_value;
     uint64_t current_step;
     bool is_attacking;
+    uint8_t extra_repeats;
 };
 
 typedef struct {
@@ -26,7 +27,6 @@ typedef struct {
     uint64_t current_step;
     uint8_t extra_repeats;
     bool is_attacking;
-    bool is_continuous_worker;
     IconAnimation* icon;
 } SubBruteAttackViewModel;
 
@@ -221,6 +221,8 @@ void subbrute_attack_view_init_values(
     instance->max_value = max_value;
     instance->current_step = current_step;
     instance->is_attacking = is_attacking;
+    instance->extra_repeats = extra_repeats;
+
     with_view_model(
         instance->view,
         SubBruteAttackViewModel * model,
@@ -323,36 +325,43 @@ void elements_button_top_right(Canvas* canvas, const char* str) {
 void subbrute_attack_view_draw(Canvas* canvas, void* context) {
     furi_assert(context);
     SubBruteAttackViewModel* model = (SubBruteAttackViewModel*)context;
-    char buffer[26];
+    char buffer[64];
 
     const char* attack_name = NULL;
     attack_name = subbrute_protocol_name(model->attack_type);
+
     // Title
     if(model->is_attacking) {
         canvas_set_color(canvas, ColorBlack);
         canvas_set_font(canvas, FontSecondary);
         canvas_draw_str_aligned(canvas, 64, 2, AlignCenter, AlignTop, attack_name);
     }
-    // Value
+
+    // Current Step / Max value
     canvas_set_font(canvas, FontBigNumbers);
     snprintf(buffer, sizeof(buffer), "%04d/%04d", (int)model->current_step, (int)model->max_value);
     canvas_draw_str_aligned(canvas, 64, 17, AlignCenter, AlignTop, buffer);
     canvas_set_font(canvas, FontSecondary);
 
+    memset(buffer, 0, sizeof(buffer));
     if(!model->is_attacking) {
         canvas_set_color(canvas, ColorBlack);
         canvas_set_font(canvas, FontSecondary);
         canvas_draw_str_aligned(canvas, 64, 44, AlignCenter, AlignBottom, attack_name);
 
+        snprintf(
+            buffer,
+            sizeof(buffer),
+            "x%d",
+            model->extra_repeats + subbrute_protocol_repeats_count(model->attack_type));
+        canvas_draw_str_aligned(canvas, 60, 6, AlignCenter, AlignCenter, buffer);
+
         elements_button_left(canvas, "-1");
         elements_button_right(canvas, "+1");
         elements_button_center(canvas, "Start");
         elements_button_top_left(canvas, "Save");
         elements_button_top_right(canvas, "Resend");
     } else {
-        if(model->is_continuous_worker) {
-            canvas_invert_color(canvas);
-        }
         // canvas_draw_icon_animation
         const uint8_t icon_h_offset = 0;
         const uint8_t icon_width_with_offset =
@@ -367,9 +376,14 @@ void subbrute_attack_view_draw(Canvas* canvas, void* context) {
         float progress_value = (float)model->current_step / model->max_value;
         elements_progress_bar(canvas, 8, 37, 110, progress_value > 1 ? 1 : progress_value);
 
+        snprintf(
+            buffer,
+            sizeof(buffer),
+            "x%d",
+            model->extra_repeats + subbrute_protocol_repeats_count(model->attack_type));
+        canvas_draw_str(canvas, 4, y - 8, buffer);
+        canvas_draw_str(canvas, 4, y - 1, "repeats");
+
         elements_button_center(canvas, "Stop");
-        if(model->is_continuous_worker) {
-            canvas_invert_color(canvas);
-        }
     }
 }

+ 35 - 4
views/subbrute_main_view.c

@@ -92,9 +92,12 @@ void subbrute_main_view_draw(Canvas* canvas, SubBruteMainViewModel* model) {
     canvas_set_font(canvas, FontPrimary);
     canvas_draw_box(canvas, 0, 0, canvas_width(canvas), STATUS_BAR_Y_SHIFT);
     canvas_invert_color(canvas);
-    canvas_draw_str_aligned(canvas, 64, 3, AlignCenter, AlignTop, "Sub-GHz BruteForcer 3.1");
+    canvas_draw_str_aligned(canvas, 64, 3, AlignCenter, AlignTop, "Sub-GHz BruteForcer 3.2");
     canvas_invert_color(canvas);
 
+    uint16_t screen_width = canvas_width(canvas);
+    uint16_t screen_height = canvas_height(canvas);
+
     if(model->is_select_byte) {
 #ifdef FURI_DEBUG
         //FURI_LOG_D(TAG, "key_field: %s", model->key_field);
@@ -138,6 +141,24 @@ void subbrute_main_view_draw(Canvas* canvas, SubBruteMainViewModel* model) {
                         AlignCenter,
                         subbrute_protocol_name(position));
 
+                    if(model->extra_repeats > 0) {
+                        canvas_set_font(canvas, FontBatteryPercent);
+                        char buffer[10];
+                        snprintf(
+                            buffer,
+                            sizeof(buffer),
+                            "x%d",
+                            model->extra_repeats + subbrute_protocol_repeats_count(model->index));
+                        canvas_draw_str_aligned(
+                            canvas,
+                            screen_width - 15,
+                            9 + (item_position * item_height) + STATUS_BAR_Y_SHIFT,
+                            AlignLeft,
+                            AlignCenter,
+                            buffer);
+                        canvas_set_font(canvas, FontSecondary);
+                    }
+
                     elements_frame(
                         canvas, 1, 1 + (item_position * item_height) + STATUS_BAR_Y_SHIFT, 124, 15);
                 } else {
@@ -154,9 +175,9 @@ void subbrute_main_view_draw(Canvas* canvas, SubBruteMainViewModel* model) {
 
         elements_scrollbar_pos(
             canvas,
-            canvas_width(canvas),
+            screen_width,
             STATUS_BAR_Y_SHIFT + 2,
-            canvas_height(canvas) - STATUS_BAR_Y_SHIFT,
+            screen_height - STATUS_BAR_Y_SHIFT,
             model->index,
             SubBruteAttackTotalCount);
     }
@@ -176,6 +197,7 @@ bool subbrute_main_view_input(InputEvent* event, void* context) {
     SubBruteMainView* instance = context;
     const uint8_t min_value = 0;
     const uint8_t correct_total = SubBruteAttackTotalCount - 1;
+    const uint8_t max_repeats = 9;
     uint8_t index = 0;
 
     bool updated = false;
@@ -189,6 +211,7 @@ bool subbrute_main_view_input(InputEvent* event, void* context) {
             } else {
                 instance->index = CLAMP(instance->index - 1, correct_total, min_value);
             }
+            instance->extra_repeats = 0;
             updated = true;
             consumed = true;
         } else if(event->key == InputKeyDown && is_short) {
@@ -197,6 +220,15 @@ bool subbrute_main_view_input(InputEvent* event, void* context) {
             } else {
                 instance->index = CLAMP(instance->index + 1, correct_total, min_value);
             }
+            instance->extra_repeats = 0;
+            updated = true;
+            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) {
@@ -299,7 +331,6 @@ 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;
             model->extra_repeats = 0;