mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-06-07 19:01:54 -07:00
Connection go much brrr
This commit is contained in:
@@ -125,74 +125,6 @@ void bad_kb_config_switch_remember_mode(BadKbApp* app) {
|
||||
bad_kb_reload_worker(app);
|
||||
}
|
||||
|
||||
int32_t bad_kb_connection_init(BadKbApp* app) {
|
||||
app->prev_config.usb_mode = furi_hal_usb_get_config();
|
||||
furi_hal_usb_set_config(NULL, NULL);
|
||||
|
||||
strcpy(
|
||||
app->prev_config.bt_name, furi_hal_bt_get_profile_adv_name(FuriHalBtProfileHidKeyboard));
|
||||
memcpy(
|
||||
app->prev_config.bt_mac,
|
||||
furi_hal_bt_get_profile_mac_addr(FuriHalBtProfileHidKeyboard),
|
||||
BAD_KB_MAC_ADDRESS_LEN);
|
||||
app->prev_config.bt_mode = furi_hal_bt_get_profile_pairing_method(FuriHalBtProfileHidKeyboard);
|
||||
|
||||
bt_timeout = bt_hid_delays[LevelRssi39_0];
|
||||
bt_disconnect(app->bt);
|
||||
bt_keys_storage_set_storage_path(app->bt, BAD_KB_KEYS_PATH);
|
||||
if(strcmp(app->config.bt_name, "") != 0) {
|
||||
furi_hal_bt_set_profile_adv_name(FuriHalBtProfileHidKeyboard, app->config.bt_name);
|
||||
}
|
||||
if(app->bt_remember) {
|
||||
furi_hal_bt_set_profile_mac_addr(
|
||||
FuriHalBtProfileHidKeyboard, (uint8_t*)&BAD_KB_BOUND_MAC_ADDRESS);
|
||||
furi_hal_bt_set_profile_pairing_method(
|
||||
FuriHalBtProfileHidKeyboard, GapPairingPinCodeVerifyYesNo);
|
||||
} else {
|
||||
if(memcmp(
|
||||
app->config.bt_mac, (uint8_t*)&BAD_KB_EMPTY_MAC_ADDRESS, BAD_KB_MAC_ADDRESS_LEN) !=
|
||||
0) {
|
||||
furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, app->config.bt_mac);
|
||||
}
|
||||
furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, GapPairingNone);
|
||||
}
|
||||
bt_set_profile(app->bt, BtProfileHidKeyboard);
|
||||
if(strcmp(app->config.bt_name, "") == 0) {
|
||||
strcpy(app->config.bt_name, furi_hal_bt_get_profile_adv_name(FuriHalBtProfileHidKeyboard));
|
||||
}
|
||||
if(memcmp(app->config.bt_mac, (uint8_t*)&BAD_KB_EMPTY_MAC_ADDRESS, BAD_KB_MAC_ADDRESS_LEN) ==
|
||||
0) {
|
||||
memcpy(
|
||||
app->config.bt_mac,
|
||||
furi_hal_bt_get_profile_mac_addr(FuriHalBtProfileHidKeyboard),
|
||||
BAD_KB_MAC_ADDRESS_LEN);
|
||||
}
|
||||
if(app->is_bt) {
|
||||
furi_hal_bt_start_advertising();
|
||||
if(app->bt_remember) {
|
||||
bt_enable_peer_key_update(app->bt);
|
||||
} else {
|
||||
bt_disable_peer_key_update(app->bt);
|
||||
}
|
||||
} else {
|
||||
furi_hal_bt_stop_advertising();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void bad_kb_connection_deinit(BadKbApp* app) {
|
||||
furi_hal_usb_set_config(app->prev_config.usb_mode, NULL);
|
||||
|
||||
bt_disconnect(app->bt);
|
||||
bt_keys_storage_set_default_path(app->bt);
|
||||
furi_hal_bt_set_profile_adv_name(FuriHalBtProfileHidKeyboard, app->prev_config.bt_name);
|
||||
furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, app->prev_config.bt_mac);
|
||||
furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, app->prev_config.bt_mode);
|
||||
bt_set_profile(app->bt, BtProfileSerial);
|
||||
bt_enable_peer_key_update(app->bt);
|
||||
}
|
||||
|
||||
BadKbApp* bad_kb_app_alloc(char* arg) {
|
||||
BadKbApp* app = malloc(sizeof(BadKbApp));
|
||||
|
||||
@@ -258,23 +190,17 @@ BadKbApp* bad_kb_app_alloc(char* arg) {
|
||||
|
||||
view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);
|
||||
|
||||
if(furi_hal_usb_is_locked()) {
|
||||
app->error = BadKbAppErrorCloseRpc;
|
||||
app->conn_init_thread = NULL;
|
||||
scene_manager_next_scene(app->scene_manager, BadKbSceneError);
|
||||
app->conn_mode = BadKbConnModeNone;
|
||||
app->conn_init_thread =
|
||||
furi_thread_alloc_ex("BadKbConnInit", 1024, (FuriThreadCallback)bad_kb_conn_refresh, app);
|
||||
furi_thread_start(app->conn_init_thread);
|
||||
if(!furi_string_empty(app->file_path)) {
|
||||
app->bad_kb_script = bad_kb_script_open(app->file_path, app->is_bt ? app->bt : NULL, app);
|
||||
bad_kb_script_set_keyboard_layout(app->bad_kb_script, app->keyboard_layout);
|
||||
scene_manager_next_scene(app->scene_manager, BadKbSceneWork);
|
||||
} else {
|
||||
app->conn_init_thread = furi_thread_alloc_ex(
|
||||
"BadKbConnInit", 1024, (FuriThreadCallback)bad_kb_connection_init, app);
|
||||
furi_thread_start(app->conn_init_thread);
|
||||
if(!furi_string_empty(app->file_path)) {
|
||||
app->bad_kb_script =
|
||||
bad_kb_script_open(app->file_path, app->is_bt ? app->bt : NULL, app);
|
||||
bad_kb_script_set_keyboard_layout(app->bad_kb_script, app->keyboard_layout);
|
||||
scene_manager_next_scene(app->scene_manager, BadKbSceneWork);
|
||||
} else {
|
||||
furi_string_set(app->file_path, BAD_KB_APP_BASE_FOLDER);
|
||||
scene_manager_next_scene(app->scene_manager, BadKbSceneFileSelect);
|
||||
}
|
||||
furi_string_set(app->file_path, BAD_KB_APP_BASE_FOLDER);
|
||||
scene_manager_next_scene(app->scene_manager, BadKbSceneFileSelect);
|
||||
}
|
||||
|
||||
return app;
|
||||
@@ -317,8 +243,8 @@ void bad_kb_app_free(BadKbApp* app) {
|
||||
if(app->conn_init_thread) {
|
||||
furi_thread_join(app->conn_init_thread);
|
||||
furi_thread_free(app->conn_init_thread);
|
||||
bad_kb_connection_deinit(app);
|
||||
}
|
||||
bad_kb_conn_reset(app);
|
||||
|
||||
// Close records
|
||||
furi_record_close(RECORD_GUI);
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include "bad_kb_app.h"
|
||||
#include "bad_kb_paths.h"
|
||||
#include "scenes/bad_kb_scene.h"
|
||||
#include "helpers/ducky_script.h"
|
||||
|
||||
@@ -29,7 +28,3 @@ typedef enum {
|
||||
} BadKbAppView;
|
||||
|
||||
void bad_kb_config_switch_remember_mode(BadKbApp* app);
|
||||
|
||||
int32_t bad_kb_connection_init(BadKbApp* app);
|
||||
|
||||
void bad_kb_connection_deinit(BadKbApp* app);
|
||||
|
||||
@@ -566,6 +566,93 @@ static uint32_t bad_kb_flags_get(uint32_t flags_mask, uint32_t timeout) {
|
||||
return flags;
|
||||
}
|
||||
|
||||
int32_t bad_kb_conn_refresh(BadKbApp* app) {
|
||||
bool bt = app->is_bt;
|
||||
|
||||
if(app->conn_mode != BadKbConnModeNone) bad_kb_conn_reset(app);
|
||||
|
||||
if(bt) {
|
||||
strcpy(
|
||||
app->prev_config.bt_name,
|
||||
furi_hal_bt_get_profile_adv_name(FuriHalBtProfileHidKeyboard));
|
||||
memcpy(
|
||||
app->prev_config.bt_mac,
|
||||
furi_hal_bt_get_profile_mac_addr(FuriHalBtProfileHidKeyboard),
|
||||
BAD_KB_MAC_ADDRESS_LEN);
|
||||
app->prev_config.bt_mode =
|
||||
furi_hal_bt_get_profile_pairing_method(FuriHalBtProfileHidKeyboard);
|
||||
bt_timeout = bt_hid_delays[LevelRssi39_0];
|
||||
bt_disconnect(app->bt);
|
||||
bt_keys_storage_set_storage_path(app->bt, BAD_KB_KEYS_PATH);
|
||||
if(strcmp(app->config.bt_name, "") != 0) {
|
||||
furi_hal_bt_set_profile_adv_name(FuriHalBtProfileHidKeyboard, app->config.bt_name);
|
||||
}
|
||||
if(app->bt_remember) {
|
||||
furi_hal_bt_set_profile_mac_addr(
|
||||
FuriHalBtProfileHidKeyboard, (uint8_t*)&BAD_KB_BOUND_MAC_ADDRESS);
|
||||
furi_hal_bt_set_profile_pairing_method(
|
||||
FuriHalBtProfileHidKeyboard, GapPairingPinCodeVerifyYesNo);
|
||||
} else {
|
||||
if(memcmp(
|
||||
app->config.bt_mac,
|
||||
(uint8_t*)&BAD_KB_EMPTY_MAC_ADDRESS,
|
||||
BAD_KB_MAC_ADDRESS_LEN) != 0) {
|
||||
furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, app->config.bt_mac);
|
||||
}
|
||||
furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, GapPairingNone);
|
||||
}
|
||||
furi_check(bt_set_profile(app->bt, BtProfileHidKeyboard));
|
||||
if(strcmp(app->config.bt_name, "") == 0) {
|
||||
strcpy(
|
||||
app->config.bt_name,
|
||||
furi_hal_bt_get_profile_adv_name(FuriHalBtProfileHidKeyboard));
|
||||
}
|
||||
if(memcmp(
|
||||
app->config.bt_mac, (uint8_t*)&BAD_KB_EMPTY_MAC_ADDRESS, BAD_KB_MAC_ADDRESS_LEN) ==
|
||||
0) {
|
||||
memcpy(
|
||||
app->config.bt_mac,
|
||||
furi_hal_bt_get_profile_mac_addr(FuriHalBtProfileHidKeyboard),
|
||||
BAD_KB_MAC_ADDRESS_LEN);
|
||||
}
|
||||
if(app->bt_remember) {
|
||||
bt_enable_peer_key_update(app->bt);
|
||||
} else {
|
||||
bt_disable_peer_key_update(app->bt);
|
||||
}
|
||||
furi_hal_bt_start_advertising();
|
||||
|
||||
app->conn_mode = BadKbConnModeBt;
|
||||
|
||||
} else {
|
||||
app->prev_config.usb_mode = furi_hal_usb_get_config();
|
||||
furi_hal_usb_unlock();
|
||||
furi_check(furi_hal_usb_set_config(NULL, NULL));
|
||||
|
||||
app->conn_mode = BadKbConnModeUsb;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void bad_kb_conn_reset(BadKbApp* app) {
|
||||
if(app->conn_mode == BadKbConnModeBt) {
|
||||
bt_disconnect(app->bt);
|
||||
bt_keys_storage_set_default_path(app->bt);
|
||||
furi_hal_bt_set_profile_adv_name(FuriHalBtProfileHidKeyboard, app->prev_config.bt_name);
|
||||
furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, app->prev_config.bt_mac);
|
||||
furi_hal_bt_set_profile_pairing_method(
|
||||
FuriHalBtProfileHidKeyboard, app->prev_config.bt_mode);
|
||||
furi_check(bt_set_profile(app->bt, BtProfileSerial));
|
||||
bt_enable_peer_key_update(app->bt);
|
||||
|
||||
} else if(app->conn_mode == BadKbConnModeUsb) {
|
||||
furi_check(furi_hal_usb_set_config(app->prev_config.usb_mode, NULL));
|
||||
}
|
||||
|
||||
app->conn_mode = BadKbConnModeNone;
|
||||
}
|
||||
|
||||
static int32_t bad_kb_worker(void* context) {
|
||||
BadKbScript* bad_kb = context;
|
||||
|
||||
@@ -579,9 +666,17 @@ static int32_t bad_kb_worker(void* context) {
|
||||
bad_kb->line_prev = furi_string_alloc();
|
||||
bad_kb->string_print = furi_string_alloc();
|
||||
|
||||
if(bad_kb->app->conn_init_thread) {
|
||||
furi_thread_join(bad_kb->app->conn_init_thread);
|
||||
furi_thread_free(bad_kb->app->conn_init_thread);
|
||||
bad_kb->app->conn_init_thread = NULL;
|
||||
}
|
||||
|
||||
if(bad_kb->bt) {
|
||||
if(bad_kb->app->conn_mode != BadKbConnModeBt) bad_kb_conn_refresh(bad_kb->app);
|
||||
bt_set_status_changed_callback(bad_kb->bt, bad_kb_bt_hid_state_callback, bad_kb);
|
||||
} else {
|
||||
if(bad_kb->app->conn_mode != BadKbConnModeUsb) bad_kb_conn_refresh(bad_kb->app);
|
||||
furi_hal_hid_set_state_callback(bad_kb_usb_hid_state_callback, bad_kb);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ extern "C" {
|
||||
#include <gui/modules/text_input.h>
|
||||
#include <gui/modules/byte_input.h>
|
||||
#include "../views/bad_kb_view.h"
|
||||
#include "../bad_kb_paths.h"
|
||||
|
||||
#define FILE_BUFFER_LEN 16
|
||||
|
||||
@@ -127,6 +128,12 @@ typedef struct {
|
||||
GapPairing bt_mode;
|
||||
} BadKbConfig;
|
||||
|
||||
typedef enum {
|
||||
BadKbConnModeNone,
|
||||
BadKbConnModeUsb,
|
||||
BadKbConnModeBt,
|
||||
} BadKbConnMode;
|
||||
|
||||
struct BadKbApp {
|
||||
Gui* gui;
|
||||
ViewDispatcher* view_dispatcher;
|
||||
@@ -149,6 +156,8 @@ struct BadKbApp {
|
||||
bool bt_remember;
|
||||
BadKbConfig config;
|
||||
BadKbConfig prev_config;
|
||||
|
||||
BadKbConnMode conn_mode;
|
||||
FuriThread* conn_init_thread;
|
||||
FuriThread* switch_mode_thread;
|
||||
};
|
||||
@@ -157,6 +166,10 @@ int32_t bad_kb_config_switch_mode(BadKbApp* app);
|
||||
|
||||
void bad_kb_config_refresh_menu(BadKbApp* app);
|
||||
|
||||
int32_t bad_kb_conn_refresh(BadKbApp* app);
|
||||
|
||||
void bad_kb_conn_reset(BadKbApp* app);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user