Update subbrute

This commit is contained in:
Willy-JL
2023-07-04 23:30:32 +02:00
parent 4556a5e47a
commit 02943dd1db
11 changed files with 124 additions and 11 deletions

View File

@@ -28,6 +28,7 @@ SubBruteWorker* subbrute_worker_alloc() {
instance->context = NULL; instance->context = NULL;
instance->callback = NULL; instance->callback = NULL;
instance->tx_timeout_ms = SUBBRUTE_TX_TIMEOUT;
instance->decoder_result = NULL; instance->decoder_result = NULL;
instance->transmitter = NULL; instance->transmitter = NULL;
instance->environment = subghz_environment_alloc(); instance->environment = subghz_environment_alloc();
@@ -206,6 +207,7 @@ void subbrute_worker_stop(SubBruteWorker* instance) {
furi_thread_join(instance->thread); furi_thread_join(instance->thread);
furi_hal_subghz_set_path(FuriHalSubGhzPathIsolate); furi_hal_subghz_set_path(FuriHalSubGhzPathIsolate);
furi_hal_subghz_idle();
furi_hal_subghz_sleep(); furi_hal_subghz_sleep();
} }
@@ -306,8 +308,9 @@ void subbrute_worker_set_callback(
} }
void subbrute_worker_subghz_transmit(SubBruteWorker* instance, FlipperFormat* flipper_format) { void subbrute_worker_subghz_transmit(SubBruteWorker* instance, FlipperFormat* flipper_format) {
const uint8_t timeout = instance->tx_timeout_ms;
while(instance->transmit_mode) { while(instance->transmit_mode) {
furi_delay_ms(SUBBRUTE_TX_TIMEOUT); furi_delay_ms(timeout);
} }
instance->transmit_mode = true; instance->transmit_mode = true;
if(instance->transmitter != NULL) { if(instance->transmitter != NULL) {
@@ -318,17 +321,20 @@ void subbrute_worker_subghz_transmit(SubBruteWorker* instance, FlipperFormat* fl
subghz_transmitter_alloc_init(instance->environment, instance->protocol_name); subghz_transmitter_alloc_init(instance->environment, instance->protocol_name);
subghz_transmitter_deserialize(instance->transmitter, flipper_format); subghz_transmitter_deserialize(instance->transmitter, flipper_format);
furi_hal_subghz_reset(); furi_hal_subghz_reset();
furi_hal_subghz_idle();
furi_hal_subghz_load_preset(instance->preset); furi_hal_subghz_load_preset(instance->preset);
furi_hal_subghz_set_frequency_and_path(instance->frequency); furi_hal_subghz_set_frequency_and_path(instance->frequency);
furi_hal_subghz_start_async_tx(subghz_transmitter_yield, instance->transmitter); furi_hal_subghz_start_async_tx(subghz_transmitter_yield, instance->transmitter);
while(!furi_hal_subghz_is_async_tx_complete()) { while(!furi_hal_subghz_is_async_tx_complete()) {
furi_delay_ms(SUBBRUTE_TX_TIMEOUT); furi_delay_ms(timeout);
} }
furi_hal_subghz_stop_async_tx(); furi_hal_subghz_stop_async_tx();
furi_hal_subghz_set_path(FuriHalSubGhzPathIsolate); //furi_hal_subghz_set_path(FuriHalSubGhzPathIsolate);
furi_hal_subghz_sleep(); furi_hal_subghz_idle();
//furi_hal_subghz_sleep();
subghz_transmitter_stop(instance->transmitter);
subghz_transmitter_free(instance->transmitter); subghz_transmitter_free(instance->transmitter);
instance->transmitter = NULL; instance->transmitter = NULL;
@@ -420,7 +426,7 @@ int32_t subbrute_worker_thread(void* context) {
instance->step++; instance->step++;
// furi_string_free(payload); // furi_string_free(payload);
furi_delay_ms(SUBBRUTE_TX_TIMEOUT); furi_delay_ms(instance->tx_timeout_ms);
} }
flipper_format_free(flipper_format); flipper_format_free(flipper_format);
@@ -435,3 +441,19 @@ int32_t subbrute_worker_thread(void* context) {
#endif #endif
return 0; return 0;
} }
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_timeout_dec(SubBruteWorker* instance) {
if(instance->tx_timeout_ms > 0) {
instance->tx_timeout_ms--;
}
}

View File

@@ -39,4 +39,10 @@ bool subbrute_worker_can_manual_transmit(SubBruteWorker* instance);
void subbrute_worker_set_callback( void subbrute_worker_set_callback(
SubBruteWorker* instance, SubBruteWorker* instance,
SubBruteWorkerCallback callback, SubBruteWorkerCallback callback,
void* context); void* context);
uint8_t subbrute_worker_get_timeout(SubBruteWorker* instance);
void subbrute_worker_timeout_inc(SubBruteWorker* instance);
void subbrute_worker_timeout_dec(SubBruteWorker* instance);

View File

@@ -21,6 +21,7 @@ struct SubBruteWorker {
SubGhzEnvironment* environment; SubGhzEnvironment* environment;
SubGhzTransmitter* transmitter; SubGhzTransmitter* transmitter;
const char* protocol_name; const char* protocol_name;
uint8_t tx_timeout_ms;
// Initiated values // Initiated values
SubBruteAttacks attack; // Attack state SubBruteAttacks attack; // Attack state

View File

@@ -4,4 +4,5 @@ ADD_SCENE(subbrute, run_attack, RunAttack)
ADD_SCENE(subbrute, save_name, SaveName) ADD_SCENE(subbrute, save_name, SaveName)
ADD_SCENE(subbrute, save_success, SaveSuccess) ADD_SCENE(subbrute, save_success, SaveSuccess)
ADD_SCENE(subbrute, setup_attack, SetupAttack) ADD_SCENE(subbrute, setup_attack, SetupAttack)
ADD_SCENE(subbrute, setup_extra, SetupExtra)
ADD_SCENE(subbrute, start, Start) ADD_SCENE(subbrute, start, Start)

View File

@@ -81,6 +81,8 @@ bool subbrute_scene_setup_attack_on_event(void* context, SceneManagerEvent event
false, false,
instance->device->extra_repeats); instance->device->extra_repeats);
scene_manager_next_scene(instance->scene_manager, SubBruteSceneSaveName); scene_manager_next_scene(instance->scene_manager, SubBruteSceneSaveName);
} else if(event.event == SubBruteCustomEventTypeExtraSettings) {
scene_manager_next_scene(instance->scene_manager, SubBruteSceneSetupExtra);
} else if(event.event == SubBruteCustomEventTypeBackPressed) { } else if(event.event == SubBruteCustomEventTypeBackPressed) {
subbrute_attack_view_init_values( subbrute_attack_view_init_values(
view, view,

View File

@@ -0,0 +1,66 @@
#include "../subbrute_i.h"
#include "subbrute_scene.h"
#define TAG "SubBruteSceneLoadFile"
void setup_extra_widget_callback(GuiButtonType result, InputType type, void* context);
static void setup_extra_widget_draw(void* context) {
furi_assert(context);
SubBruteState* instance = context;
Widget* widget = instance->widget;
widget_add_button_element(
widget, GuiButtonTypeLeft, "-TD", setup_extra_widget_callback, instance);
widget_add_button_element(
widget, GuiButtonTypeRight, "TD+", setup_extra_widget_callback, instance);
char str[20];
snprintf(&str[0], 20, "%d", 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]);
}
void setup_extra_widget_callback(GuiButtonType result, InputType type, void* context) {
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);
}
}
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);
}
void subbrute_scene_setup_extra_on_exit(void* context) {
furi_assert(context);
SubBruteState* instance = context;
widget_reset(instance->widget);
}
bool subbrute_scene_setup_extra_on_event(void* context, SceneManagerEvent event) {
UNUSED(context);
UNUSED(event);
return false;
}

View File

@@ -94,12 +94,18 @@ SubBruteState* subbrute_alloc() {
//instance->flipper_format = flipper_format_string_alloc(); //instance->flipper_format = flipper_format_string_alloc();
//instance->environment = subghz_environment_alloc(); //instance->environment = subghz_environment_alloc();
// Uncomment to enable Debug pin output on PIN 17(1W)
//furi_hal_subghz_set_async_mirror_pin(&gpio_ibutton);
return instance; return instance;
} }
void subbrute_free(SubBruteState* instance) { void subbrute_free(SubBruteState* instance) {
furi_assert(instance); furi_assert(instance);
// Uncomment to enable Debug pin output on PIN 17(1W)
//furi_hal_subghz_set_async_mirror_pin(NULL);
// SubBruteWorker // SubBruteWorker
subbrute_worker_stop(instance->worker); subbrute_worker_stop(instance->worker);
subbrute_worker_free(instance->worker); subbrute_worker_free(instance->worker);

View File

@@ -12,6 +12,7 @@ typedef enum {
SubBruteCustomEventTypeTransmitNotStarted, SubBruteCustomEventTypeTransmitNotStarted,
SubBruteCustomEventTypeTransmitCustom, SubBruteCustomEventTypeTransmitCustom,
SubBruteCustomEventTypeSaveFile, SubBruteCustomEventTypeSaveFile,
SubBruteCustomEventTypeExtraSettings,
SubBruteCustomEventTypeUpdateView, SubBruteCustomEventTypeUpdateView,
SubBruteCustomEventTypeChangeStepUp, SubBruteCustomEventTypeChangeStepUp,
SubBruteCustomEventTypeChangeStepDown, SubBruteCustomEventTypeChangeStepDown,

View File

@@ -29,7 +29,7 @@
#include "views/subbrute_attack_view.h" #include "views/subbrute_attack_view.h"
#include "views/subbrute_main_view.h" #include "views/subbrute_main_view.h"
#define SUBBRUTEFORCER_VER "Sub-GHz BruteForcer 3.5" #define SUBBRUTEFORCER_VER "Sub-GHz BruteForcer 3.6"
#ifdef FURI_DEBUG #ifdef FURI_DEBUG
//#define SUBBRUTE_FAST_TRACK false //#define SUBBRUTE_FAST_TRACK false

View File

@@ -72,9 +72,12 @@ bool subbrute_attack_view_input(InputEvent* event, void* context) {
instance->is_attacking = true; instance->is_attacking = true;
instance->callback(SubBruteCustomEventTypeTransmitStarted, instance->context); instance->callback(SubBruteCustomEventTypeTransmitStarted, instance->context);
update = true; update = true;
} else if(event->key == InputKeyUp) { } else if(event->key == InputKeyUp && event->type == InputTypeShort) {
instance->callback(SubBruteCustomEventTypeSaveFile, instance->context); instance->callback(SubBruteCustomEventTypeSaveFile, instance->context);
update = true; update = true;
} else if(event->key == InputKeyUp && event->type == InputTypeLong) {
instance->callback(SubBruteCustomEventTypeExtraSettings, instance->context);
update = true;
} else if(event->key == InputKeyDown) { } else if(event->key == InputKeyDown) {
instance->callback(SubBruteCustomEventTypeTransmitCustom, instance->context); instance->callback(SubBruteCustomEventTypeTransmitCustom, instance->context);
update = true; update = true;

View File

@@ -167,7 +167,7 @@ void subbrute_main_view_draw(Canvas* canvas, SubBruteMainViewModel* model) {
if(model->index == position) { if(model->index == position) {
canvas_draw_str_aligned( canvas_draw_str_aligned(
canvas, canvas,
4, 3,
9 + (item_position * item_height) + STATUS_BAR_Y_SHIFT, 9 + (item_position * item_height) + STATUS_BAR_Y_SHIFT,
AlignLeft, AlignLeft,
AlignCenter, AlignCenter,
@@ -181,9 +181,14 @@ void subbrute_main_view_draw(Canvas* canvas, SubBruteMainViewModel* model) {
sizeof(buffer), sizeof(buffer),
"x%d", "x%d",
model->extra_repeats + subbrute_protocol_repeats_count(model->index)); model->extra_repeats + subbrute_protocol_repeats_count(model->index));
uint8_t temp_x_offset_repeats = 18;
if(model->extra_repeats + subbrute_protocol_repeats_count(model->index) <
10) {
temp_x_offset_repeats = 15;
}
canvas_draw_str_aligned( canvas_draw_str_aligned(
canvas, canvas,
screen_width - 15, screen_width - temp_x_offset_repeats,
9 + (item_position * item_height) + STATUS_BAR_Y_SHIFT, 9 + (item_position * item_height) + STATUS_BAR_Y_SHIFT,
AlignLeft, AlignLeft,
AlignCenter, AlignCenter,
@@ -232,7 +237,7 @@ bool subbrute_main_view_input(InputEvent* event, void* context) {
#endif #endif
const uint8_t min_value = 0; const uint8_t min_value = 0;
const uint8_t correct_total = SubBruteAttackTotalCount - 1; const uint8_t correct_total = SubBruteAttackTotalCount - 1;
uint8_t max_repeats = 9 - subbrute_protocol_repeats_count(instance->index); uint8_t max_repeats = 14 - subbrute_protocol_repeats_count(instance->index);
bool updated = false; bool updated = false;
bool consumed = false; bool consumed = false;