mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-11 06:09:08 -07:00
Update subbrute
This commit is contained in:
@@ -28,6 +28,7 @@ SubBruteWorker* subbrute_worker_alloc() {
|
||||
instance->context = NULL;
|
||||
instance->callback = NULL;
|
||||
|
||||
instance->tx_timeout_ms = SUBBRUTE_TX_TIMEOUT;
|
||||
instance->decoder_result = NULL;
|
||||
instance->transmitter = NULL;
|
||||
instance->environment = subghz_environment_alloc();
|
||||
@@ -206,6 +207,7 @@ void subbrute_worker_stop(SubBruteWorker* instance) {
|
||||
furi_thread_join(instance->thread);
|
||||
|
||||
furi_hal_subghz_set_path(FuriHalSubGhzPathIsolate);
|
||||
furi_hal_subghz_idle();
|
||||
furi_hal_subghz_sleep();
|
||||
}
|
||||
|
||||
@@ -306,8 +308,9 @@ void subbrute_worker_set_callback(
|
||||
}
|
||||
|
||||
void subbrute_worker_subghz_transmit(SubBruteWorker* instance, FlipperFormat* flipper_format) {
|
||||
const uint8_t timeout = instance->tx_timeout_ms;
|
||||
while(instance->transmit_mode) {
|
||||
furi_delay_ms(SUBBRUTE_TX_TIMEOUT);
|
||||
furi_delay_ms(timeout);
|
||||
}
|
||||
instance->transmit_mode = true;
|
||||
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_deserialize(instance->transmitter, flipper_format);
|
||||
furi_hal_subghz_reset();
|
||||
furi_hal_subghz_idle();
|
||||
furi_hal_subghz_load_preset(instance->preset);
|
||||
furi_hal_subghz_set_frequency_and_path(instance->frequency);
|
||||
furi_hal_subghz_start_async_tx(subghz_transmitter_yield, instance->transmitter);
|
||||
|
||||
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_set_path(FuriHalSubGhzPathIsolate);
|
||||
furi_hal_subghz_sleep();
|
||||
//furi_hal_subghz_set_path(FuriHalSubGhzPathIsolate);
|
||||
furi_hal_subghz_idle();
|
||||
//furi_hal_subghz_sleep();
|
||||
subghz_transmitter_stop(instance->transmitter);
|
||||
subghz_transmitter_free(instance->transmitter);
|
||||
instance->transmitter = NULL;
|
||||
|
||||
@@ -420,7 +426,7 @@ int32_t subbrute_worker_thread(void* context) {
|
||||
instance->step++;
|
||||
|
||||
// furi_string_free(payload);
|
||||
furi_delay_ms(SUBBRUTE_TX_TIMEOUT);
|
||||
furi_delay_ms(instance->tx_timeout_ms);
|
||||
}
|
||||
|
||||
flipper_format_free(flipper_format);
|
||||
@@ -435,3 +441,19 @@ int32_t subbrute_worker_thread(void* context) {
|
||||
#endif
|
||||
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(
|
||||
SubBruteWorker* instance,
|
||||
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;
|
||||
SubGhzTransmitter* transmitter;
|
||||
const char* protocol_name;
|
||||
uint8_t tx_timeout_ms;
|
||||
|
||||
// Initiated values
|
||||
SubBruteAttacks attack; // Attack state
|
||||
|
||||
@@ -4,4 +4,5 @@ ADD_SCENE(subbrute, run_attack, RunAttack)
|
||||
ADD_SCENE(subbrute, save_name, SaveName)
|
||||
ADD_SCENE(subbrute, save_success, SaveSuccess)
|
||||
ADD_SCENE(subbrute, setup_attack, SetupAttack)
|
||||
ADD_SCENE(subbrute, setup_extra, SetupExtra)
|
||||
ADD_SCENE(subbrute, start, Start)
|
||||
@@ -81,6 +81,8 @@ bool subbrute_scene_setup_attack_on_event(void* context, SceneManagerEvent event
|
||||
false,
|
||||
instance->device->extra_repeats);
|
||||
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) {
|
||||
subbrute_attack_view_init_values(
|
||||
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->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;
|
||||
}
|
||||
|
||||
void subbrute_free(SubBruteState* instance) {
|
||||
furi_assert(instance);
|
||||
|
||||
// Uncomment to enable Debug pin output on PIN 17(1W)
|
||||
//furi_hal_subghz_set_async_mirror_pin(NULL);
|
||||
|
||||
// SubBruteWorker
|
||||
subbrute_worker_stop(instance->worker);
|
||||
subbrute_worker_free(instance->worker);
|
||||
|
||||
@@ -12,6 +12,7 @@ typedef enum {
|
||||
SubBruteCustomEventTypeTransmitNotStarted,
|
||||
SubBruteCustomEventTypeTransmitCustom,
|
||||
SubBruteCustomEventTypeSaveFile,
|
||||
SubBruteCustomEventTypeExtraSettings,
|
||||
SubBruteCustomEventTypeUpdateView,
|
||||
SubBruteCustomEventTypeChangeStepUp,
|
||||
SubBruteCustomEventTypeChangeStepDown,
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
#include "views/subbrute_attack_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
|
||||
//#define SUBBRUTE_FAST_TRACK false
|
||||
|
||||
@@ -72,9 +72,12 @@ bool subbrute_attack_view_input(InputEvent* event, void* context) {
|
||||
instance->is_attacking = true;
|
||||
instance->callback(SubBruteCustomEventTypeTransmitStarted, instance->context);
|
||||
update = true;
|
||||
} else if(event->key == InputKeyUp) {
|
||||
} else if(event->key == InputKeyUp && event->type == InputTypeShort) {
|
||||
instance->callback(SubBruteCustomEventTypeSaveFile, instance->context);
|
||||
update = true;
|
||||
} else if(event->key == InputKeyUp && event->type == InputTypeLong) {
|
||||
instance->callback(SubBruteCustomEventTypeExtraSettings, instance->context);
|
||||
update = true;
|
||||
} else if(event->key == InputKeyDown) {
|
||||
instance->callback(SubBruteCustomEventTypeTransmitCustom, instance->context);
|
||||
update = true;
|
||||
|
||||
@@ -167,7 +167,7 @@ void subbrute_main_view_draw(Canvas* canvas, SubBruteMainViewModel* model) {
|
||||
if(model->index == position) {
|
||||
canvas_draw_str_aligned(
|
||||
canvas,
|
||||
4,
|
||||
3,
|
||||
9 + (item_position * item_height) + STATUS_BAR_Y_SHIFT,
|
||||
AlignLeft,
|
||||
AlignCenter,
|
||||
@@ -181,9 +181,14 @@ void subbrute_main_view_draw(Canvas* canvas, SubBruteMainViewModel* model) {
|
||||
sizeof(buffer),
|
||||
"x%d",
|
||||
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,
|
||||
screen_width - 15,
|
||||
screen_width - temp_x_offset_repeats,
|
||||
9 + (item_position * item_height) + STATUS_BAR_Y_SHIFT,
|
||||
AlignLeft,
|
||||
AlignCenter,
|
||||
@@ -232,7 +237,7 @@ bool subbrute_main_view_input(InputEvent* event, void* context) {
|
||||
#endif
|
||||
const uint8_t min_value = 0;
|
||||
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 consumed = false;
|
||||
|
||||
Reference in New Issue
Block a user