|
|
@@ -1,6 +1,6 @@
|
|
|
#include "bt_type_code.h"
|
|
|
#include <furi_hal_bt.h>
|
|
|
-#include <furi_hal_bt_hid.h>
|
|
|
+#include <extra_profiles/hid_profile.h>
|
|
|
#include <furi_hal_version.h>
|
|
|
#include <furi/core/thread.h>
|
|
|
#include <furi/core/mutex.h>
|
|
|
@@ -14,11 +14,6 @@
|
|
|
#include "../../config/app/config.h"
|
|
|
#include "../../services/config/constants.h"
|
|
|
|
|
|
-#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_XTREME_UL
|
|
|
-#define TOTP_BT_WORKER_BT_ADV_NAME_MAX_LEN FURI_HAL_BT_ADV_NAME_LENGTH
|
|
|
-#define TOTP_BT_WORKER_BT_MAC_ADDRESS_LEN GAP_MAC_ADDR_SIZE
|
|
|
-#endif
|
|
|
-
|
|
|
#define HID_BT_KEYS_STORAGE_PATH CONFIG_FILE_DIRECTORY_PATH "/.bt_hid.keys"
|
|
|
|
|
|
struct TotpBtTypeCodeWorkerContext {
|
|
|
@@ -28,12 +23,9 @@ struct TotpBtTypeCodeWorkerContext {
|
|
|
FuriThread* thread;
|
|
|
FuriMutex* code_buffer_sync;
|
|
|
Bt* bt;
|
|
|
+ FuriHalBleProfileBase* ble_hid_profile;
|
|
|
bool is_advertising;
|
|
|
bool is_connected;
|
|
|
-#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_XTREME_UL
|
|
|
- char previous_bt_name[TOTP_BT_WORKER_BT_ADV_NAME_MAX_LEN];
|
|
|
- uint8_t previous_bt_mac[TOTP_BT_WORKER_BT_MAC_ADDRESS_LEN];
|
|
|
-#endif
|
|
|
AutomationKeyboardLayout keyboard_layout;
|
|
|
uint16_t initial_delay;
|
|
|
};
|
|
|
@@ -42,25 +34,15 @@ static inline bool totp_type_code_worker_stop_requested() {
|
|
|
return furi_thread_flags_get() & TotpBtTypeCodeWorkerEventStop;
|
|
|
}
|
|
|
|
|
|
-#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_XTREME_UL
|
|
|
-static void totp_type_code_worker_bt_set_app_mac(uint8_t* mac) {
|
|
|
- uint8_t max_i;
|
|
|
- size_t uid_size = furi_hal_version_uid_size();
|
|
|
- if(uid_size < TOTP_BT_WORKER_BT_MAC_ADDRESS_LEN) {
|
|
|
- max_i = uid_size;
|
|
|
- } else {
|
|
|
- max_i = TOTP_BT_WORKER_BT_MAC_ADDRESS_LEN;
|
|
|
- }
|
|
|
-
|
|
|
- const uint8_t* uid = (const uint8_t*)UID64_BASE; //-V566
|
|
|
- memcpy(mac, uid, max_i);
|
|
|
- for(uint8_t i = max_i; i < TOTP_BT_WORKER_BT_MAC_ADDRESS_LEN; i++) {
|
|
|
- mac[i] = 0;
|
|
|
- }
|
|
|
+static bool hid_key_press(uint16_t button, void* context) {
|
|
|
+ FuriHalBleProfileBase* profile = context;
|
|
|
+ return ble_profile_hid_kb_press(profile, button);
|
|
|
+}
|
|
|
|
|
|
- mac[0] = 0b10;
|
|
|
+static bool hid_key_release(uint16_t button, void* context) {
|
|
|
+ FuriHalBleProfileBase* profile = context;
|
|
|
+ return ble_profile_hid_kb_release(profile, button);
|
|
|
}
|
|
|
-#endif
|
|
|
|
|
|
static void totp_type_code_worker_type_code(TotpBtTypeCodeWorkerContext* context) {
|
|
|
uint8_t i = 0;
|
|
|
@@ -72,13 +54,14 @@ static void totp_type_code_worker_type_code(TotpBtTypeCodeWorkerContext* context
|
|
|
if(context->is_connected &&
|
|
|
furi_mutex_acquire(context->code_buffer_sync, 500) == FuriStatusOk) {
|
|
|
totp_type_code_worker_execute_automation(
|
|
|
- &furi_hal_bt_hid_kb_press,
|
|
|
- &furi_hal_bt_hid_kb_release,
|
|
|
+ &hid_key_press,
|
|
|
+ &hid_key_release,
|
|
|
context->code_buffer,
|
|
|
context->code_buffer_size,
|
|
|
context->flags,
|
|
|
context->keyboard_layout,
|
|
|
- context->initial_delay);
|
|
|
+ context->initial_delay,
|
|
|
+ context->ble_hid_profile);
|
|
|
furi_mutex_release(context->code_buffer_sync);
|
|
|
}
|
|
|
}
|
|
|
@@ -158,7 +141,7 @@ void totp_bt_type_code_worker_notify(
|
|
|
furi_thread_flags_set(furi_thread_get_id(context->thread), event);
|
|
|
}
|
|
|
|
|
|
-TotpBtTypeCodeWorkerContext* totp_bt_type_code_worker_init() {
|
|
|
+TotpBtTypeCodeWorkerContext* totp_bt_type_code_worker_init(uint16_t mac_xor) {
|
|
|
TotpBtTypeCodeWorkerContext* context = malloc(sizeof(TotpBtTypeCodeWorkerContext));
|
|
|
furi_check(context != NULL);
|
|
|
|
|
|
@@ -166,37 +149,15 @@ TotpBtTypeCodeWorkerContext* totp_bt_type_code_worker_init() {
|
|
|
context->is_advertising = false;
|
|
|
context->is_connected = false;
|
|
|
bt_disconnect(context->bt);
|
|
|
- furi_hal_bt_reinit();
|
|
|
furi_delay_ms(200);
|
|
|
bt_keys_storage_set_storage_path(context->bt, HID_BT_KEYS_STORAGE_PATH);
|
|
|
|
|
|
-#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_XTREME_UL
|
|
|
- memcpy(
|
|
|
- &context->previous_bt_name[0],
|
|
|
- furi_hal_bt_get_profile_adv_name(FuriHalBtProfileHidKeyboard),
|
|
|
- TOTP_BT_WORKER_BT_ADV_NAME_MAX_LEN);
|
|
|
- memcpy(
|
|
|
- &context->previous_bt_mac[0],
|
|
|
- furi_hal_bt_get_profile_mac_addr(FuriHalBtProfileHidKeyboard),
|
|
|
- TOTP_BT_WORKER_BT_MAC_ADDRESS_LEN);
|
|
|
- char new_name[TOTP_BT_WORKER_BT_ADV_NAME_MAX_LEN];
|
|
|
- snprintf(new_name, sizeof(new_name), "%s TOTP Auth", furi_hal_version_get_name_ptr());
|
|
|
- uint8_t new_bt_mac[TOTP_BT_WORKER_BT_MAC_ADDRESS_LEN];
|
|
|
- totp_type_code_worker_bt_set_app_mac(new_bt_mac);
|
|
|
- furi_hal_bt_set_profile_adv_name(FuriHalBtProfileHidKeyboard, new_name);
|
|
|
- furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, new_bt_mac);
|
|
|
-#endif
|
|
|
-
|
|
|
- if(!bt_set_profile(context->bt, BtProfileHidKeyboard)) {
|
|
|
- FURI_LOG_E(LOGGING_TAG, "Failed to switch BT to keyboard HID profile");
|
|
|
- }
|
|
|
+ BleProfileHidParams ble_params = {.device_name_prefix = "TOTP", .mac_xor = mac_xor};
|
|
|
+ context->ble_hid_profile = bt_profile_start(context->bt, ble_profile_hid, &ble_params);
|
|
|
+ furi_check(context->ble_hid_profile);
|
|
|
|
|
|
furi_hal_bt_start_advertising();
|
|
|
|
|
|
-#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_XTREME_UL
|
|
|
- bt_enable_peer_key_update(context->bt);
|
|
|
-#endif
|
|
|
-
|
|
|
context->is_advertising = true;
|
|
|
bt_set_status_changed_callback(context->bt, connection_status_changed_callback, context);
|
|
|
|
|
|
@@ -219,15 +180,10 @@ void totp_bt_type_code_worker_free(TotpBtTypeCodeWorkerContext* context) {
|
|
|
bt_disconnect(context->bt);
|
|
|
furi_delay_ms(200);
|
|
|
bt_keys_storage_set_default_path(context->bt);
|
|
|
-
|
|
|
-#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_XTREME_UL
|
|
|
- furi_hal_bt_set_profile_adv_name(FuriHalBtProfileHidKeyboard, context->previous_bt_name);
|
|
|
- furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, context->previous_bt_mac);
|
|
|
-#endif
|
|
|
-
|
|
|
- if(!bt_set_profile(context->bt, BtProfileSerial)) {
|
|
|
- FURI_LOG_E(LOGGING_TAG, "Failed to switch BT to Serial profile");
|
|
|
+ if(!bt_profile_restore_default(context->bt)) {
|
|
|
+ FURI_LOG_E(LOGGING_TAG, "Failed to restore to default BT profile");
|
|
|
}
|
|
|
+
|
|
|
furi_record_close(RECORD_BT);
|
|
|
context->bt = NULL;
|
|
|
|