mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-12 10:48:35 -07:00
Update subbrute
This commit is contained in:
@@ -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--;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -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,
|
||||||
|
|||||||
66
applications/external/subghz_bruteforcer/scenes/subbrute_scene_setup_extra.c
vendored
Normal file
66
applications/external/subghz_bruteforcer/scenes/subbrute_scene_setup_extra.c
vendored
Normal 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;
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ typedef enum {
|
|||||||
SubBruteCustomEventTypeTransmitNotStarted,
|
SubBruteCustomEventTypeTransmitNotStarted,
|
||||||
SubBruteCustomEventTypeTransmitCustom,
|
SubBruteCustomEventTypeTransmitCustom,
|
||||||
SubBruteCustomEventTypeSaveFile,
|
SubBruteCustomEventTypeSaveFile,
|
||||||
|
SubBruteCustomEventTypeExtraSettings,
|
||||||
SubBruteCustomEventTypeUpdateView,
|
SubBruteCustomEventTypeUpdateView,
|
||||||
SubBruteCustomEventTypeChangeStepUp,
|
SubBruteCustomEventTypeChangeStepUp,
|
||||||
SubBruteCustomEventTypeChangeStepDown,
|
SubBruteCustomEventTypeChangeStepDown,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user