mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-16 04:24:45 -07:00
Update apps pt2 + Add MAYHEM Evil Portal
This commit is contained in:
@@ -8,4 +8,5 @@ App(
|
||||
order=11,
|
||||
fap_icon="subbrute_10px.png",
|
||||
fap_category="Sub-GHz",
|
||||
fap_icon_assets="images",
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
#include "subghz_bruteforcer_icons.h"
|
||||
#include <assets_icons.h>
|
||||
#include <input/input.h>
|
||||
#include <gui/elements.h>
|
||||
#include <gui/icon.h>
|
||||
#include <gui/icon_animation.h>
|
||||
#include <assets_icons.h>
|
||||
|
||||
/**
|
||||
* Thanks to the author of metronome
|
||||
@@ -18,4 +19,4 @@ void elements_button_top_left(Canvas* canvas, const char* str);
|
||||
* @param canvas
|
||||
* @param str
|
||||
*/
|
||||
void elements_button_top_right(Canvas* canvas, const char* str);
|
||||
void elements_button_top_right(Canvas* canvas, const char* str);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#include <toolbox/stream/stream.h>
|
||||
#include <flipper_format.h>
|
||||
#include <flipper_format_i.h>
|
||||
#include <lib/subghz/protocols/protocol_items.h>
|
||||
#include <lib/subghz/subghz_protocol_registry.h>
|
||||
|
||||
#define TAG "SubBruteWorker"
|
||||
#define SUBBRUTE_TX_TIMEOUT 6
|
||||
@@ -453,18 +453,38 @@ uint8_t subbrute_worker_get_timeout(SubBruteWorker* instance) {
|
||||
return instance->tx_timeout_ms;
|
||||
}
|
||||
|
||||
void subbrute_worker_timeout_inc(SubBruteWorker* instance) {
|
||||
if(instance->tx_timeout_ms < 255) {
|
||||
instance->tx_timeout_ms++;
|
||||
}
|
||||
void subbrute_worker_set_timeout(SubBruteWorker* instance, uint8_t timeout) {
|
||||
instance->tx_timeout_ms = timeout;
|
||||
}
|
||||
|
||||
void subbrute_worker_timeout_dec(SubBruteWorker* instance) {
|
||||
if(instance->tx_timeout_ms > 0) {
|
||||
instance->tx_timeout_ms--;
|
||||
}
|
||||
uint8_t subbrute_worker_get_repeats(SubBruteWorker* instance) {
|
||||
return instance->repeat;
|
||||
}
|
||||
|
||||
void subbrute_worker_set_repeats(SubBruteWorker* instance, uint8_t repeats) {
|
||||
instance->repeat = repeats;
|
||||
}
|
||||
|
||||
uint32_t subbrute_worker_get_te(SubBruteWorker* instance) {
|
||||
return instance->te;
|
||||
}
|
||||
|
||||
void subbrute_worker_set_te(SubBruteWorker* instance, uint32_t te) {
|
||||
instance->te = te;
|
||||
}
|
||||
|
||||
// void subbrute_worker_timeout_inc(SubBruteWorker* instance) {
|
||||
// if(instance->tx_timeout_ms < 255) {
|
||||
// instance->tx_timeout_ms++;
|
||||
// }
|
||||
// }
|
||||
|
||||
// void subbrute_worker_timeout_dec(SubBruteWorker* instance) {
|
||||
// if(instance->tx_timeout_ms > 0) {
|
||||
// instance->tx_timeout_ms--;
|
||||
// }
|
||||
// }
|
||||
|
||||
bool subbrute_worker_is_tx_allowed(SubBruteWorker* instance, uint32_t value) {
|
||||
furi_assert(instance);
|
||||
bool res = false;
|
||||
|
||||
@@ -43,9 +43,14 @@ void subbrute_worker_set_callback(
|
||||
void* context);
|
||||
|
||||
uint8_t subbrute_worker_get_timeout(SubBruteWorker* instance);
|
||||
void subbrute_worker_set_timeout(SubBruteWorker* instance, uint8_t timeout);
|
||||
uint8_t subbrute_worker_get_repeats(SubBruteWorker* instance);
|
||||
void subbrute_worker_set_repeats(SubBruteWorker* instance, uint8_t repeats);
|
||||
uint32_t subbrute_worker_get_te(SubBruteWorker* instance);
|
||||
void subbrute_worker_set_te(SubBruteWorker* instance, uint32_t te);
|
||||
|
||||
void subbrute_worker_timeout_inc(SubBruteWorker* instance);
|
||||
// void subbrute_worker_timeout_inc(SubBruteWorker* instance);
|
||||
|
||||
void subbrute_worker_timeout_dec(SubBruteWorker* instance);
|
||||
// void subbrute_worker_timeout_dec(SubBruteWorker* instance);
|
||||
|
||||
bool subbrute_worker_is_tx_allowed(SubBruteWorker* instance, uint32_t value);
|
||||
@@ -46,7 +46,7 @@ void subbrute_scene_setup_attack_on_enter(void* context) {
|
||||
instance->device->max_value,
|
||||
instance->device->current_step,
|
||||
false,
|
||||
instance->device->extra_repeats);
|
||||
subbrute_worker_get_repeats(instance->worker));
|
||||
|
||||
instance->current_view = SubBruteViewAttack;
|
||||
subbrute_attack_view_set_callback(view, subbrute_scene_setup_attack_callback, instance);
|
||||
|
||||
@@ -3,43 +3,260 @@
|
||||
|
||||
#define TAG "SubBruteSceneLoadFile"
|
||||
|
||||
void setup_extra_widget_callback(GuiButtonType result, InputType type, void* context);
|
||||
#define MIN_TD 0
|
||||
#define MAX_TD 255
|
||||
#define MIN_REP 1
|
||||
#define MAX_REP 100
|
||||
#define MIN_TE 100
|
||||
#define MAX_TE 600
|
||||
|
||||
static void setup_extra_widget_draw(void* context) {
|
||||
furi_assert(context);
|
||||
SubBruteState* instance = context;
|
||||
enum SubBruteVarListIndex {
|
||||
SubBruteVarListIndexTimeDelay,
|
||||
SubBruteVarListIndexRepeat_or_OnExtra,
|
||||
SubBruteVarListIndexTe,
|
||||
};
|
||||
|
||||
Widget* widget = instance->widget;
|
||||
static void setup_extra_enter_callback(void* context, uint32_t index);
|
||||
|
||||
widget_add_button_element(
|
||||
widget, GuiButtonTypeLeft, "-TD", setup_extra_widget_callback, instance);
|
||||
widget_add_button_element(
|
||||
widget, GuiButtonTypeRight, "TD+", setup_extra_widget_callback, instance);
|
||||
static void setup_extra_td_callback(VariableItem* item) {
|
||||
furi_assert(item);
|
||||
SubBruteState* instance = variable_item_get_context(item);
|
||||
furi_assert(instance);
|
||||
char buf[6];
|
||||
|
||||
char str[20];
|
||||
snprintf(&str[0], 20, "%d", subbrute_worker_get_timeout(instance->worker));
|
||||
const uint8_t index = variable_item_get_current_value_index(item);
|
||||
uint8_t val = subbrute_worker_get_timeout(instance->worker);
|
||||
|
||||
widget_add_string_element(
|
||||
instance->widget, 64, 15, AlignCenter, AlignCenter, FontPrimary, "Time Delay");
|
||||
|
||||
widget_add_string_element(
|
||||
instance->widget, 64, 32, AlignCenter, AlignCenter, FontBigNumbers, &str[0]);
|
||||
if(index == 0) {
|
||||
if(val > MIN_TD) {
|
||||
val--;
|
||||
subbrute_worker_set_timeout(instance->worker, val);
|
||||
snprintf(&buf[0], 5, "%d", val);
|
||||
variable_item_set_current_value_text(item, &buf[0]);
|
||||
variable_item_set_current_value_index(item, 1);
|
||||
if(val == MIN_TD) {
|
||||
variable_item_set_current_value_index(item, 0);
|
||||
}
|
||||
}
|
||||
} else if(index == 2) {
|
||||
if(val < MAX_TD) {
|
||||
val++;
|
||||
subbrute_worker_set_timeout(instance->worker, val);
|
||||
snprintf(&buf[0], 5, "%d", val);
|
||||
variable_item_set_current_value_text(item, &buf[0]);
|
||||
variable_item_set_current_value_index(item, 1);
|
||||
if(val == MAX_TD) {
|
||||
variable_item_set_current_value_index(item, 2);
|
||||
}
|
||||
}
|
||||
} else if(index == 1) {
|
||||
if(val == MIN_TD) {
|
||||
val++;
|
||||
subbrute_worker_set_timeout(instance->worker, val);
|
||||
snprintf(&buf[0], 5, "%d", val);
|
||||
variable_item_set_current_value_text(item, &buf[0]);
|
||||
variable_item_set_current_value_index(item, 1);
|
||||
if(val == MAX_TD) {
|
||||
variable_item_set_current_value_index(item, 2);
|
||||
}
|
||||
} else if(val == MAX_TD) {
|
||||
val--;
|
||||
subbrute_worker_set_timeout(instance->worker, val);
|
||||
snprintf(&buf[0], 5, "%d", val);
|
||||
variable_item_set_current_value_text(item, &buf[0]);
|
||||
variable_item_set_current_value_index(item, 1);
|
||||
if(val == MIN_TD) {
|
||||
variable_item_set_current_value_index(item, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void setup_extra_widget_callback(GuiButtonType result, InputType type, void* context) {
|
||||
static void setup_extra_rep_callback(VariableItem* item) {
|
||||
furi_assert(item);
|
||||
SubBruteState* instance = variable_item_get_context(item);
|
||||
furi_assert(instance);
|
||||
char buf[6];
|
||||
|
||||
const uint8_t index = variable_item_get_current_value_index(item);
|
||||
uint8_t val = subbrute_worker_get_repeats(instance->worker);
|
||||
|
||||
if(index == 0) {
|
||||
if(val > MIN_REP) {
|
||||
val--;
|
||||
subbrute_worker_set_repeats(instance->worker, val);
|
||||
snprintf(&buf[0], 5, "%d", val);
|
||||
variable_item_set_current_value_text(item, &buf[0]);
|
||||
variable_item_set_current_value_index(item, 1);
|
||||
if(val == MIN_REP) {
|
||||
variable_item_set_current_value_index(item, 0);
|
||||
}
|
||||
}
|
||||
} else if(index == 2) {
|
||||
if(val < MAX_REP) {
|
||||
val++;
|
||||
subbrute_worker_set_repeats(instance->worker, val);
|
||||
snprintf(&buf[0], 5, "%d", val);
|
||||
variable_item_set_current_value_text(item, &buf[0]);
|
||||
variable_item_set_current_value_index(item, 1);
|
||||
if(val == MAX_REP) {
|
||||
variable_item_set_current_value_index(item, 2);
|
||||
}
|
||||
}
|
||||
} else if(index == 1) {
|
||||
if(val == MIN_REP) {
|
||||
val++;
|
||||
subbrute_worker_set_repeats(instance->worker, val);
|
||||
snprintf(&buf[0], 5, "%d", val);
|
||||
variable_item_set_current_value_text(item, &buf[0]);
|
||||
variable_item_set_current_value_index(item, 1);
|
||||
if(val == MAX_REP) {
|
||||
variable_item_set_current_value_index(item, 2);
|
||||
}
|
||||
} else if(val == MAX_REP) {
|
||||
val--;
|
||||
subbrute_worker_set_repeats(instance->worker, val);
|
||||
snprintf(&buf[0], 5, "%d", val);
|
||||
variable_item_set_current_value_text(item, &buf[0]);
|
||||
variable_item_set_current_value_index(item, 1);
|
||||
if(val == MIN_REP) {
|
||||
variable_item_set_current_value_index(item, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void setup_extra_te_callback(VariableItem* item) {
|
||||
furi_assert(item);
|
||||
SubBruteState* instance = variable_item_get_context(item);
|
||||
furi_assert(instance);
|
||||
char buf[6];
|
||||
|
||||
const uint8_t index = variable_item_get_current_value_index(item);
|
||||
uint32_t val = subbrute_worker_get_te(instance->worker);
|
||||
|
||||
if(index == 0) {
|
||||
if(val > MIN_TE) {
|
||||
val--;
|
||||
subbrute_worker_set_te(instance->worker, val);
|
||||
snprintf(&buf[0], 5, "%ld", val);
|
||||
variable_item_set_current_value_text(item, &buf[0]);
|
||||
variable_item_set_current_value_index(item, 1);
|
||||
if(val == MIN_TE) {
|
||||
variable_item_set_current_value_index(item, 0);
|
||||
}
|
||||
}
|
||||
} else if(index == 2) {
|
||||
if(val < MAX_TE) {
|
||||
val++;
|
||||
subbrute_worker_set_te(instance->worker, val);
|
||||
snprintf(&buf[0], 5, "%ld", val);
|
||||
variable_item_set_current_value_text(item, &buf[0]);
|
||||
variable_item_set_current_value_index(item, 1);
|
||||
if(val == MAX_TE) {
|
||||
variable_item_set_current_value_index(item, 2);
|
||||
}
|
||||
}
|
||||
} else if(index == 1) {
|
||||
if(val == MIN_TE) {
|
||||
val++;
|
||||
subbrute_worker_set_te(instance->worker, val);
|
||||
snprintf(&buf[0], 5, "%ld", val);
|
||||
variable_item_set_current_value_text(item, &buf[0]);
|
||||
variable_item_set_current_value_index(item, 1);
|
||||
if(val == MAX_TE) {
|
||||
variable_item_set_current_value_index(item, 2);
|
||||
}
|
||||
} else if(val == MAX_TE) {
|
||||
val--;
|
||||
subbrute_worker_set_te(instance->worker, val);
|
||||
snprintf(&buf[0], 5, "%ld", val);
|
||||
variable_item_set_current_value_text(item, &buf[0]);
|
||||
variable_item_set_current_value_index(item, 1);
|
||||
if(val == MIN_TE) {
|
||||
variable_item_set_current_value_index(item, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void subbrute_scene_setup_extra_init_var_list(SubBruteState* instance, bool on_extra) {
|
||||
furi_assert(instance);
|
||||
char str[6];
|
||||
VariableItem* item;
|
||||
static bool extra = false;
|
||||
if(on_extra) {
|
||||
extra = true;
|
||||
}
|
||||
|
||||
VariableItemList* var_list = instance->var_list;
|
||||
|
||||
variable_item_list_reset(var_list);
|
||||
|
||||
item = variable_item_list_add(var_list, "TimeDelay", 3, setup_extra_td_callback, instance);
|
||||
snprintf(&str[0], 5, "%d", subbrute_worker_get_timeout(instance->worker));
|
||||
variable_item_set_current_value_text(item, &str[0]);
|
||||
switch(subbrute_worker_get_timeout(instance->worker)) {
|
||||
case MIN_TD:
|
||||
variable_item_set_current_value_index(item, 0);
|
||||
break;
|
||||
case MAX_TD:
|
||||
variable_item_set_current_value_index(item, 2);
|
||||
break;
|
||||
|
||||
default:
|
||||
variable_item_set_current_value_index(item, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
if(extra) {
|
||||
item = variable_item_list_add(var_list, "Repeats", 3, setup_extra_rep_callback, instance);
|
||||
snprintf(&str[0], 5, "%d", subbrute_worker_get_repeats(instance->worker));
|
||||
variable_item_set_current_value_text(item, &str[0]);
|
||||
switch(subbrute_worker_get_repeats(instance->worker)) {
|
||||
case MIN_REP:
|
||||
variable_item_set_current_value_index(item, 0);
|
||||
break;
|
||||
case MAX_REP:
|
||||
variable_item_set_current_value_index(item, 2);
|
||||
break;
|
||||
|
||||
default:
|
||||
variable_item_set_current_value_index(item, 1);
|
||||
break;
|
||||
}
|
||||
const uint32_t te = subbrute_worker_get_te(instance->worker);
|
||||
if(te != 0) {
|
||||
item = variable_item_list_add(var_list, "Te", 3, setup_extra_te_callback, instance);
|
||||
snprintf(&str[0], 5, "%ld", te);
|
||||
variable_item_set_current_value_text(item, &str[0]);
|
||||
switch(te) {
|
||||
case MIN_TE:
|
||||
variable_item_set_current_value_index(item, 0);
|
||||
break;
|
||||
case MAX_TE:
|
||||
variable_item_set_current_value_index(item, 2);
|
||||
break;
|
||||
|
||||
default:
|
||||
variable_item_set_current_value_index(item, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
item = variable_item_list_add(var_list, "Show Extra", 0, NULL, NULL);
|
||||
}
|
||||
|
||||
variable_item_list_set_enter_callback(var_list, setup_extra_enter_callback, instance);
|
||||
view_dispatcher_switch_to_view(instance->view_dispatcher, SubBruteViewVarList);
|
||||
}
|
||||
|
||||
static void setup_extra_enter_callback(void* context, uint32_t index) {
|
||||
furi_assert(context);
|
||||
SubBruteState* instance = context;
|
||||
|
||||
if((result == GuiButtonTypeLeft) && ((type == InputTypeShort) || (type == InputTypeRepeat))) {
|
||||
widget_reset(instance->widget);
|
||||
subbrute_worker_timeout_dec(instance->worker);
|
||||
setup_extra_widget_draw(instance);
|
||||
} else if(
|
||||
(result == GuiButtonTypeRight) &&
|
||||
((type == InputTypeShort) || (type == InputTypeRepeat))) {
|
||||
widget_reset(instance->widget);
|
||||
subbrute_worker_timeout_inc(instance->worker);
|
||||
setup_extra_widget_draw(instance);
|
||||
if(index == SubBruteVarListIndexRepeat_or_OnExtra) {
|
||||
subbrute_scene_setup_extra_init_var_list(instance, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,16 +264,14 @@ void subbrute_scene_setup_extra_on_enter(void* context) {
|
||||
furi_assert(context);
|
||||
SubBruteState* instance = context;
|
||||
|
||||
setup_extra_widget_draw(instance);
|
||||
|
||||
view_dispatcher_switch_to_view(instance->view_dispatcher, SubBruteViewWidget);
|
||||
subbrute_scene_setup_extra_init_var_list(instance, false);
|
||||
}
|
||||
|
||||
void subbrute_scene_setup_extra_on_exit(void* context) {
|
||||
furi_assert(context);
|
||||
SubBruteState* instance = context;
|
||||
|
||||
widget_reset(instance->widget);
|
||||
variable_item_list_reset(instance->var_list);
|
||||
}
|
||||
|
||||
bool subbrute_scene_setup_extra_on_event(void* context, SceneManagerEvent event) {
|
||||
|
||||
@@ -76,6 +76,13 @@ SubBruteState* subbrute_alloc() {
|
||||
view_dispatcher_add_view(
|
||||
instance->view_dispatcher, SubBruteViewWidget, widget_get_view(instance->widget));
|
||||
|
||||
// VarList
|
||||
instance->var_list = variable_item_list_alloc();
|
||||
view_dispatcher_add_view(
|
||||
instance->view_dispatcher,
|
||||
SubBruteViewVarList,
|
||||
variable_item_list_get_view(instance->var_list));
|
||||
|
||||
// Popup
|
||||
instance->popup = popup_alloc();
|
||||
view_dispatcher_add_view(
|
||||
@@ -145,6 +152,10 @@ void subbrute_free(SubBruteState* instance) {
|
||||
view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewWidget);
|
||||
widget_free(instance->widget);
|
||||
|
||||
// VarList
|
||||
view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewVarList);
|
||||
variable_item_list_free(instance->var_list);
|
||||
|
||||
// Popup
|
||||
view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewPopup);
|
||||
popup_free(instance->popup);
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include <lib/toolbox/stream/stream.h>
|
||||
#include <lib/flipper_format/flipper_format.h>
|
||||
#include <lib/flipper_format/flipper_format_i.h>
|
||||
#include <lib/subghz/protocols/protocol_items.h>
|
||||
#include <lib/subghz/subghz_protocol_registry.h>
|
||||
|
||||
#define TAG "SubBruteDevice"
|
||||
|
||||
|
||||
@@ -15,7 +15,9 @@
|
||||
#include <gui/modules/popup.h>
|
||||
#include <gui/modules/widget.h>
|
||||
#include <gui/modules/loading.h>
|
||||
#include <gui/modules/variable_item_list.h>
|
||||
|
||||
#include "subghz_bruteforcer_icons.h"
|
||||
#include <assets_icons.h>
|
||||
|
||||
#include <dialogs/dialogs.h>
|
||||
@@ -29,7 +31,7 @@
|
||||
#include "views/subbrute_attack_view.h"
|
||||
#include "views/subbrute_main_view.h"
|
||||
|
||||
#define SUBBRUTEFORCER_VER "Sub-GHz BruteForcer 3.6"
|
||||
#define SUBBRUTEFORCER_VER "Sub-GHz BruteForcer 3.7"
|
||||
|
||||
#ifdef FURI_DEBUG
|
||||
//#define SUBBRUTE_FAST_TRACK false
|
||||
@@ -44,6 +46,7 @@ typedef enum {
|
||||
SubBruteViewPopup,
|
||||
SubBruteViewWidget,
|
||||
SubBruteViewStack,
|
||||
SubBruteViewVarList,
|
||||
} SubBruteView;
|
||||
|
||||
struct SubBruteState {
|
||||
@@ -55,6 +58,7 @@ struct SubBruteState {
|
||||
TextInput* text_input;
|
||||
Popup* popup;
|
||||
Widget* widget;
|
||||
VariableItemList* var_list;
|
||||
DialogsApp* dialogs;
|
||||
const SubGhzDevice* radio_device;
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#include <gui/elements.h>
|
||||
#include <gui/icon.h>
|
||||
#include <gui/icon_animation.h>
|
||||
#include <assets_icons.h>
|
||||
#include <subghz_bruteforcer_icons.h>
|
||||
|
||||
#define TAG "SubBruteAttackView"
|
||||
|
||||
@@ -19,7 +19,7 @@ struct SubBruteAttackView {
|
||||
uint64_t max_value;
|
||||
uint64_t current_step;
|
||||
bool is_attacking;
|
||||
uint8_t extra_repeats;
|
||||
// uint8_t extra_repeats;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
@@ -226,7 +226,7 @@ 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;
|
||||
// instance->extra_repeats = extra_repeats;
|
||||
|
||||
with_view_model(
|
||||
instance->view,
|
||||
@@ -308,7 +308,7 @@ void subbrute_attack_view_draw(Canvas* canvas, void* context) {
|
||||
buffer,
|
||||
sizeof(buffer),
|
||||
"x%d",
|
||||
model->extra_repeats + subbrute_protocol_repeats_count(model->attack_type));
|
||||
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");
|
||||
@@ -335,7 +335,7 @@ void subbrute_attack_view_draw(Canvas* canvas, void* context) {
|
||||
buffer,
|
||||
sizeof(buffer),
|
||||
"x%d",
|
||||
model->extra_repeats + subbrute_protocol_repeats_count(model->attack_type));
|
||||
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");
|
||||
|
||||
|
||||
@@ -174,7 +174,11 @@ void subbrute_main_view_draw(Canvas* canvas, SubBruteMainViewModel* model) {
|
||||
subbrute_protocol_name(position));
|
||||
|
||||
if(model->extra_repeats > 0) {
|
||||
#ifdef FW_ORIGIN_Official
|
||||
canvas_set_font(canvas, FontSecondary);
|
||||
#else
|
||||
canvas_set_font(canvas, FontBatteryPercent);
|
||||
#endif
|
||||
char buffer[10];
|
||||
snprintf(
|
||||
buffer,
|
||||
|
||||
Reference in New Issue
Block a user