Connection go much brrr

This commit is contained in:
Willy-JL
2023-06-08 01:11:38 +01:00
parent 6517485d0d
commit 81f42afed0
4 changed files with 119 additions and 90 deletions
+11 -85
View File
@@ -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);
-5
View File
@@ -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