From 637918f0acad1ef3e248d6ade06de2e4eeb0e929 Mon Sep 17 00:00:00 2001 From: yocvito Date: Wed, 15 Feb 2023 14:27:23 +0100 Subject: [PATCH 01/24] Reverse MAC address in DEBUG logs --- firmware/targets/f7/ble_glue/gap.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/firmware/targets/f7/ble_glue/gap.c b/firmware/targets/f7/ble_glue/gap.c index 83944b4b5..0a317b574 100644 --- a/firmware/targets/f7/ble_glue/gap.c +++ b/firmware/targets/f7/ble_glue/gap.c @@ -515,16 +515,16 @@ bool gap_init(GapConfig* config, GapEventCallback on_event_cb, void* context) { gap->advertise_timer = furi_timer_alloc(gap_advetise_timer_callback, FuriTimerTypeOnce, NULL); // Initialization of GATT & GAP layer gap->service.adv_name = config->adv_name; - FURI_LOG_I(TAG, "Advertising name: %s", &(gap->service.adv_name[1])); - FURI_LOG_I( + FURI_LOG_D(TAG, "Advertising name: %s", &(gap->service.adv_name[1])); + FURI_LOG_D( TAG, "MAC @ : %02X:%02X:%02X:%02X:%02X:%02X", - config->mac_address[0], - config->mac_address[1], - config->mac_address[2], - config->mac_address[3], + config->mac_address[5], config->mac_address[4], - config->mac_address[5]); + config->mac_address[3], + config->mac_address[2], + config->mac_address[1], + config->mac_address[0]); gap_init_svc(gap); // Initialization of the BLE Services SVCCTL_Init(); From bde3aa589b0b6a0064a967d9026c540255b62fd6 Mon Sep 17 00:00:00 2001 From: yocvito Date: Wed, 15 Feb 2023 14:29:29 +0100 Subject: [PATCH 02/24] Fix: Flipper serial bt profile shown as 'Unknown' in bt settings + flipper app --- applications/main/bad_kb/bad_kb_app.c | 4 ++-- firmware/targets/f7/furi_hal/furi_hal_bt.c | 26 +++++++++++++++++----- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/applications/main/bad_kb/bad_kb_app.c b/applications/main/bad_kb/bad_kb_app.c index dfce5acbf..d67aa94cd 100644 --- a/applications/main/bad_kb/bad_kb_app.c +++ b/applications/main/bad_kb/bad_kb_app.c @@ -99,11 +99,11 @@ BadKbApp* bad_kb_app_alloc(char* arg) { Bt* bt = furi_record_open(RECORD_BT); app->bt = bt; app->is_bt = XTREME_SETTINGS()->bad_bt; - const char* adv_name = bt_get_profile_adv_name(bt); + const char* adv_name = furi_hal_bt_get_profile_adv_name(FuriHalBtProfileHidKeyboard); memcpy(app->name, adv_name, BAD_KB_ADV_NAME_MAX_LEN); memcpy(app->bt_old_config.name, adv_name, BAD_KB_ADV_NAME_MAX_LEN); - const uint8_t* mac_addr = bt_get_profile_mac_address(bt); + const uint8_t* mac_addr = furi_hal_bt_get_profile_mac_addr(FuriHalBtProfileHidKeyboard); memcpy(app->mac, mac_addr, BAD_KB_MAC_ADDRESS_LEN); memcpy(app->bt_old_config.mac, mac_addr, BAD_KB_MAC_ADDRESS_LEN); diff --git a/firmware/targets/f7/furi_hal/furi_hal_bt.c b/firmware/targets/f7/furi_hal/furi_hal_bt.c index 79fbc693f..20c4b25ee 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_bt.c +++ b/firmware/targets/f7/furi_hal/furi_hal_bt.c @@ -207,6 +207,12 @@ bool furi_hal_bt_start_app(FuriHalBtProfile profile, GapEventCallback event_cb, profile_config[profile].config.mac_address, furi_hal_version_get_ble_mac(), sizeof(profile_config[profile].config.mac_address)); + // Set advertise name + strlcpy( + profile_config[profile].config.adv_name, + furi_hal_version_get_ble_local_device_name_ptr(), + FURI_HAL_VERSION_DEVICE_NAME_LENGTH); + config->adv_service_uuid |= furi_hal_version_get_hw_color(); } else if(profile == FuriHalBtProfileHidKeyboard) { // Change MAC address for HID profile @@ -216,8 +222,9 @@ bool furi_hal_bt_start_app(FuriHalBtProfile profile, GapEventCallback event_cb, } // Change name Flipper -> Control if(strlen(&config->adv_name[1]) == 0) { - const char* clicker_str = "Control"; + const char* clicker_str = "Control "; memcpy(&config->adv_name[1], clicker_str, strlen(clicker_str)); + strlcat(&config->adv_name[1], furi_hal_version_get_ble_local_device_name_ptr(), FURI_HAL_VERSION_DEVICE_NAME_LENGTH); } } if(!gap_init(config, event_cb, context)) { @@ -468,11 +475,18 @@ void furi_hal_bt_set_profile_adv_name( furi_assert(profile < FuriHalBtProfileNumber); furi_assert(name); - profile_config[profile].config.adv_name[0] = 0x09; - memcpy( - &(profile_config[profile].config.adv_name[1]), - name, - FURI_HAL_VERSION_DEVICE_NAME_LENGTH - 1); + if (strlen(name) == 0) { + memset( + &(profile_config[profile].config.adv_name[1]), + 0, + strlen(&(profile_config[profile].config.adv_name[1]))); + } else { + profile_config[profile].config.adv_name[0] = AD_TYPE_COMPLETE_LOCAL_NAME; + memcpy( + &(profile_config[profile].config.adv_name[1]), + name, + FURI_HAL_VERSION_DEVICE_NAME_LENGTH - 1); + } } const char* furi_hal_bt_get_profile_adv_name(FuriHalBtProfile profile) { From d704c749c5f3ab10458c112a78692705cb19cb89 Mon Sep 17 00:00:00 2001 From: yocvito Date: Sat, 18 Feb 2023 16:10:59 +0100 Subject: [PATCH 03/24] restore mac address original layout at scene exit when mac addr was not modified in bad kb bt mac config scene --- applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c index 4463d1c40..b330ef9f1 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c @@ -29,7 +29,7 @@ void bad_kb_scene_config_mac_on_enter(void* context) { bad_kb_scene_config_mac_byte_input_callback, NULL, bad_kb, - reverse_mac_addr(bad_kb->mac), + reverse_mac_addr(bad_kb->mac), GAP_MAC_ADDR_SIZE); view_dispatcher_switch_to_view(bad_kb->view_dispatcher, BadKbAppViewConfigMac); } @@ -54,4 +54,7 @@ void bad_kb_scene_config_mac_on_exit(void* context) { // Clear view byte_input_set_result_callback(bad_kb->byte_input, NULL, NULL, NULL, NULL, 0); byte_input_set_header_text(bad_kb->byte_input, ""); + + // reverse back addr (in case it didn't get modified) + reverse_mac_addr(bad_kb->mac); } From 6612597c83e71412dbb27fb704cbf26e6a82c2af Mon Sep 17 00:00:00 2001 From: yocvito Date: Sun, 19 Feb 2023 00:58:23 +0100 Subject: [PATCH 04/24] really fix mac layout reversed on bt mac config scene (previous fix was just moving the issue lol) --- .../main/bad_kb/scenes/bad_kb_scene_config_mac.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c index b330ef9f1..2b71ec91b 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c @@ -2,14 +2,14 @@ #define TAG "BadKbConfigMac" -static uint8_t* reverse_mac_addr(uint8_t* mac) { +static uint8_t* reverse_mac_addr(uint8_t* mac, uint8_t *out) { uint8_t tmp; for(int i = 0; i < 3; i++) { tmp = mac[i]; - mac[i] = mac[5 - i]; - mac[5 - i] = tmp; + out[i] = mac[5 - i]; + out[5 - i] = tmp; } - return mac; + return out; } void bad_kb_scene_config_mac_byte_input_callback(void* context) { @@ -29,7 +29,7 @@ void bad_kb_scene_config_mac_on_enter(void* context) { bad_kb_scene_config_mac_byte_input_callback, NULL, bad_kb, - reverse_mac_addr(bad_kb->mac), + reverse_mac_addr(bad_kb->mac, bad_kb->mac), GAP_MAC_ADDR_SIZE); view_dispatcher_switch_to_view(bad_kb->view_dispatcher, BadKbAppViewConfigMac); } @@ -40,7 +40,8 @@ bool bad_kb_scene_config_mac_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(event.event == BadKbAppCustomEventByteInputDone) { - bt_set_profile_mac_address(bad_kb->bt, reverse_mac_addr(bad_kb->mac)); + uint8_t mac[GAP_MAC_ADDR_SIZE]; + bt_set_profile_mac_address(bad_kb->bt, reverse_mac_addr(bad_kb->mac, mac)); scene_manager_previous_scene(bad_kb->scene_manager); consumed = true; } @@ -56,5 +57,5 @@ void bad_kb_scene_config_mac_on_exit(void* context) { byte_input_set_header_text(bad_kb->byte_input, ""); // reverse back addr (in case it didn't get modified) - reverse_mac_addr(bad_kb->mac); + reverse_mac_addr(bad_kb->mac, bad_kb->mac); } From 62dd0aded2f76d69c33578a4695678ebe99a4b8b Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Sat, 25 Feb 2023 03:25:31 +0000 Subject: [PATCH 05/24] Subtly show PIN in BadKB --- applications/main/bad_kb/bad_kb_script.h | 1 + applications/main/bad_kb/views/bad_kb_view.c | 9 +++++++++ applications/services/bt/bt_service/bt.c | 4 ++++ applications/services/bt/bt_service/bt_i.h | 1 + 4 files changed, 15 insertions(+) diff --git a/applications/main/bad_kb/bad_kb_script.h b/applications/main/bad_kb/bad_kb_script.h index 0ea701eb8..0773cf05e 100644 --- a/applications/main/bad_kb/bad_kb_script.h +++ b/applications/main/bad_kb/bad_kb_script.h @@ -23,6 +23,7 @@ typedef enum { typedef struct { BadKbWorkerState state; + uint32_t pin; uint16_t line_cur; uint16_t line_nb; uint32_t delay_remain; diff --git a/applications/main/bad_kb/views/bad_kb_view.c b/applications/main/bad_kb/views/bad_kb_view.c index 1ffe58e9c..1e131a1ee 100644 --- a/applications/main/bad_kb/views/bad_kb_view.c +++ b/applications/main/bad_kb/views/bad_kb_view.c @@ -1,5 +1,6 @@ #include "bad_kb_view.h" #include "../bad_kb_script.h" +#include "../bad_kb_app_i.h" #include #include #include @@ -38,6 +39,9 @@ static void bad_kb_draw_callback(Canvas* canvas, void* _model) { furi_string_push_back(disp_str, model->layout[i]); furi_string_push_back(disp_str, ')'); } + if(model->state.pin) { + furi_string_cat_printf(disp_str, " PIN: %ld", model->state.pin); + } elements_string_fit_width(canvas, disp_str, 128 - 2); canvas_draw_str( canvas, 2, 8 + canvas_current_font_height(canvas), furi_string_get_cstr(disp_str)); @@ -214,6 +218,11 @@ void bad_kb_set_layout(BadKb* bad_kb, const char* layout) { void bad_kb_set_state(BadKb* bad_kb, BadKbState* st) { furi_assert(st); + if(bad_kb->context != NULL && ((BadKbApp*)bad_kb->context)->bt != NULL) { + st->pin = ((BadKbApp*)bad_kb->context)->bt->pin; + } else { + st->pin = 0; + } with_view_model( bad_kb->view, BadKbModel * model, diff --git a/applications/services/bt/bt_service/bt.c b/applications/services/bt/bt_service/bt.c index 7abef0e68..2d97ea7e5 100644 --- a/applications/services/bt/bt_service/bt.c +++ b/applications/services/bt/bt_service/bt.c @@ -76,6 +76,7 @@ static void bt_pin_code_hide(Bt* bt) { static bool bt_pin_code_verify_event_handler(Bt* bt, uint32_t pin) { furi_assert(bt); + bt->pin = pin; if(bt_get_profile_pairing_method(bt) == GapPairingNone) return true; @@ -154,6 +155,8 @@ Bt* bt_alloc() { // API evnent bt->api_event = furi_event_flag_alloc(); + bt->pin = 0; + return bt; } @@ -219,6 +222,7 @@ static bool bt_on_gap_event_callback(GapEvent event, void* context) { furi_assert(context); Bt* bt = context; bool ret = false; + bt->pin = 0; if(event.type == GapEventTypeConnected) { // Update status bar diff --git a/applications/services/bt/bt_service/bt_i.h b/applications/services/bt/bt_service/bt_i.h index c8a0e9965..8b81b6e51 100644 --- a/applications/services/bt/bt_service/bt_i.h +++ b/applications/services/bt/bt_service/bt_i.h @@ -76,4 +76,5 @@ struct Bt { FuriEventFlag* api_event; BtStatusChangedCallback status_changed_cb; void* status_changed_ctx; + uint32_t pin; }; From 20f9e1102f0d08d48cecf876d45a94a346b979ce Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Sat, 25 Feb 2023 23:24:09 +0000 Subject: [PATCH 06/24] Better bt pin code detection --- applications/services/bt/bt_service/bt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/applications/services/bt/bt_service/bt.c b/applications/services/bt/bt_service/bt.c index 2d97ea7e5..7cef8e140 100644 --- a/applications/services/bt/bt_service/bt.c +++ b/applications/services/bt/bt_service/bt.c @@ -76,7 +76,6 @@ static void bt_pin_code_hide(Bt* bt) { static bool bt_pin_code_verify_event_handler(Bt* bt, uint32_t pin) { furi_assert(bt); - bt->pin = pin; if(bt_get_profile_pairing_method(bt) == GapPairingNone) return true; @@ -279,12 +278,14 @@ static bool bt_on_gap_event_callback(GapEvent event, void* context) { furi_message_queue_put(bt->message_queue, &message, FuriWaitForever) == FuriStatusOk); ret = true; } else if(event.type == GapEventTypePinCodeShow) { + bt->pin = event.data.pin_code; BtMessage message = { .type = BtMessageTypePinCodeShow, .data.pin_code = event.data.pin_code}; furi_check( furi_message_queue_put(bt->message_queue, &message, FuriWaitForever) == FuriStatusOk); ret = true; } else if(event.type == GapEventTypePinCodeVerify) { + bt->pin = event.data.pin_code; ret = bt_pin_code_verify_event_handler(bt, event.data.pin_code); } else if(event.type == GapEventTypeUpdateMTU) { bt->max_packet_size = event.data.max_packet_size; From 4aeec153c4253bc716d2832248a806b1838c8d72 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Sun, 26 Feb 2023 00:55:49 +0000 Subject: [PATCH 07/24] Fix BadKB connection management and persistence --- applications/main/bad_kb/bad_kb_app.c | 2 +- applications/main/bad_kb/bad_kb_script.c | 143 ++++++------------ applications/main/bad_kb/bad_kb_script.h | 4 +- .../bad_kb/scenes/bad_kb_scene_config_bt.c | 2 +- .../bad_kb/scenes/bad_kb_scene_config_usb.c | 2 +- 5 files changed, 54 insertions(+), 99 deletions(-) diff --git a/applications/main/bad_kb/bad_kb_app.c b/applications/main/bad_kb/bad_kb_app.c index 5f1f17d78..8b694cadd 100644 --- a/applications/main/bad_kb/bad_kb_app.c +++ b/applications/main/bad_kb/bad_kb_app.c @@ -208,7 +208,7 @@ void bad_kb_app_free(BadKbApp* app) { // restores bt config // BtProfile have already been switched to the previous one // so we directly modify the right profile - bad_kb_connection_deinit(app->bt); + bad_kb_connection_deinit(app->bt, true); if(strcmp(app->bt_old_config.name, app->name) != 0) { furi_hal_bt_set_profile_adv_name(FuriHalBtProfileHidKeyboard, app->bt_old_config.name); } diff --git a/applications/main/bad_kb/bad_kb_script.c b/applications/main/bad_kb/bad_kb_script.c index 99622ff7c..f38f76c88 100644 --- a/applications/main/bad_kb/bad_kb_script.c +++ b/applications/main/bad_kb/bad_kb_script.c @@ -41,12 +41,6 @@ typedef enum { LevelRssiError = 0xFF, } LevelRssiRange; -typedef enum { - BadKbConnectionModeNone, - BadKbConnectionModeUsb, - BadKbConnectionModeBt, -} BadKbConnectionMode; - /** * Delays for waiting between HID key press and key release */ @@ -170,11 +164,10 @@ static const uint8_t numpad_keys[10] = { HID_KEYPAD_9, }; -BadKbConnectionMode connection_mode = BadKbConnectionModeNone; FuriHalUsbInterface* usb_mode_prev = NULL; GapPairing bt_mode_prev = GapPairingNone; -bool bt_connected = false; -bool usb_connected = false; +bool usb_initialized = false; +bool bt_initialized = false; uint8_t bt_timeout = 0; static LevelRssiRange bt_remote_rssi_range(Bt* bt) { @@ -607,10 +600,8 @@ static void bad_kb_bt_hid_state_callback(BtStatus status, void* context) { if(r != LevelRssiError) { bt_timeout = bt_hid_delays[r]; } - bt_connected = true; furi_thread_flags_set(furi_thread_get_id(bad_kb->thread), WorkerEvtConnect); } else { - bt_connected = false; furi_thread_flags_set(furi_thread_get_id(bad_kb->thread), WorkerEvtDisconnect); } } @@ -620,82 +611,48 @@ static void bad_kb_usb_hid_state_callback(bool state, void* context) { BadKbScript* bad_kb = context; if(state == true) { - usb_connected = true; furi_thread_flags_set(furi_thread_get_id(bad_kb->thread), WorkerEvtConnect); } else { - usb_connected = false; furi_thread_flags_set(furi_thread_get_id(bad_kb->thread), WorkerEvtDisconnect); } } -void bad_kb_bt_init(Bt* bt) { - bt_timeout = bt_hid_delays[LevelRssi39_0]; - bt_disconnect(bt); - furi_delay_ms(200); - bt_keys_storage_set_storage_path(bt, HID_BT_KEYS_STORAGE_PATH); - furi_assert(bt_set_profile(bt, BtProfileHidKeyboard)); - bt_mode_prev = bt_get_profile_pairing_method(bt); - bt_set_profile_pairing_method(bt, GapPairingNone); - furi_hal_bt_start_advertising(); - // disable peer key adding to bt SRAM storage - bt_disable_peer_key_update(bt); - - connection_mode = BadKbConnectionModeBt; -} - -void bad_kb_bt_deinit(Bt* bt) { - // release all keys - // bt_hid_hold_while_keyboard_buffer_full(6, 3000); - - // stop ble - bt_disconnect(bt); - - // Wait 2nd core to update nvm storage - furi_delay_ms(200); - - bt_keys_storage_set_default_path(bt); - - bt_set_profile_pairing_method(bt, bt_mode_prev); - - // fails if ble radio stack isn't ready when switching profile - // if it happens, maybe we should increase the delay after bt_disconnect - bt_set_profile(bt, BtProfileSerial); - - // starts saving peer keys (bounded devices) - bt_enable_peer_key_update(bt); - - connection_mode = BadKbConnectionModeNone; -} - -void bad_kb_usb_init() { - usb_mode_prev = furi_hal_usb_get_config(); - - connection_mode = BadKbConnectionModeUsb; -} - -void bad_kb_usb_deinit() { - furi_hal_usb_set_config(usb_mode_prev, NULL); - - connection_mode = BadKbConnectionModeNone; -} - void bad_kb_connection_init(Bt* bt) { - if(connection_mode != BadKbConnectionModeNone) return; - - if(bt) { - bad_kb_bt_init(bt); - } else { - bad_kb_usb_init(); + if(bt && !bt_initialized) { + bt_timeout = bt_hid_delays[LevelRssi39_0]; + bt_disconnect(bt); + furi_delay_ms(200); + bt_keys_storage_set_storage_path(bt, HID_BT_KEYS_STORAGE_PATH); + furi_assert(bt_set_profile(bt, BtProfileHidKeyboard)); + bt_mode_prev = bt_get_profile_pairing_method(bt); + bt_set_profile_pairing_method(bt, GapPairingNone); + furi_hal_bt_start_advertising(); + // disable peer key adding to bt SRAM storage + bt_disable_peer_key_update(bt); + bt_initialized = true; + } + if(!bt && !usb_initialized) { + usb_mode_prev = furi_hal_usb_get_config(); + usb_initialized = true; } } -void bad_kb_connection_deinit(Bt* bt) { - if(connection_mode == BadKbConnectionModeNone) return; - - if(connection_mode == BadKbConnectionModeBt) { - bad_kb_bt_deinit(bt); - } else { - bad_kb_usb_deinit(); +void bad_kb_connection_deinit(Bt* bt, bool reset_bt) { + if(bt_initialized && reset_bt && bt) { + // bt_hid_hold_while_keyboard_buffer_full(6, 3000); // release all keys + bt_disconnect(bt); // stop ble + furi_delay_ms(200); // Wait 2nd core to update nvm storage + bt_keys_storage_set_default_path(bt); + bt_set_profile_pairing_method(bt, bt_mode_prev); + // fails if ble radio stack isn't ready when switching profile + // if it happens, maybe we should increase the delay after bt_disconnect + bt_set_profile(bt, BtProfileSerial); + bt_enable_peer_key_update(bt); // starts saving peer keys (bounded devices) + bt_initialized = false; + } + if(usb_initialized) { + furi_hal_usb_set_config(usb_mode_prev, NULL); + usb_initialized = false; } } @@ -706,7 +663,6 @@ static int32_t bad_kb_worker(void* context) { int32_t delay_val = 0; bad_kb_connection_init(bad_kb->bt); - if(bad_kb->bt) { bt_set_status_changed_callback(bad_kb->bt, bad_kb_bt_hid_state_callback, bad_kb); } else { @@ -727,7 +683,11 @@ static int32_t bad_kb_worker(void* context) { FSOM_OPEN_EXISTING)) { if((ducky_script_preload(bad_kb, script_file)) && (bad_kb->st.line_nb > 0)) { if(bad_kb->bt) { - worker_state = BadKbStateNotConnected; // Ready to run + if(furi_hal_bt_is_connected()) { + worker_state = BadKbStateIdle; // Ready to run + } else { + worker_state = BadKbStateNotConnected; // Not connected + } } else { if(furi_hal_hid_is_connected()) { worker_state = BadKbStateIdle; // Ready to run @@ -745,21 +705,17 @@ static int32_t bad_kb_worker(void* context) { bad_kb->st.state = worker_state; } else if(worker_state == BadKbStateNotConnected) { // State: Not connected - if((bad_kb->bt && bt_connected) || (!bad_kb->bt && usb_connected)) { + uint32_t flags = furi_thread_flags_wait( + WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, + FuriFlagWaitAny, + FuriWaitForever); + furi_check((flags & FuriFlagError) == 0); + if(flags & WorkerEvtEnd) { + break; + } else if(flags & WorkerEvtConnect) { worker_state = BadKbStateIdle; // Ready to run - } else { - uint32_t flags = furi_thread_flags_wait( - WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, - FuriFlagWaitAny, - FuriWaitForever); - furi_check((flags & FuriFlagError) == 0); - if(flags & WorkerEvtEnd) { - break; - } else if(flags & WorkerEvtConnect) { - worker_state = BadKbStateIdle; // Ready to run - } else if(flags & WorkerEvtToggle) { - worker_state = BadKbStateWillRun; // Will run when connected - } + } else if(flags & WorkerEvtToggle) { + worker_state = BadKbStateWillRun; // Will run when connected } bad_kb->st.state = worker_state; @@ -892,6 +848,7 @@ static int32_t bad_kb_worker(void* context) { } else { furi_hal_hid_set_state_callback(NULL, NULL); } + bad_kb_connection_deinit(bad_kb->bt, false); storage_file_close(script_file); storage_file_free(script_file); diff --git a/applications/main/bad_kb/bad_kb_script.h b/applications/main/bad_kb/bad_kb_script.h index 0773cf05e..bdfd6bb8a 100644 --- a/applications/main/bad_kb/bad_kb_script.h +++ b/applications/main/bad_kb/bad_kb_script.h @@ -31,9 +31,7 @@ typedef struct { char error[64]; } BadKbState; -void bad_kb_connection_init(Bt* bt); - -void bad_kb_connection_deinit(Bt* bt); +void bad_kb_connection_deinit(Bt* bt, bool reset_bt); BadKbScript* bad_kb_script_open(FuriString* file_path, Bt* bt); diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c index 4412f0796..b3b0ec2bb 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c @@ -57,7 +57,7 @@ bool bad_kb_scene_config_bt_on_event(void* context, SceneManagerEvent event) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigLayout); } else if(event.event == VarItemListIndexConnection) { bad_kb_script_close(bad_kb->bad_kb_script); - bad_kb_connection_deinit(bad_kb->bt); + bad_kb_connection_deinit(bad_kb->bt, true); bad_kb->bad_kb_script = bad_kb_script_open(bad_kb->file_path, bad_kb->is_bt ? bad_kb->bt : NULL); bad_kb_script_set_keyboard_layout(bad_kb->bad_kb_script, bad_kb->keyboard_layout); diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_usb.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_usb.c index 232ef8796..2fa264e7c 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_usb.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_usb.c @@ -51,7 +51,7 @@ bool bad_kb_scene_config_usb_on_event(void* context, SceneManagerEvent event) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigLayout); } else if(event.event == VarItemListIndexConnection) { bad_kb_script_close(bad_kb->bad_kb_script); - bad_kb_connection_deinit(bad_kb->bt); + bad_kb_connection_deinit(bad_kb->bt, true); bad_kb->bad_kb_script = bad_kb_script_open(bad_kb->file_path, bad_kb->is_bt ? bad_kb->bt : NULL); bad_kb_script_set_keyboard_layout(bad_kb->bad_kb_script, bad_kb->keyboard_layout); From 3207fbab3f05f97de0aebab357b2756ae08a389e Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Sun, 26 Feb 2023 01:41:07 +0000 Subject: [PATCH 08/24] Show BadKB connection mode in main view --- applications/main/bad_kb/bad_kb_script.c | 1 + applications/main/bad_kb/bad_kb_script.h | 1 + applications/main/bad_kb/views/bad_kb_view.c | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/applications/main/bad_kb/bad_kb_script.c b/applications/main/bad_kb/bad_kb_script.c index f38f76c88..018dbb51b 100644 --- a/applications/main/bad_kb/bad_kb_script.c +++ b/applications/main/bad_kb/bad_kb_script.c @@ -878,6 +878,7 @@ BadKbScript* bad_kb_script_open(FuriString* file_path, Bt* bt) { bad_kb->st.state = BadKbStateInit; bad_kb->st.error[0] = '\0'; + bad_kb->st.is_bt = !!bt; bad_kb->bt = bt; diff --git a/applications/main/bad_kb/bad_kb_script.h b/applications/main/bad_kb/bad_kb_script.h index bdfd6bb8a..fde99556e 100644 --- a/applications/main/bad_kb/bad_kb_script.h +++ b/applications/main/bad_kb/bad_kb_script.h @@ -23,6 +23,7 @@ typedef enum { typedef struct { BadKbWorkerState state; + bool is_bt; uint32_t pin; uint16_t line_cur; uint16_t line_nb; diff --git a/applications/main/bad_kb/views/bad_kb_view.c b/applications/main/bad_kb/views/bad_kb_view.c index 1e131a1ee..d20969d00 100644 --- a/applications/main/bad_kb/views/bad_kb_view.c +++ b/applications/main/bad_kb/views/bad_kb_view.c @@ -25,7 +25,8 @@ static void bad_kb_draw_callback(Canvas* canvas, void* _model) { BadKbModel* model = _model; FuriString* disp_str; - disp_str = furi_string_alloc_set(model->file_name); + disp_str = furi_string_alloc_set(model->state.is_bt ? "(BT) " : "(USB) "); + furi_string_cat_str(disp_str, model->file_name); elements_string_fit_width(canvas, disp_str, 128 - 2); canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 2, 8, furi_string_get_cstr(disp_str)); From 9ff49110a0c72571a0351892182fcb928d6adc3a Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Sun, 26 Feb 2023 01:41:40 +0000 Subject: [PATCH 09/24] Cleaner BadKB pin sync --- applications/main/bad_kb/views/bad_kb_view.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/applications/main/bad_kb/views/bad_kb_view.c b/applications/main/bad_kb/views/bad_kb_view.c index d20969d00..3f5ec131d 100644 --- a/applications/main/bad_kb/views/bad_kb_view.c +++ b/applications/main/bad_kb/views/bad_kb_view.c @@ -219,11 +219,14 @@ void bad_kb_set_layout(BadKb* bad_kb, const char* layout) { void bad_kb_set_state(BadKb* bad_kb, BadKbState* st) { furi_assert(st); - if(bad_kb->context != NULL && ((BadKbApp*)bad_kb->context)->bt != NULL) { - st->pin = ((BadKbApp*)bad_kb->context)->bt->pin; - } else { - st->pin = 0; + uint32_t pin = 0; + if(bad_kb->context != NULL) { + BadKbApp* app = bad_kb->context; + if(app->bt != NULL) { + pin = app->bt->pin; + } } + st->pin = pin; with_view_model( bad_kb->view, BadKbModel * model, From 27976b0bd2eb656517a6f6861198b594b64ec8cc Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Sun, 26 Feb 2023 01:42:34 +0000 Subject: [PATCH 10/24] Cleaner BT HID name set --- firmware/targets/f7/furi_hal/furi_hal_bt.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/firmware/targets/f7/furi_hal/furi_hal_bt.c b/firmware/targets/f7/furi_hal/furi_hal_bt.c index 20c4b25ee..6bb083873 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_bt.c +++ b/firmware/targets/f7/furi_hal/furi_hal_bt.c @@ -222,9 +222,7 @@ bool furi_hal_bt_start_app(FuriHalBtProfile profile, GapEventCallback event_cb, } // Change name Flipper -> Control if(strlen(&config->adv_name[1]) == 0) { - const char* clicker_str = "Control "; - memcpy(&config->adv_name[1], clicker_str, strlen(clicker_str)); - strlcat(&config->adv_name[1], furi_hal_version_get_ble_local_device_name_ptr(), FURI_HAL_VERSION_DEVICE_NAME_LENGTH); + snprintf(&config->adv_name[1], strlen("Control ") + FURI_HAL_VERSION_DEVICE_NAME_LENGTH, "Control %s", furi_hal_version_get_ble_local_device_name_ptr()); } } if(!gap_init(config, event_cb, context)) { From 6b9eb8f350a313a991d45efc74df149ad26e9c81 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Sun, 26 Feb 2023 01:45:02 +0000 Subject: [PATCH 11/24] Format --- applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c | 4 ++-- firmware/targets/f7/furi_hal/furi_hal_bt.c | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c index 2b71ec91b..d7027537a 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c @@ -2,7 +2,7 @@ #define TAG "BadKbConfigMac" -static uint8_t* reverse_mac_addr(uint8_t* mac, uint8_t *out) { +static uint8_t* reverse_mac_addr(uint8_t* mac, uint8_t* out) { uint8_t tmp; for(int i = 0; i < 3; i++) { tmp = mac[i]; @@ -29,7 +29,7 @@ void bad_kb_scene_config_mac_on_enter(void* context) { bad_kb_scene_config_mac_byte_input_callback, NULL, bad_kb, - reverse_mac_addr(bad_kb->mac, bad_kb->mac), + reverse_mac_addr(bad_kb->mac, bad_kb->mac), GAP_MAC_ADDR_SIZE); view_dispatcher_switch_to_view(bad_kb->view_dispatcher, BadKbAppViewConfigMac); } diff --git a/firmware/targets/f7/furi_hal/furi_hal_bt.c b/firmware/targets/f7/furi_hal/furi_hal_bt.c index 6bb083873..4d2e4bc4e 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_bt.c +++ b/firmware/targets/f7/furi_hal/furi_hal_bt.c @@ -222,7 +222,11 @@ bool furi_hal_bt_start_app(FuriHalBtProfile profile, GapEventCallback event_cb, } // Change name Flipper -> Control if(strlen(&config->adv_name[1]) == 0) { - snprintf(&config->adv_name[1], strlen("Control ") + FURI_HAL_VERSION_DEVICE_NAME_LENGTH, "Control %s", furi_hal_version_get_ble_local_device_name_ptr()); + snprintf( + &config->adv_name[1], + strlen("Control ") + FURI_HAL_VERSION_DEVICE_NAME_LENGTH, + "Control %s", + furi_hal_version_get_ble_local_device_name_ptr()); } } if(!gap_init(config, event_cb, context)) { @@ -473,7 +477,7 @@ void furi_hal_bt_set_profile_adv_name( furi_assert(profile < FuriHalBtProfileNumber); furi_assert(name); - if (strlen(name) == 0) { + if(strlen(name) == 0) { memset( &(profile_config[profile].config.adv_name[1]), 0, From fb08674a9964536936ffc4bd24c1fa5cbb23c2cf Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Sun, 26 Feb 2023 06:49:08 +0000 Subject: [PATCH 12/24] BadKB handle connection at app level + fix crash --- applications/main/bad_kb/bad_kb_app.c | 23 ++--- applications/main/bad_kb/bad_kb_app.h | 2 - applications/main/bad_kb/bad_kb_app_i.h | 4 + applications/main/bad_kb/bad_kb_script.c | 84 ++++++++++--------- applications/main/bad_kb/bad_kb_script.h | 8 +- .../bad_kb/scenes/bad_kb_scene_config_bt.c | 14 +--- .../bad_kb/scenes/bad_kb_scene_config_usb.c | 14 +--- .../bad_kb/scenes/bad_kb_scene_file_select.c | 2 - 8 files changed, 67 insertions(+), 84 deletions(-) diff --git a/applications/main/bad_kb/bad_kb_app.c b/applications/main/bad_kb/bad_kb_app.c index 8b694cadd..2f5ee75ff 100644 --- a/applications/main/bad_kb/bad_kb_app.c +++ b/applications/main/bad_kb/bad_kb_app.c @@ -72,17 +72,6 @@ static void bad_kb_save_settings(BadKbApp* app) { storage_file_free(settings_file); } -void bad_kb_set_name(BadKbApp* app, const char* fmt, ...) { - furi_assert(app); - - va_list args; - va_start(args, fmt); - - vsnprintf(app->name, BAD_KB_ADV_NAME_MAX_LEN, fmt, args); - - va_end(args); -} - BadKbApp* bad_kb_app_alloc(char* arg) { BadKbApp* app = malloc(sizeof(BadKbApp)); @@ -113,6 +102,8 @@ BadKbApp* bad_kb_app_alloc(char* arg) { view_dispatcher_set_navigation_event_callback( app->view_dispatcher, bad_kb_app_back_event_callback); + app->connection_init = false; + Bt* bt = furi_record_open(RECORD_BT); app->bt = bt; app->is_bt = XTREME_SETTINGS()->bad_bt; @@ -158,6 +149,7 @@ BadKbApp* bad_kb_app_alloc(char* arg) { app->error = BadKbAppErrorCloseRpc; scene_manager_next_scene(app->scene_manager, BadKbSceneError); } else { + bad_kb_connection_init(app); if(!furi_string_empty(app->file_path)) { app->bad_kb_script = bad_kb_script_open(app->file_path, app->is_bt ? app->bt : NULL); bad_kb_script_set_keyboard_layout(app->bad_kb_script, app->keyboard_layout); @@ -179,6 +171,8 @@ void bad_kb_app_free(BadKbApp* app) { app->bad_kb_script = NULL; } + bad_kb_connection_deinit(app); + // Views view_dispatcher_remove_view(app->view_dispatcher, BadKbAppViewWork); bad_kb_free(app->bad_kb_view); @@ -205,10 +199,9 @@ void bad_kb_app_free(BadKbApp* app) { view_dispatcher_free(app->view_dispatcher); scene_manager_free(app->scene_manager); - // restores bt config - // BtProfile have already been switched to the previous one - // so we directly modify the right profile - bad_kb_connection_deinit(app->bt, true); + // Restore bt config + // BtProfile has already been switched to the previous one + // So we directly modify the right profile if(strcmp(app->bt_old_config.name, app->name) != 0) { furi_hal_bt_set_profile_adv_name(FuriHalBtProfileHidKeyboard, app->bt_old_config.name); } diff --git a/applications/main/bad_kb/bad_kb_app.h b/applications/main/bad_kb/bad_kb_app.h index e75a94651..af64be253 100644 --- a/applications/main/bad_kb/bad_kb_app.h +++ b/applications/main/bad_kb/bad_kb_app.h @@ -6,8 +6,6 @@ extern "C" { typedef struct BadKbApp BadKbApp; -void bad_kb_set_name(BadKbApp* app, const char* fmt, ...); - #ifdef __cplusplus } #endif diff --git a/applications/main/bad_kb/bad_kb_app_i.h b/applications/main/bad_kb/bad_kb_app_i.h index 38cae44c5..b16eb159d 100644 --- a/applications/main/bad_kb/bad_kb_app_i.h +++ b/applications/main/bad_kb/bad_kb_app_i.h @@ -68,6 +68,10 @@ struct BadKbApp { BadKbScript* bad_kb_script; bool is_bt; + + bool connection_init; + FuriHalUsbInterface* usb_prev_mode; + GapPairing bt_prev_mode; }; typedef enum { diff --git a/applications/main/bad_kb/bad_kb_script.c b/applications/main/bad_kb/bad_kb_script.c index 018dbb51b..d6cb6fae6 100644 --- a/applications/main/bad_kb/bad_kb_script.c +++ b/applications/main/bad_kb/bad_kb_script.c @@ -11,6 +11,8 @@ #include +#include "bad_kb_app_i.h" + #define HID_BT_KEYS_STORAGE_PATH EXT_PATH("apps/Tools/.bt_hid.keys") #define TAG "BadKB" @@ -164,10 +166,6 @@ static const uint8_t numpad_keys[10] = { HID_KEYPAD_9, }; -FuriHalUsbInterface* usb_mode_prev = NULL; -GapPairing bt_mode_prev = GapPairingNone; -bool usb_initialized = false; -bool bt_initialized = false; uint8_t bt_timeout = 0; static LevelRssiRange bt_remote_rssi_range(Bt* bt) { @@ -617,43 +615,55 @@ static void bad_kb_usb_hid_state_callback(bool state, void* context) { } } -void bad_kb_connection_init(Bt* bt) { - if(bt && !bt_initialized) { - bt_timeout = bt_hid_delays[LevelRssi39_0]; - bt_disconnect(bt); - furi_delay_ms(200); - bt_keys_storage_set_storage_path(bt, HID_BT_KEYS_STORAGE_PATH); - furi_assert(bt_set_profile(bt, BtProfileHidKeyboard)); - bt_mode_prev = bt_get_profile_pairing_method(bt); - bt_set_profile_pairing_method(bt, GapPairingNone); +void bad_kb_config_switch_mode(BadKbApp* app) { + bad_kb_script_close(app->bad_kb_script); + app->bad_kb_script = bad_kb_script_open(app->file_path, app->is_bt ? app->bt : NULL); + bad_kb_script_set_keyboard_layout(app->bad_kb_script, app->keyboard_layout); + scene_manager_previous_scene(app->scene_manager); + if(app->is_bt) { furi_hal_bt_start_advertising(); - // disable peer key adding to bt SRAM storage - bt_disable_peer_key_update(bt); - bt_initialized = true; - } - if(!bt && !usb_initialized) { - usb_mode_prev = furi_hal_usb_get_config(); - usb_initialized = true; + scene_manager_next_scene(app->scene_manager, BadKbSceneConfigBt); + } else { + furi_hal_bt_stop_advertising(); + scene_manager_next_scene(app->scene_manager, BadKbSceneConfigUsb); } } -void bad_kb_connection_deinit(Bt* bt, bool reset_bt) { - if(bt_initialized && reset_bt && bt) { - // bt_hid_hold_while_keyboard_buffer_full(6, 3000); // release all keys - bt_disconnect(bt); // stop ble - furi_delay_ms(200); // Wait 2nd core to update nvm storage - bt_keys_storage_set_default_path(bt); - bt_set_profile_pairing_method(bt, bt_mode_prev); - // fails if ble radio stack isn't ready when switching profile - // if it happens, maybe we should increase the delay after bt_disconnect - bt_set_profile(bt, BtProfileSerial); - bt_enable_peer_key_update(bt); // starts saving peer keys (bounded devices) - bt_initialized = false; - } - if(usb_initialized) { - furi_hal_usb_set_config(usb_mode_prev, NULL); - usb_initialized = false; +void bad_kb_connection_init(BadKbApp* app) { + app->usb_prev_mode = furi_hal_usb_get_config(); + furi_hal_usb_set_config(NULL, NULL); + + bt_timeout = bt_hid_delays[LevelRssi39_0]; + bt_disconnect(app->bt); + // furi_delay_ms(200); + bt_keys_storage_set_storage_path(app->bt, HID_BT_KEYS_STORAGE_PATH); + bt_set_profile(app->bt, BtProfileHidKeyboard); + app->bt_prev_mode = bt_get_profile_pairing_method(app->bt); + bt_set_profile_pairing_method(app->bt, GapPairingNone); + bt_disable_peer_key_update(app->bt); // disable peer key adding to bt SRAM storage + if(app->is_bt) { + furi_hal_bt_start_advertising(); + } else { + furi_hal_bt_stop_advertising(); } + + app->connection_init = true; +} + +void bad_kb_connection_deinit(BadKbApp* app) { + if(!app->connection_init) return; + + furi_hal_usb_set_config(app->usb_prev_mode, NULL); + + // bt_hid_hold_while_keyboard_buffer_full(6, 3000); // release all keys + bt_disconnect(app->bt); // stop ble + // furi_delay_ms(200); // Wait 2nd core to update nvm storage + bt_keys_storage_set_default_path(app->bt); + bt_set_profile_pairing_method(app->bt, app->bt_prev_mode); + // fails if ble radio stack isn't ready when switching profile + // if it happens, maybe we should increase the delay after bt_disconnect + bt_set_profile(app->bt, BtProfileSerial); + bt_enable_peer_key_update(app->bt); // starts saving peer keys (bounded devices) } static int32_t bad_kb_worker(void* context) { @@ -662,7 +672,6 @@ static int32_t bad_kb_worker(void* context) { BadKbWorkerState worker_state = BadKbStateInit; int32_t delay_val = 0; - bad_kb_connection_init(bad_kb->bt); if(bad_kb->bt) { bt_set_status_changed_callback(bad_kb->bt, bad_kb_bt_hid_state_callback, bad_kb); } else { @@ -848,7 +857,6 @@ static int32_t bad_kb_worker(void* context) { } else { furi_hal_hid_set_state_callback(NULL, NULL); } - bad_kb_connection_deinit(bad_kb->bt, false); storage_file_close(script_file); storage_file_free(script_file); diff --git a/applications/main/bad_kb/bad_kb_script.h b/applications/main/bad_kb/bad_kb_script.h index fde99556e..5699e4189 100644 --- a/applications/main/bad_kb/bad_kb_script.h +++ b/applications/main/bad_kb/bad_kb_script.h @@ -7,6 +7,8 @@ extern "C" { #include #include +typedef struct BadKbApp BadKbApp; + typedef struct BadKbScript BadKbScript; typedef enum { @@ -32,7 +34,11 @@ typedef struct { char error[64]; } BadKbState; -void bad_kb_connection_deinit(Bt* bt, bool reset_bt); +void bad_kb_config_switch_mode(BadKbApp* app); + +void bad_kb_connection_init(BadKbApp* app); + +void bad_kb_connection_deinit(BadKbApp* app); BadKbScript* bad_kb_script_open(FuriString* file_path, Bt* bt); diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c index b3b0ec2bb..1a867f877 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c @@ -56,23 +56,11 @@ bool bad_kb_scene_config_bt_on_event(void* context, SceneManagerEvent event) { if(event.event == VarItemListIndexKeyboardLayout) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigLayout); } else if(event.event == VarItemListIndexConnection) { - bad_kb_script_close(bad_kb->bad_kb_script); - bad_kb_connection_deinit(bad_kb->bt, true); - bad_kb->bad_kb_script = - bad_kb_script_open(bad_kb->file_path, bad_kb->is_bt ? bad_kb->bt : NULL); - bad_kb_script_set_keyboard_layout(bad_kb->bad_kb_script, bad_kb->keyboard_layout); - scene_manager_previous_scene(bad_kb->scene_manager); - if(bad_kb->is_bt) { - scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigBt); - } else { - scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigUsb); - } + bad_kb_config_switch_mode(bad_kb); } else if(event.event == VarItemListIndexAdvertisementName) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigName); } else if(event.event == VarItemListIndexMacAddress) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigMac); - // } else { - // furi_crash("Unknown key type"); } } diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_usb.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_usb.c index 2fa264e7c..d3ff35fc8 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_usb.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_usb.c @@ -50,19 +50,7 @@ bool bad_kb_scene_config_usb_on_event(void* context, SceneManagerEvent event) { if(event.event == VarItemListIndexKeyboardLayout) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigLayout); } else if(event.event == VarItemListIndexConnection) { - bad_kb_script_close(bad_kb->bad_kb_script); - bad_kb_connection_deinit(bad_kb->bt, true); - bad_kb->bad_kb_script = - bad_kb_script_open(bad_kb->file_path, bad_kb->is_bt ? bad_kb->bt : NULL); - bad_kb_script_set_keyboard_layout(bad_kb->bad_kb_script, bad_kb->keyboard_layout); - scene_manager_previous_scene(bad_kb->scene_manager); - if(bad_kb->is_bt) { - scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigBt); - } else { - scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigUsb); - } - // } else { - // furi_crash("Unknown key type"); + bad_kb_config_switch_mode(bad_kb); } } diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_file_select.c b/applications/main/bad_kb/scenes/bad_kb_scene_file_select.c index bb2ddf6ca..ba238f390 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_file_select.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_file_select.c @@ -22,7 +22,6 @@ static bool bad_kb_file_select(BadKbApp* bad_kb) { void bad_kb_scene_file_select_on_enter(void* context) { BadKbApp* bad_kb = context; - furi_hal_usb_disable(); if(bad_kb->bad_kb_script) { bad_kb_script_close(bad_kb->bad_kb_script); bad_kb->bad_kb_script = NULL; @@ -35,7 +34,6 @@ void bad_kb_scene_file_select_on_enter(void* context) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneWork); } else { - furi_hal_usb_enable(); view_dispatcher_stop(bad_kb->view_dispatcher); } } From 48641ef6f68f7ba968aa518ef6256943f11f9062 Mon Sep 17 00:00:00 2001 From: yocvito Date: Tue, 28 Feb 2023 19:27:15 +0100 Subject: [PATCH 13/24] Adds bonding toggle in badkb, allowing to remember paired devices, but MAC address cannot be modified in this state (V1) --- applications/main/bad_kb/bad_kb_app.c | 2 + applications/main/bad_kb/bad_kb_app_i.h | 19 +++++-- applications/main/bad_kb/bad_kb_script.c | 57 ++++++++++++++----- applications/main/bad_kb/bad_kb_script.h | 2 + .../bad_kb/scenes/bad_kb_scene_config_bt.c | 22 ++++++- applications/services/bt/bt_service/bt.c | 7 +-- applications/services/bt/bt_service/bt.h | 2 +- .../bt_settings_scene_forget_dev_confirm.c | 6 ++ firmware/targets/f7/api_symbols.csv | 4 +- firmware/targets/f7/ble_glue/gap.c | 4 +- 10 files changed, 96 insertions(+), 29 deletions(-) diff --git a/applications/main/bad_kb/bad_kb_app.c b/applications/main/bad_kb/bad_kb_app.c index 2f5ee75ff..f7c9fcd41 100644 --- a/applications/main/bad_kb/bad_kb_app.c +++ b/applications/main/bad_kb/bad_kb_app.c @@ -107,10 +107,12 @@ BadKbApp* bad_kb_app_alloc(char* arg) { Bt* bt = furi_record_open(RECORD_BT); app->bt = bt; app->is_bt = XTREME_SETTINGS()->bad_bt; + app->bonding = BondingForgetDevices; const char* adv_name = furi_hal_bt_get_profile_adv_name(FuriHalBtProfileHidKeyboard); memcpy(app->name, adv_name, BAD_KB_ADV_NAME_MAX_LEN); memcpy(app->bt_old_config.name, adv_name, BAD_KB_ADV_NAME_MAX_LEN); + // need to be done before bt init (where mac address get modified if bounding is activated) const uint8_t* mac_addr = furi_hal_bt_get_profile_mac_addr(FuriHalBtProfileHidKeyboard); memcpy(app->mac, mac_addr, BAD_KB_MAC_ADDRESS_LEN); memcpy(app->bt_old_config.mac, mac_addr, BAD_KB_MAC_ADDRESS_LEN); diff --git a/applications/main/bad_kb/bad_kb_app_i.h b/applications/main/bad_kb/bad_kb_app_i.h index b16eb159d..1263ab49c 100644 --- a/applications/main/bad_kb/bad_kb_app_i.h +++ b/applications/main/bad_kb/bad_kb_app_i.h @@ -18,11 +18,16 @@ #define BAD_KB_APP_BASE_FOLDER ANY_PATH("badkb") #define BAD_KB_APP_PATH_LAYOUT_FOLDER BAD_KB_APP_BASE_FOLDER "/assets/layouts" +#define BAD_KB_APP_PATH_BOUND_KEYS_FOLDER EXT_PATH("badkb/.bt_keys") +#define BAD_KB_APP_PATH_BOUND_KEYS_FILE BAD_KB_APP_PATH_BOUND_KEYS_FOLDER "/.devices.keys" #define BAD_KB_APP_SCRIPT_EXTENSION ".txt" #define BAD_KB_APP_LAYOUT_EXTENSION ".kl" -#define BAD_KB_MAC_ADDRESS_LEN 6 // need replace with MAC size maccro -#define BAD_KB_ADV_NAME_MAX_LEN 18 +#define BAD_KB_MAC_ADDRESS_LEN 6 // need replace with MAC size maccro +#define BAD_KB_ADV_NAME_MAX_LEN 18 + +// this is the MAC address used when we do not forget paired device (BOUND STATE) +#define BAD_KB_BOUND_MAC_ADDRESS { 0x41, 0x4a, 0xef, 0xbe, 0xad, 0xde }; typedef enum { BadKbAppErrorNoFiles, @@ -35,13 +40,14 @@ typedef enum BadKbCustomEvent { BadKbCustomEventErrorBack } BadKbCustomEvent; + +#define BondingForgetDevices false +#define BondingRememberDevices true + typedef struct { + //uint8_t bounded_mac[BAD_KB_MAC_ADDRESS_LEN]; uint8_t mac[BAD_KB_MAC_ADDRESS_LEN]; char name[BAD_KB_ADV_NAME_MAX_LEN + 1]; - - // number of bt keys before starting the app (all keys added in - // the bt keys file then will be removed) - uint16_t n_keys; } BadKbBtConfig; struct BadKbApp { @@ -59,6 +65,7 @@ struct BadKbApp { ByteInput* byte_input; uint8_t mac[BAD_KB_MAC_ADDRESS_LEN]; char name[BAD_KB_ADV_NAME_MAX_LEN + 1]; + bool bonding; // weither we remember paired devices or not BadKbBtConfig bt_old_config; BadKbAppError error; diff --git a/applications/main/bad_kb/bad_kb_script.c b/applications/main/bad_kb/bad_kb_script.c index d6cb6fae6..469d4169a 100644 --- a/applications/main/bad_kb/bad_kb_script.c +++ b/applications/main/bad_kb/bad_kb_script.c @@ -169,19 +169,19 @@ static const uint8_t numpad_keys[10] = { uint8_t bt_timeout = 0; static LevelRssiRange bt_remote_rssi_range(Bt* bt) { - BtRssi rssi_data = {0}; + uint8_t rssi; - if(!bt_remote_rssi(bt, &rssi_data)) return LevelRssiError; + if(!bt_remote_rssi(bt, &rssi)) return LevelRssiError; - if(rssi_data.rssi <= 39) + if(rssi <= 39) return LevelRssi39_0; - else if(rssi_data.rssi <= 59) + else if(rssi <= 59) return LevelRssi59_40; - else if(rssi_data.rssi <= 79) + else if(rssi <= 79) return LevelRssi79_60; - else if(rssi_data.rssi <= 99) + else if(rssi <= 99) return LevelRssi99_80; - else if(rssi_data.rssi <= 122) + else if(rssi <= 122) return LevelRssi122_100; return LevelRssiError; @@ -629,6 +629,23 @@ void bad_kb_config_switch_mode(BadKbApp* app) { } } +void bad_kb_config_switch_bonding_mode(BadKbApp *app) { + if (app->bonding) { + // set bouding mac + uint8_t mac[6] = BAD_KB_BOUND_MAC_ADDRESS; + furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, GapPairingPinCodeVerifyYesNo); + bt_set_profile_mac_address(app->bt, mac); // this also restart bt + // enable keys storage + bt_enable_peer_key_update(app->bt); + } else { + // set back user defined mac address + furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, GapPairingNone); + bt_set_profile_mac_address(app->bt, app->mac); + // disable key storage + bt_disable_peer_key_update(app->bt); + } +} + void bad_kb_connection_init(BadKbApp* app) { app->usb_prev_mode = furi_hal_usb_get_config(); furi_hal_usb_set_config(NULL, NULL); @@ -636,13 +653,22 @@ void bad_kb_connection_init(BadKbApp* app) { bt_timeout = bt_hid_delays[LevelRssi39_0]; bt_disconnect(app->bt); // furi_delay_ms(200); - bt_keys_storage_set_storage_path(app->bt, HID_BT_KEYS_STORAGE_PATH); + bt_keys_storage_set_storage_path(app->bt, BAD_KB_APP_PATH_BOUND_KEYS_FILE); + app->bt_prev_mode = furi_hal_bt_get_profile_pairing_method(FuriHalBtProfileHidKeyboard); + if (app->bonding) { // usefull if bounding become an XTREME setting + uint8_t mac[6] = BAD_KB_BOUND_MAC_ADDRESS; + furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, mac); + // using GapPairingNone breaks bounding between devices + furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, GapPairingPinCodeVerifyYesNo); + } else { + furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, GapPairingNone); + } + bt_set_profile(app->bt, BtProfileHidKeyboard); - app->bt_prev_mode = bt_get_profile_pairing_method(app->bt); - bt_set_profile_pairing_method(app->bt, GapPairingNone); - bt_disable_peer_key_update(app->bt); // disable peer key adding to bt SRAM storage if(app->is_bt) { furi_hal_bt_start_advertising(); + if (!app->bonding) + bt_disable_peer_key_update(app->bt); // disable peer key adding to bt SRAM storage } else { furi_hal_bt_stop_advertising(); } @@ -659,11 +685,16 @@ void bad_kb_connection_deinit(BadKbApp* app) { bt_disconnect(app->bt); // stop ble // furi_delay_ms(200); // Wait 2nd core to update nvm storage bt_keys_storage_set_default_path(app->bt); - bt_set_profile_pairing_method(app->bt, app->bt_prev_mode); + if (app->bonding) { + // hal primitives doesn't restarts ble, that's what we want cuz we are shutting down + furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, app->mac); + }else { + bt_enable_peer_key_update(app->bt); // starts saving peer keys (bounded devices) + } // fails if ble radio stack isn't ready when switching profile // if it happens, maybe we should increase the delay after bt_disconnect bt_set_profile(app->bt, BtProfileSerial); - bt_enable_peer_key_update(app->bt); // starts saving peer keys (bounded devices) + furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, app->bt_prev_mode); } static int32_t bad_kb_worker(void* context) { diff --git a/applications/main/bad_kb/bad_kb_script.h b/applications/main/bad_kb/bad_kb_script.h index 5699e4189..2f9097cb7 100644 --- a/applications/main/bad_kb/bad_kb_script.h +++ b/applications/main/bad_kb/bad_kb_script.h @@ -36,6 +36,8 @@ typedef struct { void bad_kb_config_switch_mode(BadKbApp* app); +void bad_kb_config_switch_bonding_mode(BadKbApp *app); + void bad_kb_connection_init(BadKbApp* app); void bad_kb_connection_deinit(BadKbApp* app); diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c index 1a867f877..fa2a8ec8d 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c @@ -5,6 +5,7 @@ enum VarItemListIndex { VarItemListIndexConnection, + VarItemListIndexBonding, VarItemListIndexKeyboardLayout, VarItemListIndexAdvertisementName, VarItemListIndexMacAddress, @@ -19,6 +20,13 @@ void bad_kb_scene_config_bt_connection_callback(VariableItem* item) { view_dispatcher_send_custom_event(bad_kb->view_dispatcher, VarItemListIndexConnection); } +void bad_kb_scene_config_bt_bounding_callback(VariableItem* item) { + BadKbApp* bad_kb = variable_item_get_context(item); + bad_kb->bonding = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, bad_kb->bonding ? "Remember" : "Forget"); + view_dispatcher_send_custom_event(bad_kb->view_dispatcher, VarItemListIndexBonding); +} + void bad_kb_scene_config_bt_var_item_list_callback(void* context, uint32_t index) { BadKbApp* bad_kb = context; view_dispatcher_send_custom_event(bad_kb->view_dispatcher, index); @@ -34,11 +42,19 @@ void bad_kb_scene_config_bt_on_enter(void* context) { variable_item_set_current_value_index(item, bad_kb->is_bt); variable_item_set_current_value_text(item, bad_kb->is_bt ? "BT" : "USB"); + item = variable_item_list_add( + var_item_list, "Bonding", 2, bad_kb_scene_config_bt_bounding_callback, bad_kb); + variable_item_set_current_value_index(item, bad_kb->bonding); + variable_item_set_current_value_text(item, bad_kb->bonding ? "Remember" : "Forget"); + item = variable_item_list_add(var_item_list, "Keyboard layout", 0, NULL, bad_kb); item = variable_item_list_add(var_item_list, "BT device name", 0, NULL, bad_kb); - - item = variable_item_list_add(var_item_list, "BT MAC address", 0, NULL, bad_kb); + + // this doesn't update instantly when toggling between Bounding modes + if (!bad_kb->bonding) { + item = variable_item_list_add(var_item_list, "BT MAC address", 0, NULL, bad_kb); + } variable_item_list_set_enter_callback( var_item_list, bad_kb_scene_config_bt_var_item_list_callback, bad_kb); @@ -57,6 +73,8 @@ bool bad_kb_scene_config_bt_on_event(void* context, SceneManagerEvent event) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigLayout); } else if(event.event == VarItemListIndexConnection) { bad_kb_config_switch_mode(bad_kb); + } else if (event.event == VarItemListIndexBonding) { + bad_kb_config_switch_bonding_mode(bad_kb); } else if(event.event == VarItemListIndexAdvertisementName) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigName); } else if(event.event == VarItemListIndexMacAddress) { diff --git a/applications/services/bt/bt_service/bt.c b/applications/services/bt/bt_service/bt.c index 7cef8e140..964eff28d 100644 --- a/applications/services/bt/bt_service/bt.c +++ b/applications/services/bt/bt_service/bt.c @@ -424,17 +424,15 @@ const uint8_t* bt_get_profile_mac_address(Bt* bt) { return furi_hal_bt_get_profile_mac_addr(get_hal_bt_profile(bt->profile)); } -bool bt_remote_rssi(Bt* bt, BtRssi* rssi) { +bool bt_remote_rssi(Bt* bt, uint8_t* rssi) { furi_assert(bt); - UNUSED(rssi); uint8_t rssi_val; uint32_t since = furi_hal_bt_get_conn_rssi(&rssi_val); if(since == 0) return false; - rssi->rssi = rssi_val; - rssi->since = since; + *rssi = rssi_val; return true; } @@ -456,6 +454,7 @@ void bt_disable_peer_key_update(Bt* bt) { } void bt_enable_peer_key_update(Bt* bt) { + furi_assert(bt); furi_hal_bt_set_key_storage_change_callback(bt_on_key_storage_change_callback, bt); } diff --git a/applications/services/bt/bt_service/bt.h b/applications/services/bt/bt_service/bt.h index a79c227f7..eb762dbf4 100644 --- a/applications/services/bt/bt_service/bt.h +++ b/applications/services/bt/bt_service/bt.h @@ -47,7 +47,7 @@ const char* bt_get_profile_adv_name(Bt* bt); void bt_set_profile_mac_address(Bt* bt, const uint8_t mac[6]); const uint8_t* bt_get_profile_mac_address(Bt* bt); -bool bt_remote_rssi(Bt* bt, BtRssi* rssi); +bool bt_remote_rssi(Bt* bt, uint8_t* rssi); void bt_set_profile_pairing_method(Bt* bt, GapPairing pairing_method); GapPairing bt_get_profile_pairing_method(Bt* bt); diff --git a/applications/settings/bt_settings_app/scenes/bt_settings_scene_forget_dev_confirm.c b/applications/settings/bt_settings_app/scenes/bt_settings_scene_forget_dev_confirm.c index 31921b9f3..c912f2e5d 100644 --- a/applications/settings/bt_settings_app/scenes/bt_settings_scene_forget_dev_confirm.c +++ b/applications/settings/bt_settings_app/scenes/bt_settings_scene_forget_dev_confirm.c @@ -1,5 +1,6 @@ #include "../bt_settings_app.h" #include +#include void bt_settings_scene_forget_dev_confirm_dialog_callback(DialogExResult result, void* context) { furi_assert(context); @@ -30,6 +31,11 @@ bool bt_settings_scene_forget_dev_confirm_on_event(void* context, SceneManagerEv consumed = scene_manager_previous_scene(app->scene_manager); } else if(event.event == DialogExResultRight) { bt_forget_bonded_devices(app->bt); + // also removes keys of badkb bonded devices + bt_keys_storage_set_storage_path(app->bt, BAD_KB_APP_PATH_BOUND_KEYS_FILE); + bt_forget_bonded_devices(app->bt); + bt_keys_storage_set_default_path(app->bt); + scene_manager_next_scene(app->scene_manager, BtSettingsAppSceneForgetDevSuccess); consumed = true; } diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 2db05fc50..68f0ce8ab 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,14.1,, +Version,+,15.0,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli_vcp.h,, @@ -589,7 +589,7 @@ Function,+,bt_get_profile_mac_address,const uint8_t*,Bt* Function,+,bt_get_profile_pairing_method,GapPairing,Bt* Function,+,bt_keys_storage_set_default_path,void,Bt* Function,+,bt_keys_storage_set_storage_path,void,"Bt*, const char*" -Function,+,bt_remote_rssi,_Bool,"Bt*, BtRssi*" +Function,+,bt_remote_rssi,_Bool,"Bt*, uint8_t*" Function,+,bt_set_profile,_Bool,"Bt*, BtProfile" Function,+,bt_set_profile_adv_name,void,"Bt*, const char*, ..." Function,+,bt_set_profile_mac_address,void,"Bt*, const uint8_t[6]" diff --git a/firmware/targets/f7/ble_glue/gap.c b/firmware/targets/f7/ble_glue/gap.c index 0a317b574..ebf27b369 100644 --- a/firmware/targets/f7/ble_glue/gap.c +++ b/firmware/targets/f7/ble_glue/gap.c @@ -373,6 +373,7 @@ static void gap_init_svc(Gap* gap) { bool keypress_supported = false; uint8_t conf_mitm = CFG_MITM_PROTECTION; uint8_t conf_used_fixed_pin = CFG_USED_FIXED_PIN; + bool conf_bonding = gap->config->bonding_mode; if(gap->config->pairing_method == GapPairingPinCodeShow) { aci_gap_set_io_capability(IO_CAP_DISPLAY_ONLY); } else if(gap->config->pairing_method == GapPairingPinCodeVerifyYesNo) { @@ -382,6 +383,7 @@ static void gap_init_svc(Gap* gap) { // Just works pairing method (IOS accept it, it seems android and linux doesn't) conf_mitm = 0; conf_used_fixed_pin = 0; + conf_bonding = false; // if just works isn't supported, we want the numeric comparaison method aci_gap_set_io_capability(IO_CAP_DISPLAY_YES_NO); keypress_supported = true; @@ -389,7 +391,7 @@ static void gap_init_svc(Gap* gap) { // Setup authentication aci_gap_set_authentication_requirement( - gap->config->bonding_mode, + conf_bonding, conf_mitm, CFG_SC_SUPPORT, keypress_supported, From 581f050d1ed2eebc531ca6188a0529d604b4e78b Mon Sep 17 00:00:00 2001 From: yocvito Date: Tue, 28 Feb 2023 22:18:09 +0100 Subject: [PATCH 14/24] fix ui bug where conf scene was not updated on bonding toggle --- applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c index fa2a8ec8d..02b20a761 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c @@ -75,6 +75,8 @@ bool bad_kb_scene_config_bt_on_event(void* context, SceneManagerEvent event) { bad_kb_config_switch_mode(bad_kb); } else if (event.event == VarItemListIndexBonding) { bad_kb_config_switch_bonding_mode(bad_kb); + scene_manager_previous_scene(bad_kb->scene_manager); + scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigBt); } else if(event.event == VarItemListIndexAdvertisementName) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigName); } else if(event.event == VarItemListIndexMacAddress) { From 30c603ee2d858d07e6a6bf4e5540693a392d88c8 Mon Sep 17 00:00:00 2001 From: yocvito Date: Tue, 28 Feb 2023 22:20:25 +0100 Subject: [PATCH 15/24] change troll default mac addr for remember bonding mode in bad kb --- applications/main/bad_kb/bad_kb_app_i.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/main/bad_kb/bad_kb_app_i.h b/applications/main/bad_kb/bad_kb_app_i.h index 1263ab49c..996fda4da 100644 --- a/applications/main/bad_kb/bad_kb_app_i.h +++ b/applications/main/bad_kb/bad_kb_app_i.h @@ -27,7 +27,7 @@ #define BAD_KB_ADV_NAME_MAX_LEN 18 // this is the MAC address used when we do not forget paired device (BOUND STATE) -#define BAD_KB_BOUND_MAC_ADDRESS { 0x41, 0x4a, 0xef, 0xbe, 0xad, 0xde }; +#define BAD_KB_BOUND_MAC_ADDRESS { 0x41, 0x4a, 0xef, 0xb6, 0xa9, 0xd4 }; typedef enum { BadKbAppErrorNoFiles, From e81befe3151f4ca4b18d4fd0f98a5e4f27eaed47 Mon Sep 17 00:00:00 2001 From: yocvito Date: Tue, 28 Feb 2023 22:39:02 +0100 Subject: [PATCH 16/24] faster badkb starting: bt init using thread --- applications/main/bad_kb/bad_kb_app.c | 4 +++- applications/main/bad_kb/bad_kb_app_i.h | 2 ++ applications/main/bad_kb/bad_kb_script.c | 4 +++- applications/main/bad_kb/bad_kb_script.h | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/applications/main/bad_kb/bad_kb_app.c b/applications/main/bad_kb/bad_kb_app.c index f7c9fcd41..816578f00 100644 --- a/applications/main/bad_kb/bad_kb_app.c +++ b/applications/main/bad_kb/bad_kb_app.c @@ -151,7 +151,8 @@ BadKbApp* bad_kb_app_alloc(char* arg) { app->error = BadKbAppErrorCloseRpc; scene_manager_next_scene(app->scene_manager, BadKbSceneError); } else { - bad_kb_connection_init(app); + app->bt_init_thread = furi_thread_alloc_ex("BadKbBtInit", 512, (FuriThreadCallback)bad_kb_connection_init, app); + furi_thread_start(app->bt_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); bad_kb_script_set_keyboard_layout(app->bad_kb_script, app->keyboard_layout); @@ -173,6 +174,7 @@ void bad_kb_app_free(BadKbApp* app) { app->bad_kb_script = NULL; } + furi_thread_join(app->bt_init_thread); bad_kb_connection_deinit(app); // Views diff --git a/applications/main/bad_kb/bad_kb_app_i.h b/applications/main/bad_kb/bad_kb_app_i.h index 996fda4da..7c81144f6 100644 --- a/applications/main/bad_kb/bad_kb_app_i.h +++ b/applications/main/bad_kb/bad_kb_app_i.h @@ -79,6 +79,8 @@ struct BadKbApp { bool connection_init; FuriHalUsbInterface* usb_prev_mode; GapPairing bt_prev_mode; + + FuriThread *bt_init_thread; }; typedef enum { diff --git a/applications/main/bad_kb/bad_kb_script.c b/applications/main/bad_kb/bad_kb_script.c index 469d4169a..661745cd6 100644 --- a/applications/main/bad_kb/bad_kb_script.c +++ b/applications/main/bad_kb/bad_kb_script.c @@ -646,7 +646,7 @@ void bad_kb_config_switch_bonding_mode(BadKbApp *app) { } } -void bad_kb_connection_init(BadKbApp* app) { +int32_t bad_kb_connection_init(BadKbApp* app) { app->usb_prev_mode = furi_hal_usb_get_config(); furi_hal_usb_set_config(NULL, NULL); @@ -674,6 +674,8 @@ void bad_kb_connection_init(BadKbApp* app) { } app->connection_init = true; + + return 0; } void bad_kb_connection_deinit(BadKbApp* app) { diff --git a/applications/main/bad_kb/bad_kb_script.h b/applications/main/bad_kb/bad_kb_script.h index 2f9097cb7..ad8618658 100644 --- a/applications/main/bad_kb/bad_kb_script.h +++ b/applications/main/bad_kb/bad_kb_script.h @@ -38,7 +38,7 @@ void bad_kb_config_switch_mode(BadKbApp* app); void bad_kb_config_switch_bonding_mode(BadKbApp *app); -void bad_kb_connection_init(BadKbApp* app); +int32_t bad_kb_connection_init(BadKbApp* app); void bad_kb_connection_deinit(BadKbApp* app); From a49eb22ca1a6dde280a9d99a40f88d07bea98908 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Tue, 28 Feb 2023 22:27:27 +0000 Subject: [PATCH 17/24] Improve BadKB connection handling further --- applications/main/bad_kb/bad_kb_app.c | 11 ++++++----- applications/main/bad_kb/bad_kb_app_i.h | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/applications/main/bad_kb/bad_kb_app.c b/applications/main/bad_kb/bad_kb_app.c index 816578f00..bfb5a3d6d 100644 --- a/applications/main/bad_kb/bad_kb_app.c +++ b/applications/main/bad_kb/bad_kb_app.c @@ -151,8 +151,8 @@ BadKbApp* bad_kb_app_alloc(char* arg) { app->error = BadKbAppErrorCloseRpc; scene_manager_next_scene(app->scene_manager, BadKbSceneError); } else { - app->bt_init_thread = furi_thread_alloc_ex("BadKbBtInit", 512, (FuriThreadCallback)bad_kb_connection_init, app); - furi_thread_start(app->bt_init_thread); + app->conn_init_thread = furi_thread_alloc_ex("BadKbConnInit", 512, (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); bad_kb_script_set_keyboard_layout(app->bad_kb_script, app->keyboard_layout); @@ -174,9 +174,6 @@ void bad_kb_app_free(BadKbApp* app) { app->bad_kb_script = NULL; } - furi_thread_join(app->bt_init_thread); - bad_kb_connection_deinit(app); - // Views view_dispatcher_remove_view(app->view_dispatcher, BadKbAppViewWork); bad_kb_free(app->bad_kb_view); @@ -224,6 +221,10 @@ void bad_kb_app_free(BadKbApp* app) { furi_string_free(app->file_path); furi_string_free(app->keyboard_layout); + furi_thread_join(app->conn_init_thread); + bad_kb_connection_deinit(app); + furi_thread_free(app->conn_init_thread); + free(app); } diff --git a/applications/main/bad_kb/bad_kb_app_i.h b/applications/main/bad_kb/bad_kb_app_i.h index 7c81144f6..ac79205b5 100644 --- a/applications/main/bad_kb/bad_kb_app_i.h +++ b/applications/main/bad_kb/bad_kb_app_i.h @@ -80,7 +80,7 @@ struct BadKbApp { FuriHalUsbInterface* usb_prev_mode; GapPairing bt_prev_mode; - FuriThread *bt_init_thread; + FuriThread* conn_init_thread; }; typedef enum { From 148d245f1d4bc22bfa6d338abddf42f4c3ac4cf9 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Thu, 2 Mar 2023 02:03:56 +0000 Subject: [PATCH 18/24] BadKB stringdelay and flags getter update --- applications/main/bad_kb/bad_kb_script.c | 76 +++++++++++++++++------- 1 file changed, 55 insertions(+), 21 deletions(-) diff --git a/applications/main/bad_kb/bad_kb_script.c b/applications/main/bad_kb/bad_kb_script.c index 661745cd6..a0ef2f35c 100644 --- a/applications/main/bad_kb/bad_kb_script.c +++ b/applications/main/bad_kb/bad_kb_script.c @@ -61,6 +61,7 @@ struct BadKbScript { FuriString* keyboard_layout; uint32_t defdelay; uint16_t layout[128]; + uint32_t stringdelay; FuriThread* thread; uint8_t file_buf[FILE_BUFFER_LEN + 1]; uint8_t buf_start; @@ -144,6 +145,8 @@ static const char ducky_cmd_delay[] = {"DELAY "}; static const char ducky_cmd_string[] = {"STRING "}; static const char ducky_cmd_defdelay_1[] = {"DEFAULT_DELAY "}; static const char ducky_cmd_defdelay_2[] = {"DEFAULTDELAY "}; +static const char ducky_cmd_stringdelay_1[] = {"STRINGDELAY "}; +static const char ducky_cmd_stringdelay_2[] = {"STRING_DELAY "}; static const char ducky_cmd_repeat[] = {"REPEAT "}; static const char ducky_cmd_sysrq[] = {"SYSRQ "}; @@ -295,6 +298,7 @@ static bool ducky_altstring(BadKbScript* bad_kb, const char* param) { static bool ducky_string(BadKbScript* bad_kb, const char* param) { uint32_t i = 0; + while(param[i] != '\0') { uint16_t keycode = BADKB_ASCII_TO_KEY(bad_kb, param[i]); if(keycode != HID_KEYBOARD_NONE) { @@ -306,9 +310,13 @@ static bool ducky_string(BadKbScript* bad_kb, const char* param) { furi_hal_hid_kb_press(keycode); furi_hal_hid_kb_release(keycode); } + if(bad_kb->stringdelay > 0) { + furi_delay_ms(bad_kb->stringdelay); + } } i++; } + bad_kb->stringdelay = 0; return true; } @@ -370,6 +378,19 @@ static int32_t snprintf(error, error_len, "Invalid number %s", line_tmp); } return (state) ? (0) : SCRIPT_STATE_ERROR; + } else if( + (strncmp(line_tmp, ducky_cmd_stringdelay_1, strlen(ducky_cmd_stringdelay_1)) == 0) || + (strncmp(line_tmp, ducky_cmd_stringdelay_2, strlen(ducky_cmd_stringdelay_2)) == 0)) { + //STRINGDELAY, finally it's here + line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1]; + state = ducky_get_number(line_tmp, &bad_kb->stringdelay); + if((state) && (bad_kb->stringdelay > 0)) { + return state; + } + if(error != NULL) { + snprintf(error, error_len, "Invalid number %s", line_tmp); + } + return SCRIPT_STATE_ERROR; } else if(strncmp(line_tmp, ducky_cmd_string, strlen(ducky_cmd_string)) == 0) { // STRING line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1]; @@ -634,7 +655,7 @@ void bad_kb_config_switch_bonding_mode(BadKbApp *app) { // set bouding mac uint8_t mac[6] = BAD_KB_BOUND_MAC_ADDRESS; furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, GapPairingPinCodeVerifyYesNo); - bt_set_profile_mac_address(app->bt, mac); // this also restart bt + bt_set_profile_mac_address(app->bt, mac); // this also restart bt // enable keys storage bt_enable_peer_key_update(app->bt); } else { @@ -699,6 +720,19 @@ void bad_kb_connection_deinit(BadKbApp* app) { furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, app->bt_prev_mode); } +static uint32_t bad_kb_flags_get(uint32_t flags_mask, uint32_t timeout) { + uint32_t flags = furi_thread_flags_get(); + furi_check((flags & FuriFlagError) == 0); + if(flags == 0) { + flags = furi_thread_flags_wait(flags_mask, FuriFlagWaitAny, timeout); + furi_check(((flags & FuriFlagError) == 0) || (flags == FuriFlagErrorTimeout)); + } else { + uint32_t state = furi_thread_flags_clear(flags); + furi_check((state & FuriFlagError) == 0); + } + return flags; +} + static int32_t bad_kb_worker(void* context) { BadKbScript* bad_kb = context; @@ -747,11 +781,8 @@ static int32_t bad_kb_worker(void* context) { bad_kb->st.state = worker_state; } else if(worker_state == BadKbStateNotConnected) { // State: Not connected - uint32_t flags = furi_thread_flags_wait( - WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, - FuriFlagWaitAny, - FuriWaitForever); - furi_check((flags & FuriFlagError) == 0); + uint32_t flags = bad_kb_flags_get( + WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, FuriWaitForever); if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtConnect) { @@ -762,11 +793,8 @@ static int32_t bad_kb_worker(void* context) { bad_kb->st.state = worker_state; } else if(worker_state == BadKbStateIdle) { // State: ready to start - uint32_t flags = furi_thread_flags_wait( - WorkerEvtEnd | WorkerEvtToggle | WorkerEvtDisconnect, - FuriFlagWaitAny, - FuriWaitForever); - furi_check((flags & FuriFlagError) == 0); + uint32_t flags = bad_kb_flags_get( + WorkerEvtEnd | WorkerEvtToggle | WorkerEvtDisconnect, FuriWaitForever); if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtToggle) { // Start executing script @@ -775,6 +803,7 @@ static int32_t bad_kb_worker(void* context) { bad_kb->buf_len = 0; bad_kb->st.line_cur = 0; bad_kb->defdelay = 0; + bad_kb->stringdelay = 0; bad_kb->repeat_cnt = 0; bad_kb->file_end = false; storage_file_seek(script_file, 0, true); @@ -786,11 +815,8 @@ static int32_t bad_kb_worker(void* context) { bad_kb->st.state = worker_state; } else if(worker_state == BadKbStateWillRun) { // State: start on connection - uint32_t flags = furi_thread_flags_wait( - WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, - FuriFlagWaitAny, - FuriWaitForever); - furi_check((flags & FuriFlagError) == 0); + uint32_t flags = bad_kb_flags_get( + WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, FuriWaitForever); if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtConnect) { // Start executing script @@ -799,16 +825,26 @@ static int32_t bad_kb_worker(void* context) { bad_kb->buf_len = 0; bad_kb->st.line_cur = 0; bad_kb->defdelay = 0; + bad_kb->stringdelay = 0; bad_kb->repeat_cnt = 0; bad_kb->file_end = false; storage_file_seek(script_file, 0, true); // extra time for PC to recognize Flipper as keyboard - furi_thread_flags_wait(0, FuriFlagWaitAny, 1500); + flags = furi_thread_flags_wait( + WorkerEvtEnd | WorkerEvtDisconnect | WorkerEvtToggle, + FuriFlagWaitAny | FuriFlagNoClear, + 1500); + if(flags == FuriFlagErrorTimeout) { + // If nothing happened - start script execution + worker_state = BadKbStateRunning; + } else if(flags & WorkerEvtToggle) { + worker_state = BadKbStateIdle; + furi_thread_flags_clear(WorkerEvtToggle); + } if(bad_kb->bt) { update_bt_timeout(bad_kb->bt); } bad_kb_script_set_keyboard_layout(bad_kb, bad_kb->keyboard_layout); - worker_state = BadKbStateRunning; } else if(flags & WorkerEvtToggle) { // Cancel scheduled execution worker_state = BadKbStateNotConnected; } @@ -873,9 +909,7 @@ static int32_t bad_kb_worker(void* context) { } else if( (worker_state == BadKbStateFileError) || (worker_state == BadKbStateScriptError)) { // State: error - uint32_t flags = furi_thread_flags_wait( - WorkerEvtEnd, FuriFlagWaitAny, FuriWaitForever); // Waiting for exit command - furi_check((flags & FuriFlagError) == 0); + uint32_t flags = bad_kb_flags_get(WorkerEvtEnd, FuriWaitForever); // Waiting for exit command if(flags & WorkerEvtEnd) { break; } From 5544099cbeed0712089a8911bdf07a7b0b41e37c Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Thu, 2 Mar 2023 02:15:16 +0000 Subject: [PATCH 19/24] BadKB update interface and inputs --- applications/main/bad_kb/bad_kb_script.c | 4 ++-- .../main/bad_kb/scenes/bad_kb_scene_work.c | 10 ++++---- applications/main/bad_kb/views/bad_kb_view.c | 24 ++++++++++++++----- applications/main/bad_kb/views/bad_kb_view.h | 2 ++ 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/applications/main/bad_kb/bad_kb_script.c b/applications/main/bad_kb/bad_kb_script.c index a0ef2f35c..b1bc13482 100644 --- a/applications/main/bad_kb/bad_kb_script.c +++ b/applications/main/bad_kb/bad_kb_script.c @@ -725,7 +725,7 @@ static uint32_t bad_kb_flags_get(uint32_t flags_mask, uint32_t timeout) { furi_check((flags & FuriFlagError) == 0); if(flags == 0) { flags = furi_thread_flags_wait(flags_mask, FuriFlagWaitAny, timeout); - furi_check(((flags & FuriFlagError) == 0) || (flags == FuriFlagErrorTimeout)); + furi_check(((flags & FuriFlagError) == 0) || (flags == (unsigned)FuriFlagErrorTimeout)); } else { uint32_t state = furi_thread_flags_clear(flags); furi_check((state & FuriFlagError) == 0); @@ -834,7 +834,7 @@ static int32_t bad_kb_worker(void* context) { WorkerEvtEnd | WorkerEvtDisconnect | WorkerEvtToggle, FuriFlagWaitAny | FuriFlagNoClear, 1500); - if(flags == FuriFlagErrorTimeout) { + if(flags == (unsigned)FuriFlagErrorTimeout) { // If nothing happened - start script execution worker_state = BadKbStateRunning; } else if(flags & WorkerEvtToggle) { diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_work.c b/applications/main/bad_kb/scenes/bad_kb_scene_work.c index 165ee0289..e962f9132 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_work.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_work.c @@ -16,10 +16,12 @@ bool bad_kb_scene_work_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(event.event == InputKeyLeft) { - if(app->is_bt) { - scene_manager_next_scene(app->scene_manager, BadKbSceneConfigBt); - } else { - scene_manager_next_scene(app->scene_manager, BadKbSceneConfigUsb); + if(bad_kb_is_idle_state(app->bad_kb_view)) { + if(app->is_bt) { + scene_manager_next_scene(app->scene_manager, BadKbSceneConfigBt); + } else { + scene_manager_next_scene(app->scene_manager, BadKbSceneConfigUsb); + } } consumed = true; } else if(event.event == InputKeyOk) { diff --git a/applications/main/bad_kb/views/bad_kb_view.c b/applications/main/bad_kb/views/bad_kb_view.c index 3f5ec131d..5997d4ccb 100644 --- a/applications/main/bad_kb/views/bad_kb_view.c +++ b/applications/main/bad_kb/views/bad_kb_view.c @@ -56,19 +56,15 @@ static void bad_kb_draw_callback(Canvas* canvas, void* _model) { if(XTREME_ASSETS()->is_nsfw) { elements_button_center(canvas, "Cum"); } else { - elements_button_center(canvas, "Start"); + elements_button_center(canvas, "Run"); } + elements_button_left(canvas, "Config"); } else if((model->state.state == BadKbStateRunning) || (model->state.state == BadKbStateDelay)) { elements_button_center(canvas, "Stop"); } else if(model->state.state == BadKbStateWillRun) { elements_button_center(canvas, "Cancel"); } - if((model->state.state == BadKbStateNotConnected) || (model->state.state == BadKbStateIdle) || - (model->state.state == BadKbStateDone)) { - elements_button_left(canvas, "Config"); - } - if(model->state.state == BadKbStateNotConnected) { canvas_draw_icon(canvas, 4, 26, &I_Clock_18x18); canvas_set_font(canvas, FontPrimary); @@ -236,3 +232,19 @@ void bad_kb_set_state(BadKb* bad_kb, BadKbState* st) { }, true); } + +bool bad_kb_is_idle_state(BadKb* bad_kb) { + bool is_idle = false; + with_view_model( + bad_kb->view, + BadKbModel * model, + { + if((model->state.state == BadKbStateIdle) || + (model->state.state == BadKbStateDone) || + (model->state.state == BadKbStateNotConnected)) { + is_idle = true; + } + }, + false); + return is_idle; +} diff --git a/applications/main/bad_kb/views/bad_kb_view.h b/applications/main/bad_kb/views/bad_kb_view.h index 24fdf4792..f16814bb4 100644 --- a/applications/main/bad_kb/views/bad_kb_view.h +++ b/applications/main/bad_kb/views/bad_kb_view.h @@ -19,3 +19,5 @@ void bad_kb_set_file_name(BadKb* bad_kb, const char* name); void bad_kb_set_layout(BadKb* bad_kb, const char* layout); void bad_kb_set_state(BadKb* bad_kb, BadKbState* st); + +bool bad_kb_is_idle_state(BadKb* bad_kb); From cadf868030e0b0584b9b41b649f82de1f549e2b8 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Thu, 2 Mar 2023 02:48:01 +0000 Subject: [PATCH 20/24] Save BadBT remember/forget device setting + fixes --- applications/main/bad_kb/bad_kb_app.c | 2 +- applications/main/bad_kb/bad_kb_app_i.h | 6 +---- applications/main/bad_kb/bad_kb_script.c | 16 +++++++------ applications/main/bad_kb/bad_kb_script.h | 2 +- .../bad_kb/scenes/bad_kb_scene_config_bt.c | 24 ++++++++++--------- .../scenes/xtreme_app_scene_protocols.c | 13 ++++++++++ applications/services/xtreme/settings.c | 1 + applications/services/xtreme/settings.h | 3 ++- 8 files changed, 41 insertions(+), 26 deletions(-) diff --git a/applications/main/bad_kb/bad_kb_app.c b/applications/main/bad_kb/bad_kb_app.c index bfb5a3d6d..4b3dd9fc6 100644 --- a/applications/main/bad_kb/bad_kb_app.c +++ b/applications/main/bad_kb/bad_kb_app.c @@ -107,7 +107,7 @@ BadKbApp* bad_kb_app_alloc(char* arg) { Bt* bt = furi_record_open(RECORD_BT); app->bt = bt; app->is_bt = XTREME_SETTINGS()->bad_bt; - app->bonding = BondingForgetDevices; + app->bt_remember = XTREME_SETTINGS()->bad_bt_remember; const char* adv_name = furi_hal_bt_get_profile_adv_name(FuriHalBtProfileHidKeyboard); memcpy(app->name, adv_name, BAD_KB_ADV_NAME_MAX_LEN); memcpy(app->bt_old_config.name, adv_name, BAD_KB_ADV_NAME_MAX_LEN); diff --git a/applications/main/bad_kb/bad_kb_app_i.h b/applications/main/bad_kb/bad_kb_app_i.h index ac79205b5..88a770ff8 100644 --- a/applications/main/bad_kb/bad_kb_app_i.h +++ b/applications/main/bad_kb/bad_kb_app_i.h @@ -40,10 +40,6 @@ typedef enum BadKbCustomEvent { BadKbCustomEventErrorBack } BadKbCustomEvent; - -#define BondingForgetDevices false -#define BondingRememberDevices true - typedef struct { //uint8_t bounded_mac[BAD_KB_MAC_ADDRESS_LEN]; uint8_t mac[BAD_KB_MAC_ADDRESS_LEN]; @@ -65,7 +61,7 @@ struct BadKbApp { ByteInput* byte_input; uint8_t mac[BAD_KB_MAC_ADDRESS_LEN]; char name[BAD_KB_ADV_NAME_MAX_LEN + 1]; - bool bonding; // weither we remember paired devices or not + bool bt_remember; // weither we remember paired devices or not BadKbBtConfig bt_old_config; BadKbAppError error; diff --git a/applications/main/bad_kb/bad_kb_script.c b/applications/main/bad_kb/bad_kb_script.c index b1bc13482..d86bd9649 100644 --- a/applications/main/bad_kb/bad_kb_script.c +++ b/applications/main/bad_kb/bad_kb_script.c @@ -650,8 +650,8 @@ void bad_kb_config_switch_mode(BadKbApp* app) { } } -void bad_kb_config_switch_bonding_mode(BadKbApp *app) { - if (app->bonding) { +void bad_kb_config_switch_remember_mode(BadKbApp *app) { + if (app->bt_remember) { // set bouding mac uint8_t mac[6] = BAD_KB_BOUND_MAC_ADDRESS; furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, GapPairingPinCodeVerifyYesNo); @@ -676,7 +676,7 @@ int32_t bad_kb_connection_init(BadKbApp* app) { // furi_delay_ms(200); bt_keys_storage_set_storage_path(app->bt, BAD_KB_APP_PATH_BOUND_KEYS_FILE); app->bt_prev_mode = furi_hal_bt_get_profile_pairing_method(FuriHalBtProfileHidKeyboard); - if (app->bonding) { // usefull if bounding become an XTREME setting + if (app->bt_remember) { uint8_t mac[6] = BAD_KB_BOUND_MAC_ADDRESS; furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, mac); // using GapPairingNone breaks bounding between devices @@ -688,8 +688,11 @@ int32_t bad_kb_connection_init(BadKbApp* app) { bt_set_profile(app->bt, BtProfileHidKeyboard); if(app->is_bt) { furi_hal_bt_start_advertising(); - if (!app->bonding) + if (app->bt_remember) { + bt_enable_peer_key_update(app->bt); + } else { bt_disable_peer_key_update(app->bt); // disable peer key adding to bt SRAM storage + } } else { furi_hal_bt_stop_advertising(); } @@ -708,12 +711,11 @@ void bad_kb_connection_deinit(BadKbApp* app) { bt_disconnect(app->bt); // stop ble // furi_delay_ms(200); // Wait 2nd core to update nvm storage bt_keys_storage_set_default_path(app->bt); - if (app->bonding) { + if (app->bt_remember) { // hal primitives doesn't restarts ble, that's what we want cuz we are shutting down furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, app->mac); - }else { - bt_enable_peer_key_update(app->bt); // starts saving peer keys (bounded devices) } + bt_enable_peer_key_update(app->bt); // starts saving peer keys (bounded devices) // fails if ble radio stack isn't ready when switching profile // if it happens, maybe we should increase the delay after bt_disconnect bt_set_profile(app->bt, BtProfileSerial); diff --git a/applications/main/bad_kb/bad_kb_script.h b/applications/main/bad_kb/bad_kb_script.h index ad8618658..bf4d2ee00 100644 --- a/applications/main/bad_kb/bad_kb_script.h +++ b/applications/main/bad_kb/bad_kb_script.h @@ -36,7 +36,7 @@ typedef struct { void bad_kb_config_switch_mode(BadKbApp* app); -void bad_kb_config_switch_bonding_mode(BadKbApp *app); +void bad_kb_config_switch_remember_mode(BadKbApp *app); int32_t bad_kb_connection_init(BadKbApp* app); diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c index 02b20a761..e41f3d136 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c @@ -5,7 +5,7 @@ enum VarItemListIndex { VarItemListIndexConnection, - VarItemListIndexBonding, + VarItemListIndexRemember, VarItemListIndexKeyboardLayout, VarItemListIndexAdvertisementName, VarItemListIndexMacAddress, @@ -22,9 +22,11 @@ void bad_kb_scene_config_bt_connection_callback(VariableItem* item) { void bad_kb_scene_config_bt_bounding_callback(VariableItem* item) { BadKbApp* bad_kb = variable_item_get_context(item); - bad_kb->bonding = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, bad_kb->bonding ? "Remember" : "Forget"); - view_dispatcher_send_custom_event(bad_kb->view_dispatcher, VarItemListIndexBonding); + bad_kb->bt_remember = variable_item_get_current_value_index(item); + XTREME_SETTINGS()->bad_bt_remember = bad_kb->bt_remember; + XTREME_SETTINGS_SAVE(); + variable_item_set_current_value_text(item, bad_kb->bt_remember ? "ON" : "OFF"); + view_dispatcher_send_custom_event(bad_kb->view_dispatcher, VarItemListIndexRemember); } void bad_kb_scene_config_bt_var_item_list_callback(void* context, uint32_t index) { @@ -43,16 +45,16 @@ void bad_kb_scene_config_bt_on_enter(void* context) { variable_item_set_current_value_text(item, bad_kb->is_bt ? "BT" : "USB"); item = variable_item_list_add( - var_item_list, "Bonding", 2, bad_kb_scene_config_bt_bounding_callback, bad_kb); - variable_item_set_current_value_index(item, bad_kb->bonding); - variable_item_set_current_value_text(item, bad_kb->bonding ? "Remember" : "Forget"); + var_item_list, "Remember", 2, bad_kb_scene_config_bt_bounding_callback, bad_kb); + variable_item_set_current_value_index(item, bad_kb->bt_remember); + variable_item_set_current_value_text(item, bad_kb->bt_remember ? "ON" : "OFF"); item = variable_item_list_add(var_item_list, "Keyboard layout", 0, NULL, bad_kb); item = variable_item_list_add(var_item_list, "BT device name", 0, NULL, bad_kb); - + // this doesn't update instantly when toggling between Bounding modes - if (!bad_kb->bonding) { + if (!bad_kb->bt_remember) { item = variable_item_list_add(var_item_list, "BT MAC address", 0, NULL, bad_kb); } @@ -73,8 +75,8 @@ bool bad_kb_scene_config_bt_on_event(void* context, SceneManagerEvent event) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigLayout); } else if(event.event == VarItemListIndexConnection) { bad_kb_config_switch_mode(bad_kb); - } else if (event.event == VarItemListIndexBonding) { - bad_kb_config_switch_bonding_mode(bad_kb); + } else if (event.event == VarItemListIndexRemember) { + bad_kb_config_switch_remember_mode(bad_kb); scene_manager_previous_scene(bad_kb->scene_manager); scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigBt); } else if(event.event == VarItemListIndexAdvertisementName) { diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols.c index 0350785e7..e0bc53d29 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols.c @@ -8,6 +8,14 @@ static void xtreme_app_scene_protocols_bad_bk_mode_changed(VariableItem* item) { app->save_settings = true; } +static void xtreme_app_scene_protocols_bad_bt_remember_changed(VariableItem* item) { + XtremeApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + XTREME_SETTINGS()->bad_bt_remember = value; + app->save_settings = true; +} + static void xtreme_app_scene_protocols_subghz_extend_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); app->subghz_extend = variable_item_get_current_value_index(item); @@ -33,6 +41,11 @@ void xtreme_app_scene_protocols_on_enter(void* context) { variable_item_set_current_value_index(item, xtreme_settings->bad_bt); variable_item_set_current_value_text(item, xtreme_settings->bad_bt ? "BT" : "USB"); + item = variable_item_list_add( + var_item_list, "Bad BT Remember", 2, xtreme_app_scene_protocols_bad_bt_remember_changed, app); + variable_item_set_current_value_index(item, xtreme_settings->bad_bt_remember); + variable_item_set_current_value_text(item, xtreme_settings->bad_bt_remember ? "ON" : "OFF"); + item = variable_item_list_add( var_item_list, "SubGHz Extend", 2, xtreme_app_scene_protocols_subghz_extend_changed, app); variable_item_set_current_value_index(item, app->subghz_extend); diff --git a/applications/services/xtreme/settings.c b/applications/services/xtreme/settings.c index 8036c8d58..881ab8950 100644 --- a/applications/services/xtreme/settings.c +++ b/applications/services/xtreme/settings.c @@ -39,6 +39,7 @@ void XTREME_SETTINGS_LOAD() { xtreme_settings->bar_borders = true; // ON xtreme_settings->bar_background = false; // OFF xtreme_settings->bad_bt = false; // USB + xtreme_settings->bad_bt_remember = false; // OFF xtreme_settings->butthurt_timer = 43200; // 12 H xtreme_settings->sort_dirs_first = true; // ON xtreme_settings->dark_mode = false; // OFF diff --git a/applications/services/xtreme/settings.h b/applications/services/xtreme/settings.h index b870235ec..87f64bb54 100644 --- a/applications/services/xtreme/settings.h +++ b/applications/services/xtreme/settings.h @@ -11,7 +11,7 @@ #define MAX_PACK_NAME_LEN 32 -#define XTREME_SETTINGS_VERSION (4) +#define XTREME_SETTINGS_VERSION (5) #define XTREME_SETTINGS_PATH INT_PATH(XTREME_SETTINGS_FILE_NAME) #define XTREME_SETTINGS_MAGIC (0x69) @@ -28,6 +28,7 @@ typedef struct { bool bar_borders; bool bar_background; bool bad_bt; + bool bad_bt_remember; int32_t butthurt_timer; bool sort_dirs_first; bool dark_mode; From 48fac2921006b6096e776e6b8d0acd0384bdc6a5 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Thu, 2 Mar 2023 20:00:18 +0000 Subject: [PATCH 21/24] Format --- applications/main/bad_kb/bad_kb_app.c | 3 ++- applications/main/bad_kb/bad_kb_app_i.h | 10 ++++----- applications/main/bad_kb/bad_kb_script.c | 21 +++++++++++-------- applications/main/bad_kb/bad_kb_script.h | 2 +- .../bad_kb/scenes/bad_kb_scene_config_bt.c | 4 ++-- applications/main/bad_kb/views/bad_kb_view.c | 3 +-- .../scenes/xtreme_app_scene_protocols.c | 6 +++++- 7 files changed, 28 insertions(+), 21 deletions(-) diff --git a/applications/main/bad_kb/bad_kb_app.c b/applications/main/bad_kb/bad_kb_app.c index 4b3dd9fc6..40bb87a60 100644 --- a/applications/main/bad_kb/bad_kb_app.c +++ b/applications/main/bad_kb/bad_kb_app.c @@ -151,7 +151,8 @@ BadKbApp* bad_kb_app_alloc(char* arg) { app->error = BadKbAppErrorCloseRpc; scene_manager_next_scene(app->scene_manager, BadKbSceneError); } else { - app->conn_init_thread = furi_thread_alloc_ex("BadKbConnInit", 512, (FuriThreadCallback)bad_kb_connection_init, app); + app->conn_init_thread = furi_thread_alloc_ex( + "BadKbConnInit", 512, (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); diff --git a/applications/main/bad_kb/bad_kb_app_i.h b/applications/main/bad_kb/bad_kb_app_i.h index 88a770ff8..b7194ac3c 100644 --- a/applications/main/bad_kb/bad_kb_app_i.h +++ b/applications/main/bad_kb/bad_kb_app_i.h @@ -19,15 +19,15 @@ #define BAD_KB_APP_BASE_FOLDER ANY_PATH("badkb") #define BAD_KB_APP_PATH_LAYOUT_FOLDER BAD_KB_APP_BASE_FOLDER "/assets/layouts" #define BAD_KB_APP_PATH_BOUND_KEYS_FOLDER EXT_PATH("badkb/.bt_keys") -#define BAD_KB_APP_PATH_BOUND_KEYS_FILE BAD_KB_APP_PATH_BOUND_KEYS_FOLDER "/.devices.keys" +#define BAD_KB_APP_PATH_BOUND_KEYS_FILE BAD_KB_APP_PATH_BOUND_KEYS_FOLDER "/.devices.keys" #define BAD_KB_APP_SCRIPT_EXTENSION ".txt" #define BAD_KB_APP_LAYOUT_EXTENSION ".kl" -#define BAD_KB_MAC_ADDRESS_LEN 6 // need replace with MAC size maccro -#define BAD_KB_ADV_NAME_MAX_LEN 18 +#define BAD_KB_MAC_ADDRESS_LEN 6 // need replace with MAC size maccro +#define BAD_KB_ADV_NAME_MAX_LEN 18 // this is the MAC address used when we do not forget paired device (BOUND STATE) -#define BAD_KB_BOUND_MAC_ADDRESS { 0x41, 0x4a, 0xef, 0xb6, 0xa9, 0xd4 }; +#define BAD_KB_BOUND_MAC_ADDRESS {0x41, 0x4a, 0xef, 0xb6, 0xa9, 0xd4}; typedef enum { BadKbAppErrorNoFiles, @@ -61,7 +61,7 @@ struct BadKbApp { ByteInput* byte_input; uint8_t mac[BAD_KB_MAC_ADDRESS_LEN]; char name[BAD_KB_ADV_NAME_MAX_LEN + 1]; - bool bt_remember; // weither we remember paired devices or not + bool bt_remember; // weither we remember paired devices or not BadKbBtConfig bt_old_config; BadKbAppError error; diff --git a/applications/main/bad_kb/bad_kb_script.c b/applications/main/bad_kb/bad_kb_script.c index d86bd9649..f712957e4 100644 --- a/applications/main/bad_kb/bad_kb_script.c +++ b/applications/main/bad_kb/bad_kb_script.c @@ -650,12 +650,13 @@ void bad_kb_config_switch_mode(BadKbApp* app) { } } -void bad_kb_config_switch_remember_mode(BadKbApp *app) { - if (app->bt_remember) { +void bad_kb_config_switch_remember_mode(BadKbApp* app) { + if(app->bt_remember) { // set bouding mac uint8_t mac[6] = BAD_KB_BOUND_MAC_ADDRESS; - furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, GapPairingPinCodeVerifyYesNo); - bt_set_profile_mac_address(app->bt, mac); // this also restart bt + furi_hal_bt_set_profile_pairing_method( + FuriHalBtProfileHidKeyboard, GapPairingPinCodeVerifyYesNo); + bt_set_profile_mac_address(app->bt, mac); // this also restart bt // enable keys storage bt_enable_peer_key_update(app->bt); } else { @@ -676,11 +677,12 @@ int32_t bad_kb_connection_init(BadKbApp* app) { // furi_delay_ms(200); bt_keys_storage_set_storage_path(app->bt, BAD_KB_APP_PATH_BOUND_KEYS_FILE); app->bt_prev_mode = furi_hal_bt_get_profile_pairing_method(FuriHalBtProfileHidKeyboard); - if (app->bt_remember) { + if(app->bt_remember) { uint8_t mac[6] = BAD_KB_BOUND_MAC_ADDRESS; furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, mac); // using GapPairingNone breaks bounding between devices - furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, GapPairingPinCodeVerifyYesNo); + furi_hal_bt_set_profile_pairing_method( + FuriHalBtProfileHidKeyboard, GapPairingPinCodeVerifyYesNo); } else { furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, GapPairingNone); } @@ -688,7 +690,7 @@ int32_t bad_kb_connection_init(BadKbApp* app) { bt_set_profile(app->bt, BtProfileHidKeyboard); if(app->is_bt) { furi_hal_bt_start_advertising(); - if (app->bt_remember) { + if(app->bt_remember) { bt_enable_peer_key_update(app->bt); } else { bt_disable_peer_key_update(app->bt); // disable peer key adding to bt SRAM storage @@ -711,7 +713,7 @@ void bad_kb_connection_deinit(BadKbApp* app) { bt_disconnect(app->bt); // stop ble // furi_delay_ms(200); // Wait 2nd core to update nvm storage bt_keys_storage_set_default_path(app->bt); - if (app->bt_remember) { + if(app->bt_remember) { // hal primitives doesn't restarts ble, that's what we want cuz we are shutting down furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, app->mac); } @@ -911,7 +913,8 @@ static int32_t bad_kb_worker(void* context) { } else if( (worker_state == BadKbStateFileError) || (worker_state == BadKbStateScriptError)) { // State: error - uint32_t flags = bad_kb_flags_get(WorkerEvtEnd, FuriWaitForever); // Waiting for exit command + uint32_t flags = + bad_kb_flags_get(WorkerEvtEnd, FuriWaitForever); // Waiting for exit command if(flags & WorkerEvtEnd) { break; } diff --git a/applications/main/bad_kb/bad_kb_script.h b/applications/main/bad_kb/bad_kb_script.h index bf4d2ee00..a724971ec 100644 --- a/applications/main/bad_kb/bad_kb_script.h +++ b/applications/main/bad_kb/bad_kb_script.h @@ -36,7 +36,7 @@ typedef struct { void bad_kb_config_switch_mode(BadKbApp* app); -void bad_kb_config_switch_remember_mode(BadKbApp *app); +void bad_kb_config_switch_remember_mode(BadKbApp* app); int32_t bad_kb_connection_init(BadKbApp* app); diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c index e41f3d136..70dde9e16 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c @@ -54,7 +54,7 @@ void bad_kb_scene_config_bt_on_enter(void* context) { item = variable_item_list_add(var_item_list, "BT device name", 0, NULL, bad_kb); // this doesn't update instantly when toggling between Bounding modes - if (!bad_kb->bt_remember) { + if(!bad_kb->bt_remember) { item = variable_item_list_add(var_item_list, "BT MAC address", 0, NULL, bad_kb); } @@ -75,7 +75,7 @@ bool bad_kb_scene_config_bt_on_event(void* context, SceneManagerEvent event) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigLayout); } else if(event.event == VarItemListIndexConnection) { bad_kb_config_switch_mode(bad_kb); - } else if (event.event == VarItemListIndexRemember) { + } else if(event.event == VarItemListIndexRemember) { bad_kb_config_switch_remember_mode(bad_kb); scene_manager_previous_scene(bad_kb->scene_manager); scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigBt); diff --git a/applications/main/bad_kb/views/bad_kb_view.c b/applications/main/bad_kb/views/bad_kb_view.c index 5997d4ccb..26ec90809 100644 --- a/applications/main/bad_kb/views/bad_kb_view.c +++ b/applications/main/bad_kb/views/bad_kb_view.c @@ -239,8 +239,7 @@ bool bad_kb_is_idle_state(BadKb* bad_kb) { bad_kb->view, BadKbModel * model, { - if((model->state.state == BadKbStateIdle) || - (model->state.state == BadKbStateDone) || + if((model->state.state == BadKbStateIdle) || (model->state.state == BadKbStateDone) || (model->state.state == BadKbStateNotConnected)) { is_idle = true; } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols.c index e0bc53d29..47027d9d8 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols.c @@ -42,7 +42,11 @@ void xtreme_app_scene_protocols_on_enter(void* context) { variable_item_set_current_value_text(item, xtreme_settings->bad_bt ? "BT" : "USB"); item = variable_item_list_add( - var_item_list, "Bad BT Remember", 2, xtreme_app_scene_protocols_bad_bt_remember_changed, app); + var_item_list, + "Bad BT Remember", + 2, + xtreme_app_scene_protocols_bad_bt_remember_changed, + app); variable_item_set_current_value_index(item, xtreme_settings->bad_bt_remember); variable_item_set_current_value_text(item, xtreme_settings->bad_bt_remember ? "ON" : "OFF"); From 5ad65dfb780b207efeadb900ac320325f7be1ab7 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Thu, 2 Mar 2023 21:06:12 +0000 Subject: [PATCH 22/24] Bad BT paring pin handling improvements --- applications/main/bad_kb/bad_kb_app.c | 2 ++ applications/services/bt/bt_service/bt.c | 9 ++++++--- applications/services/bt/bt_service/bt_i.h | 1 + 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/applications/main/bad_kb/bad_kb_app.c b/applications/main/bad_kb/bad_kb_app.c index 40bb87a60..71a3ccace 100644 --- a/applications/main/bad_kb/bad_kb_app.c +++ b/applications/main/bad_kb/bad_kb_app.c @@ -106,6 +106,7 @@ BadKbApp* bad_kb_app_alloc(char* arg) { Bt* bt = furi_record_open(RECORD_BT); app->bt = bt; + app->bt->suppress_pin_screen = true; app->is_bt = XTREME_SETTINGS()->bad_bt; app->bt_remember = XTREME_SETTINGS()->bad_bt_remember; const char* adv_name = furi_hal_bt_get_profile_adv_name(FuriHalBtProfileHidKeyboard); @@ -210,6 +211,7 @@ void bad_kb_app_free(BadKbApp* app) { if(memcmp(app->bt_old_config.mac, app->mac, BAD_KB_MAC_ADDRESS_LEN) != 0) { furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, app->bt_old_config.mac); } + app->bt->suppress_pin_screen = false; // Close records furi_record_close(RECORD_GUI); diff --git a/applications/services/bt/bt_service/bt.c b/applications/services/bt/bt_service/bt.c index ece02bb46..31a43f637 100644 --- a/applications/services/bt/bt_service/bt.c +++ b/applications/services/bt/bt_service/bt.c @@ -61,8 +61,11 @@ static ViewPort* bt_pin_code_view_port_alloc(Bt* bt) { } static void bt_pin_code_show(Bt* bt, uint32_t pin_code) { + furi_assert(bt); bt->pin_code = pin_code; notification_message(bt->notification, &sequence_display_backlight_on); + if(bt->suppress_pin_screen) return; + gui_view_port_send_to_front(bt->gui, bt->pin_code_view_port); view_port_enabled_set(bt->pin_code_view_port, true); } @@ -76,10 +79,10 @@ static void bt_pin_code_hide(Bt* bt) { static bool bt_pin_code_verify_event_handler(Bt* bt, uint32_t pin) { furi_assert(bt); - - if(bt_get_profile_pairing_method(bt) == GapPairingNone) return true; - + bt->pin_code = pin; notification_message(bt->notification, &sequence_display_backlight_on); + if(bt->suppress_pin_screen) return true; + FuriString* pin_str; dialog_message_set_icon(bt->dialog_message, XTREME_ASSETS()->I_BLE_Pairing_128x64, 0, 0); pin_str = furi_string_alloc_printf("Verify code\n%06lu", pin); diff --git a/applications/services/bt/bt_service/bt_i.h b/applications/services/bt/bt_service/bt_i.h index 8b81b6e51..41e5bcd8c 100644 --- a/applications/services/bt/bt_service/bt_i.h +++ b/applications/services/bt/bt_service/bt_i.h @@ -77,4 +77,5 @@ struct Bt { BtStatusChangedCallback status_changed_cb; void* status_changed_ctx; uint32_t pin; + bool suppress_pin_screen; }; From f33b1d52f0e045effdf40162e6be7ae2baca3006 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Thu, 2 Mar 2023 21:06:56 +0000 Subject: [PATCH 23/24] Bad BT remember device behavior improvements --- applications/main/bad_kb/bad_kb_script.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/applications/main/bad_kb/bad_kb_script.c b/applications/main/bad_kb/bad_kb_script.c index f712957e4..b91f36b9f 100644 --- a/applications/main/bad_kb/bad_kb_script.c +++ b/applications/main/bad_kb/bad_kb_script.c @@ -636,10 +636,13 @@ static void bad_kb_usb_hid_state_callback(bool state, void* context) { } } -void bad_kb_config_switch_mode(BadKbApp* app) { +void bad_kb_reload_worker(BadKbApp* app) { bad_kb_script_close(app->bad_kb_script); app->bad_kb_script = bad_kb_script_open(app->file_path, app->is_bt ? app->bt : NULL); bad_kb_script_set_keyboard_layout(app->bad_kb_script, app->keyboard_layout); +} + +void bad_kb_config_switch_mode(BadKbApp* app) { scene_manager_previous_scene(app->scene_manager); if(app->is_bt) { furi_hal_bt_start_advertising(); @@ -648,6 +651,7 @@ void bad_kb_config_switch_mode(BadKbApp* app) { furi_hal_bt_stop_advertising(); scene_manager_next_scene(app->scene_manager, BadKbSceneConfigUsb); } + bad_kb_reload_worker(app); } void bad_kb_config_switch_remember_mode(BadKbApp* app) { @@ -666,6 +670,7 @@ void bad_kb_config_switch_remember_mode(BadKbApp* app) { // disable key storage bt_disable_peer_key_update(app->bt); } + bad_kb_reload_worker(app); } int32_t bad_kb_connection_init(BadKbApp* app) { From 0177d12a863b62ed381e8848c14366d895a973d9 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Thu, 2 Mar 2023 23:24:32 +0000 Subject: [PATCH 24/24] Fix badkb connection init failure handling --- applications/main/bad_kb/bad_kb_app.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/applications/main/bad_kb/bad_kb_app.c b/applications/main/bad_kb/bad_kb_app.c index 71a3ccace..2934a50c2 100644 --- a/applications/main/bad_kb/bad_kb_app.c +++ b/applications/main/bad_kb/bad_kb_app.c @@ -150,6 +150,7 @@ BadKbApp* bad_kb_app_alloc(char* arg) { if(furi_hal_usb_is_locked()) { app->error = BadKbAppErrorCloseRpc; + app->conn_init_thread = NULL; scene_manager_next_scene(app->scene_manager, BadKbSceneError); } else { app->conn_init_thread = furi_thread_alloc_ex( @@ -224,9 +225,11 @@ void bad_kb_app_free(BadKbApp* app) { furi_string_free(app->file_path); furi_string_free(app->keyboard_layout); - furi_thread_join(app->conn_init_thread); + if(app->conn_init_thread) { + furi_thread_join(app->conn_init_thread); + furi_thread_free(app->conn_init_thread); + } bad_kb_connection_deinit(app); - furi_thread_free(app->conn_init_thread); free(app); }