merge ofw pr 4136 [ci skip]

BadUSB: Full USB/BLE parameter customization, UI improvements, and more
by Willy-JL
This commit is contained in:
MX
2025-04-06 04:56:08 +03:00
parent 324b8ddb95
commit 3745ae2241
31 changed files with 1841 additions and 206 deletions

View File

@@ -1,10 +1,68 @@
#include "../bad_usb_app_i.h"
enum SubmenuIndex {
enum ConfigIndex {
ConfigIndexKeyboardLayout,
ConfigIndexBleUnpair,
ConfigIndexConnection,
};
enum ConfigIndexBle {
ConfigIndexBlePersistPairing = ConfigIndexConnection + 1,
ConfigIndexBlePairingMode,
ConfigIndexBleSetDeviceName,
ConfigIndexBleSetMacAddress,
ConfigIndexBleRandomizeMacAddress,
ConfigIndexBleRestoreDefaults,
ConfigIndexBleRemovePairing,
};
enum ConfigIndexUsb {
ConfigIndexUsbSetManufacturerName = ConfigIndexConnection + 1,
ConfigIndexUsbSetProductName,
ConfigIndexUsbSetVidPid,
ConfigIndexUsbRandomizeVidPid,
ConfigIndexUsbRestoreDefaults,
};
void bad_usb_scene_config_connection_callback(VariableItem* item) {
BadUsbApp* bad_usb = variable_item_get_context(item);
bad_usb_set_interface(
bad_usb,
bad_usb->interface == BadUsbHidInterfaceBle ? BadUsbHidInterfaceUsb :
BadUsbHidInterfaceBle);
variable_item_set_current_value_text(
item, bad_usb->interface == BadUsbHidInterfaceBle ? "BLE" : "USB");
view_dispatcher_send_custom_event(bad_usb->view_dispatcher, ConfigIndexConnection);
}
void bad_usb_scene_config_ble_persist_pairing_callback(VariableItem* item) {
BadUsbApp* bad_usb = variable_item_get_context(item);
bool value = variable_item_get_current_value_index(item);
const BadUsbHidApi* hid = bad_usb_hid_get_interface(bad_usb->interface);
// Apply to current script config
bad_usb->script_hid_cfg.ble.bonding = value;
hid->adjust_config(&bad_usb->script_hid_cfg);
// Set in user config to save in settings file
bad_usb->user_hid_cfg.ble.bonding = value;
variable_item_set_current_value_text(item, value ? "ON" : "OFF");
}
const char* const ble_pairing_mode_names[GapPairingCount] = {
"YesNo",
"PIN Type",
"PIN Y/N",
};
void bad_usb_scene_config_ble_pairing_mode_callback(VariableItem* item) {
BadUsbApp* bad_usb = variable_item_get_context(item);
uint8_t index = variable_item_get_current_value_index(item);
const BadUsbHidApi* hid = bad_usb_hid_get_interface(bad_usb->interface);
// Apply to current script config
bad_usb->script_hid_cfg.ble.pairing = index;
hid->adjust_config(&bad_usb->script_hid_cfg);
// Set in user config to save in settings file
bad_usb->user_hid_cfg.ble.pairing = index;
variable_item_set_current_value_text(item, ble_pairing_mode_names[index]);
}
void bad_usb_scene_config_select_callback(void* context, uint32_t index) {
BadUsbApp* bad_usb = context;
@@ -13,12 +71,59 @@ void bad_usb_scene_config_select_callback(void* context, uint32_t index) {
static void draw_menu(BadUsbApp* bad_usb) {
VariableItemList* var_item_list = bad_usb->var_item_list;
VariableItem* item;
variable_item_list_reset(var_item_list);
variable_item_list_add(var_item_list, "Keyboard Layout (global)", 0, NULL, NULL);
variable_item_list_add(var_item_list, "Remove Pairing", 0, NULL, NULL);
item = variable_item_list_add(
var_item_list, "Connection", 2, bad_usb_scene_config_connection_callback, bad_usb);
variable_item_set_current_value_index(item, bad_usb->interface == BadUsbHidInterfaceBle);
variable_item_set_current_value_text(
item, bad_usb->interface == BadUsbHidInterfaceBle ? "BLE" : "USB");
if(bad_usb->interface == BadUsbHidInterfaceBle) {
BleProfileHidParams* ble_hid_cfg = &bad_usb->script_hid_cfg.ble;
item = variable_item_list_add(
var_item_list,
"Persist Pairing",
2,
bad_usb_scene_config_ble_persist_pairing_callback,
bad_usb);
variable_item_set_current_value_index(item, ble_hid_cfg->bonding);
variable_item_set_current_value_text(item, ble_hid_cfg->bonding ? "ON" : "OFF");
item = variable_item_list_add(
var_item_list,
"Pairing Mode",
GapPairingCount,
bad_usb_scene_config_ble_pairing_mode_callback,
bad_usb);
variable_item_set_current_value_index(item, ble_hid_cfg->pairing);
variable_item_set_current_value_text(item, ble_pairing_mode_names[ble_hid_cfg->pairing]);
variable_item_list_add(var_item_list, "Set Device Name", 0, NULL, NULL);
variable_item_list_add(var_item_list, "Set MAC Address", 0, NULL, NULL);
variable_item_list_add(var_item_list, "Randomize MAC Address", 0, NULL, NULL);
variable_item_list_add(var_item_list, "Restore BLE Defaults", 0, NULL, NULL);
variable_item_list_add(var_item_list, "Remove BLE Pairing", 0, NULL, NULL);
} else {
variable_item_list_add(var_item_list, "Set Manufacturer Name", 0, NULL, NULL);
variable_item_list_add(var_item_list, "Set Product Name", 0, NULL, NULL);
variable_item_list_add(var_item_list, "Set VID and PID", 0, NULL, NULL);
variable_item_list_add(var_item_list, "Randomize VID and PID", 0, NULL, NULL);
variable_item_list_add(var_item_list, "Restore USB Defaults", 0, NULL, NULL);
}
}
void bad_usb_scene_config_on_enter(void* context) {
@@ -28,7 +133,8 @@ void bad_usb_scene_config_on_enter(void* context) {
variable_item_list_set_enter_callback(
var_item_list, bad_usb_scene_config_select_callback, bad_usb);
draw_menu(bad_usb);
variable_item_list_set_selected_item(var_item_list, 0);
variable_item_list_set_selected_item(
var_item_list, scene_manager_get_scene_state(bad_usb->scene_manager, BadUsbSceneConfig));
view_dispatcher_switch_to_view(bad_usb->view_dispatcher, BadUsbAppViewConfig);
}
@@ -38,13 +144,110 @@ bool bad_usb_scene_config_on_event(void* context, SceneManagerEvent event) {
bool consumed = false;
if(event.type == SceneManagerEventTypeCustom) {
scene_manager_set_scene_state(bad_usb->scene_manager, BadUsbSceneConfig, event.event);
consumed = true;
if(event.event == ConfigIndexKeyboardLayout) {
const BadUsbHidApi* hid = bad_usb_hid_get_interface(bad_usb->interface);
switch(event.event) {
case ConfigIndexKeyboardLayout:
scene_manager_next_scene(bad_usb->scene_manager, BadUsbSceneConfigLayout);
} else if(event.event == ConfigIndexBleUnpair) {
scene_manager_next_scene(bad_usb->scene_manager, BadUsbSceneConfirmUnpair);
break;
case ConfigIndexConnection:
// Refresh default values for new interface
hid->adjust_config(&bad_usb->script_hid_cfg);
// Redraw menu with new interface options
draw_menu(bad_usb);
break;
default:
break;
}
if(bad_usb->interface == BadUsbHidInterfaceBle) {
switch(event.event) {
case ConfigIndexBleSetDeviceName:
scene_manager_next_scene(bad_usb->scene_manager, BadUsbSceneConfigBleName);
break;
case ConfigIndexBleSetMacAddress:
scene_manager_next_scene(bad_usb->scene_manager, BadUsbSceneConfigBleMac);
break;
case ConfigIndexBleRandomizeMacAddress:
// Apply to current script config
furi_hal_random_fill_buf(
bad_usb->script_hid_cfg.ble.mac, sizeof(bad_usb->script_hid_cfg.ble.mac));
bad_usb->script_hid_cfg.ble.mac[sizeof(bad_usb->script_hid_cfg.ble.mac) - 1] |=
0b11 << 6; // Set 2 MSB for Random Static Address
hid->adjust_config(&bad_usb->script_hid_cfg);
// Set in user config to save in settings file
memcpy(
bad_usb->user_hid_cfg.ble.mac,
bad_usb->script_hid_cfg.ble.mac,
sizeof(bad_usb->user_hid_cfg.ble.mac));
scene_manager_next_scene(bad_usb->scene_manager, BadUsbSceneDone);
break;
case ConfigIndexBleRestoreDefaults:
// Apply to current script config
bad_usb->script_hid_cfg.ble.name[0] = '\0';
memset(
bad_usb->script_hid_cfg.ble.mac, 0, sizeof(bad_usb->script_hid_cfg.ble.mac));
bad_usb->script_hid_cfg.ble.bonding = true;
bad_usb->script_hid_cfg.ble.pairing = GapPairingPinCodeVerifyYesNo;
hid->adjust_config(&bad_usb->script_hid_cfg);
// Set in user config to save in settings file
memcpy(
&bad_usb->user_hid_cfg.ble,
&bad_usb->script_hid_cfg.ble,
sizeof(bad_usb->user_hid_cfg.ble));
scene_manager_next_scene(bad_usb->scene_manager, BadUsbSceneDone);
break;
case ConfigIndexBleRemovePairing:
scene_manager_next_scene(bad_usb->scene_manager, BadUsbSceneConfirmUnpair);
break;
default:
break;
}
} else {
furi_crash("Unknown key type");
switch(event.event) {
case ConfigIndexUsbSetManufacturerName:
scene_manager_set_scene_state(
bad_usb->scene_manager, BadUsbSceneConfigUsbName, true);
scene_manager_next_scene(bad_usb->scene_manager, BadUsbSceneConfigUsbName);
break;
case ConfigIndexUsbSetProductName:
scene_manager_set_scene_state(
bad_usb->scene_manager, BadUsbSceneConfigUsbName, false);
scene_manager_next_scene(bad_usb->scene_manager, BadUsbSceneConfigUsbName);
break;
case ConfigIndexUsbSetVidPid:
scene_manager_next_scene(bad_usb->scene_manager, BadUsbSceneConfigUsbVidPid);
break;
case ConfigIndexUsbRandomizeVidPid:
furi_hal_random_fill_buf(
(void*)bad_usb->usb_vidpid_buf, sizeof(bad_usb->usb_vidpid_buf));
// Apply to current script config
bad_usb->script_hid_cfg.usb.vid = bad_usb->usb_vidpid_buf[0];
bad_usb->script_hid_cfg.usb.pid = bad_usb->usb_vidpid_buf[1];
hid->adjust_config(&bad_usb->script_hid_cfg);
// Set in user config to save in settings file
bad_usb->user_hid_cfg.usb.vid = bad_usb->script_hid_cfg.usb.vid;
bad_usb->user_hid_cfg.usb.pid = bad_usb->script_hid_cfg.usb.pid;
scene_manager_next_scene(bad_usb->scene_manager, BadUsbSceneDone);
break;
case ConfigIndexUsbRestoreDefaults:
// Apply to current script config
bad_usb->script_hid_cfg.usb.vid = 0;
bad_usb->script_hid_cfg.usb.pid = 0;
bad_usb->script_hid_cfg.usb.manuf[0] = '\0';
bad_usb->script_hid_cfg.usb.product[0] = '\0';
hid->adjust_config(&bad_usb->script_hid_cfg);
// Set in user config to save in settings file
memcpy(
&bad_usb->user_hid_cfg.usb,
&bad_usb->script_hid_cfg.usb,
sizeof(bad_usb->user_hid_cfg.usb));
scene_manager_next_scene(bad_usb->scene_manager, BadUsbSceneDone);
break;
default:
break;
}
}
}

View File

@@ -3,5 +3,9 @@ ADD_SCENE(bad_usb, work, Work)
ADD_SCENE(bad_usb, error, Error)
ADD_SCENE(bad_usb, config, Config)
ADD_SCENE(bad_usb, config_layout, ConfigLayout)
ADD_SCENE(bad_usb, config_ble_name, ConfigBleName)
ADD_SCENE(bad_usb, config_ble_mac, ConfigBleMac)
ADD_SCENE(bad_usb, config_usb_name, ConfigUsbName)
ADD_SCENE(bad_usb, config_usb_vidpid, ConfigUsbVidPid)
ADD_SCENE(bad_usb, confirm_unpair, ConfirmUnpair)
ADD_SCENE(bad_usb, unpair_done, UnpairDone)
ADD_SCENE(bad_usb, done, Done)

View File

@@ -0,0 +1,73 @@
#include "../bad_usb_app_i.h"
enum ByteInputResult {
ByteInputResultOk,
};
static void reverse_mac_addr(uint8_t mac_addr[GAP_MAC_ADDR_SIZE]) {
uint8_t tmp;
for(size_t i = 0; i < GAP_MAC_ADDR_SIZE / 2; i++) {
tmp = mac_addr[i];
mac_addr[i] = mac_addr[GAP_MAC_ADDR_SIZE - 1 - i];
mac_addr[GAP_MAC_ADDR_SIZE - 1 - i] = tmp;
}
}
void bad_usb_scene_config_ble_mac_byte_input_callback(void* context) {
BadUsbApp* bad_usb = context;
view_dispatcher_send_custom_event(bad_usb->view_dispatcher, ByteInputResultOk);
}
void bad_usb_scene_config_ble_mac_on_enter(void* context) {
BadUsbApp* bad_usb = context;
ByteInput* byte_input = bad_usb->byte_input;
memcpy(bad_usb->ble_mac_buf, bad_usb->script_hid_cfg.ble.mac, sizeof(bad_usb->ble_mac_buf));
reverse_mac_addr(bad_usb->ble_mac_buf);
byte_input_set_header_text(byte_input, "Set BLE MAC address");
byte_input_set_result_callback(
byte_input,
bad_usb_scene_config_ble_mac_byte_input_callback,
NULL,
bad_usb,
bad_usb->ble_mac_buf,
sizeof(bad_usb->ble_mac_buf));
view_dispatcher_switch_to_view(bad_usb->view_dispatcher, BadUsbAppViewByteInput);
}
bool bad_usb_scene_config_ble_mac_on_event(void* context, SceneManagerEvent event) {
BadUsbApp* bad_usb = context;
bool consumed = false;
if(event.type == SceneManagerEventTypeCustom) {
consumed = true;
if(event.event == ByteInputResultOk) {
const BadUsbHidApi* hid = bad_usb_hid_get_interface(bad_usb->interface);
reverse_mac_addr(bad_usb->ble_mac_buf);
// Apply to current script config
memcpy(
bad_usb->script_hid_cfg.ble.mac,
bad_usb->ble_mac_buf,
sizeof(bad_usb->script_hid_cfg.ble.mac));
hid->adjust_config(&bad_usb->script_hid_cfg);
// Set in user config to save in settings file
memcpy(
bad_usb->user_hid_cfg.ble.mac,
bad_usb->ble_mac_buf,
sizeof(bad_usb->user_hid_cfg.ble.mac));
}
scene_manager_previous_scene(bad_usb->scene_manager);
}
return consumed;
}
void bad_usb_scene_config_ble_mac_on_exit(void* context) {
BadUsbApp* bad_usb = context;
ByteInput* byte_input = bad_usb->byte_input;
byte_input_set_result_callback(byte_input, NULL, NULL, NULL, NULL, 0);
byte_input_set_header_text(byte_input, "");
}

View File

@@ -0,0 +1,62 @@
#include "../bad_usb_app_i.h"
enum TextInputResult {
TextInputResultOk,
};
static void bad_usb_scene_config_ble_name_text_input_callback(void* context) {
BadUsbApp* bad_usb = context;
view_dispatcher_send_custom_event(bad_usb->view_dispatcher, TextInputResultOk);
}
void bad_usb_scene_config_ble_name_on_enter(void* context) {
BadUsbApp* bad_usb = context;
TextInput* text_input = bad_usb->text_input;
strlcpy(
bad_usb->ble_name_buf, bad_usb->script_hid_cfg.ble.name, sizeof(bad_usb->ble_name_buf));
text_input_set_header_text(text_input, "Set BLE device name");
text_input_set_result_callback(
text_input,
bad_usb_scene_config_ble_name_text_input_callback,
bad_usb,
bad_usb->ble_name_buf,
sizeof(bad_usb->ble_name_buf),
true);
view_dispatcher_switch_to_view(bad_usb->view_dispatcher, BadUsbAppViewTextInput);
}
bool bad_usb_scene_config_ble_name_on_event(void* context, SceneManagerEvent event) {
BadUsbApp* bad_usb = context;
bool consumed = false;
if(event.type == SceneManagerEventTypeCustom) {
consumed = true;
if(event.event == TextInputResultOk) {
const BadUsbHidApi* hid = bad_usb_hid_get_interface(bad_usb->interface);
// Apply to current script config
strlcpy(
bad_usb->script_hid_cfg.ble.name,
bad_usb->ble_name_buf,
sizeof(bad_usb->script_hid_cfg.ble.name));
hid->adjust_config(&bad_usb->script_hid_cfg);
// Set in user config to save in settings file
strlcpy(
bad_usb->user_hid_cfg.ble.name,
bad_usb->ble_name_buf,
sizeof(bad_usb->user_hid_cfg.ble.name));
}
scene_manager_previous_scene(bad_usb->scene_manager);
}
return consumed;
}
void bad_usb_scene_config_ble_name_on_exit(void* context) {
BadUsbApp* bad_usb = context;
TextInput* text_input = bad_usb->text_input;
text_input_reset(text_input);
}

View File

@@ -29,21 +29,17 @@ static bool bad_usb_layout_select(BadUsbApp* bad_usb) {
void bad_usb_scene_config_layout_on_enter(void* context) {
BadUsbApp* bad_usb = context;
if(bad_usb_layout_select(bad_usb)) {
scene_manager_search_and_switch_to_previous_scene(bad_usb->scene_manager, BadUsbSceneWork);
} else {
scene_manager_previous_scene(bad_usb->scene_manager);
}
bad_usb_layout_select(bad_usb);
scene_manager_previous_scene(bad_usb->scene_manager);
}
bool bad_usb_scene_config_layout_on_event(void* context, SceneManagerEvent event) {
UNUSED(context);
UNUSED(event);
// BadUsbApp* bad_usb = context;
return false;
}
void bad_usb_scene_config_layout_on_exit(void* context) {
UNUSED(context);
// BadUsbApp* bad_usb = context;
}

View File

@@ -0,0 +1,86 @@
#include "../bad_usb_app_i.h"
enum TextInputResult {
TextInputResultOk,
};
static void bad_usb_scene_config_usb_name_text_input_callback(void* context) {
BadUsbApp* bad_usb = context;
view_dispatcher_send_custom_event(bad_usb->view_dispatcher, TextInputResultOk);
}
void bad_usb_scene_config_usb_name_on_enter(void* context) {
BadUsbApp* bad_usb = context;
TextInput* text_input = bad_usb->text_input;
if(scene_manager_get_scene_state(bad_usb->scene_manager, BadUsbSceneConfigUsbName)) {
strlcpy(
bad_usb->usb_name_buf,
bad_usb->script_hid_cfg.usb.manuf,
sizeof(bad_usb->usb_name_buf));
text_input_set_header_text(text_input, "Set USB manufacturer name");
} else {
strlcpy(
bad_usb->usb_name_buf,
bad_usb->script_hid_cfg.usb.product,
sizeof(bad_usb->usb_name_buf));
text_input_set_header_text(text_input, "Set USB product name");
}
text_input_set_result_callback(
text_input,
bad_usb_scene_config_usb_name_text_input_callback,
bad_usb,
bad_usb->usb_name_buf,
sizeof(bad_usb->usb_name_buf),
true);
view_dispatcher_switch_to_view(bad_usb->view_dispatcher, BadUsbAppViewTextInput);
}
bool bad_usb_scene_config_usb_name_on_event(void* context, SceneManagerEvent event) {
BadUsbApp* bad_usb = context;
bool consumed = false;
if(event.type == SceneManagerEventTypeCustom) {
consumed = true;
if(event.event == TextInputResultOk) {
const BadUsbHidApi* hid = bad_usb_hid_get_interface(bad_usb->interface);
if(scene_manager_get_scene_state(bad_usb->scene_manager, BadUsbSceneConfigUsbName)) {
// Apply to current script config
strlcpy(
bad_usb->script_hid_cfg.usb.manuf,
bad_usb->usb_name_buf,
sizeof(bad_usb->script_hid_cfg.usb.manuf));
hid->adjust_config(&bad_usb->script_hid_cfg);
// Set in user config to save in settings file
strlcpy(
bad_usb->user_hid_cfg.usb.manuf,
bad_usb->usb_name_buf,
sizeof(bad_usb->user_hid_cfg.usb.manuf));
} else {
// Apply to current script config
strlcpy(
bad_usb->script_hid_cfg.usb.product,
bad_usb->usb_name_buf,
sizeof(bad_usb->script_hid_cfg.usb.product));
hid->adjust_config(&bad_usb->script_hid_cfg);
// Set in user config to save in settings file
strlcpy(
bad_usb->user_hid_cfg.usb.product,
bad_usb->usb_name_buf,
sizeof(bad_usb->user_hid_cfg.usb.product));
}
}
scene_manager_previous_scene(bad_usb->scene_manager);
}
return consumed;
}
void bad_usb_scene_config_usb_name_on_exit(void* context) {
BadUsbApp* bad_usb = context;
TextInput* text_input = bad_usb->text_input;
text_input_reset(text_input);
}

View File

@@ -0,0 +1,59 @@
#include "../bad_usb_app_i.h"
enum ByteInputResult {
ByteInputResultOk,
};
void bad_usb_scene_config_usb_vidpid_byte_input_callback(void* context) {
BadUsbApp* bad_usb = context;
view_dispatcher_send_custom_event(bad_usb->view_dispatcher, ByteInputResultOk);
}
void bad_usb_scene_config_usb_vidpid_on_enter(void* context) {
BadUsbApp* bad_usb = context;
ByteInput* byte_input = bad_usb->byte_input;
bad_usb->usb_vidpid_buf[0] = __builtin_bswap16(bad_usb->script_hid_cfg.usb.vid);
bad_usb->usb_vidpid_buf[1] = __builtin_bswap16(bad_usb->script_hid_cfg.usb.pid);
byte_input_set_header_text(byte_input, "Set USB VID:PID");
byte_input_set_result_callback(
byte_input,
bad_usb_scene_config_usb_vidpid_byte_input_callback,
NULL,
bad_usb,
(void*)bad_usb->usb_vidpid_buf,
sizeof(bad_usb->usb_vidpid_buf));
view_dispatcher_switch_to_view(bad_usb->view_dispatcher, BadUsbAppViewByteInput);
}
bool bad_usb_scene_config_usb_vidpid_on_event(void* context, SceneManagerEvent event) {
BadUsbApp* bad_usb = context;
bool consumed = false;
if(event.type == SceneManagerEventTypeCustom) {
consumed = true;
if(event.event == ByteInputResultOk) {
const BadUsbHidApi* hid = bad_usb_hid_get_interface(bad_usb->interface);
// Apply to current script config
bad_usb->script_hid_cfg.usb.vid = __builtin_bswap16(bad_usb->usb_vidpid_buf[0]);
bad_usb->script_hid_cfg.usb.pid = __builtin_bswap16(bad_usb->usb_vidpid_buf[1]);
hid->adjust_config(&bad_usb->script_hid_cfg);
// Set in user config to save in settings file
bad_usb->user_hid_cfg.usb.vid = bad_usb->script_hid_cfg.usb.vid;
bad_usb->user_hid_cfg.usb.pid = bad_usb->script_hid_cfg.usb.pid;
}
scene_manager_previous_scene(bad_usb->scene_manager);
}
return consumed;
}
void bad_usb_scene_config_usb_vidpid_on_exit(void* context) {
BadUsbApp* bad_usb = context;
ByteInput* byte_input = bad_usb->byte_input;
byte_input_set_result_callback(byte_input, NULL, NULL, NULL, NULL, 0);
byte_input_set_header_text(byte_input, "");
}

View File

@@ -36,7 +36,8 @@ bool bad_usb_scene_confirm_unpair_on_event(void* context, SceneManagerEvent even
if(event.type == SceneManagerEventTypeCustom) {
consumed = true;
if(event.event == GuiButtonTypeRight) {
scene_manager_next_scene(scene_manager, BadUsbSceneUnpairDone);
bad_usb_hid_ble_remove_pairing();
scene_manager_next_scene(scene_manager, BadUsbSceneDone);
} else if(event.event == GuiButtonTypeLeft) {
scene_manager_previous_scene(scene_manager);
}

View File

@@ -1,19 +1,17 @@
#include "../bad_usb_app_i.h"
static void bad_usb_scene_unpair_done_popup_callback(void* context) {
static void bad_usb_scene_done_popup_callback(void* context) {
BadUsbApp* bad_usb = context;
scene_manager_search_and_switch_to_previous_scene(bad_usb->scene_manager, BadUsbSceneConfig);
}
void bad_usb_scene_unpair_done_on_enter(void* context) {
void bad_usb_scene_done_on_enter(void* context) {
BadUsbApp* bad_usb = context;
Popup* popup = bad_usb->popup;
bad_usb_hid_ble_remove_pairing();
popup_set_icon(popup, 48, 4, &I_DolphinDone_80x58);
popup_set_header(popup, "Done", 20, 19, AlignLeft, AlignBottom);
popup_set_callback(popup, bad_usb_scene_unpair_done_popup_callback);
popup_set_callback(popup, bad_usb_scene_done_popup_callback);
popup_set_context(popup, bad_usb);
popup_set_timeout(popup, 1500);
popup_enable_timeout(popup);
@@ -21,7 +19,7 @@ void bad_usb_scene_unpair_done_on_enter(void* context) {
view_dispatcher_switch_to_view(bad_usb->view_dispatcher, BadUsbAppViewPopup);
}
bool bad_usb_scene_unpair_done_on_event(void* context, SceneManagerEvent event) {
bool bad_usb_scene_done_on_event(void* context, SceneManagerEvent event) {
BadUsbApp* bad_usb = context;
UNUSED(bad_usb);
UNUSED(event);
@@ -30,7 +28,7 @@ bool bad_usb_scene_unpair_done_on_event(void* context, SceneManagerEvent event)
return consumed;
}
void bad_usb_scene_unpair_done_on_exit(void* context) {
void bad_usb_scene_done_on_exit(void* context) {
BadUsbApp* bad_usb = context;
Popup* popup = bad_usb->popup;
UNUSED(popup);

View File

@@ -1,5 +1,4 @@
#include "../bad_usb_app_i.h"
#include <furi_hal_power.h>
#include <storage/storage.h>
static bool bad_usb_file_select(BadUsbApp* bad_usb) {
@@ -27,6 +26,7 @@ void bad_usb_scene_file_select_on_enter(void* context) {
}
if(bad_usb_file_select(bad_usb)) {
scene_manager_set_scene_state(bad_usb->scene_manager, BadUsbSceneWork, true);
scene_manager_next_scene(bad_usb->scene_manager, BadUsbSceneWork);
} else {
view_dispatcher_stop(bad_usb->view_dispatcher);
@@ -36,11 +36,9 @@ void bad_usb_scene_file_select_on_enter(void* context) {
bool bad_usb_scene_file_select_on_event(void* context, SceneManagerEvent event) {
UNUSED(context);
UNUSED(event);
// BadUsbApp* bad_usb = context;
return false;
}
void bad_usb_scene_file_select_on_exit(void* context) {
UNUSED(context);
// BadUsbApp* bad_usb = context;
}

View File

@@ -20,11 +20,8 @@ bool bad_usb_scene_work_on_event(void* context, SceneManagerEvent event) {
bad_usb_script_close(app->bad_usb_script);
app->bad_usb_script = NULL;
if(app->interface == BadUsbHidInterfaceBle) {
scene_manager_next_scene(app->scene_manager, BadUsbSceneConfig);
} else {
scene_manager_next_scene(app->scene_manager, BadUsbSceneConfigLayout);
}
scene_manager_set_scene_state(app->scene_manager, BadUsbSceneConfig, 0);
scene_manager_next_scene(app->scene_manager, BadUsbSceneConfig);
}
consumed = true;
} else if(event.event == InputKeyOk) {
@@ -37,7 +34,9 @@ bool bad_usb_scene_work_on_event(void* context, SceneManagerEvent event) {
app->interface == BadUsbHidInterfaceBle ? BadUsbHidInterfaceUsb :
BadUsbHidInterfaceBle);
bad_usb_script_close(app->bad_usb_script);
app->bad_usb_script = bad_usb_script_open(app->file_path, app->interface);
app->bad_usb_script = bad_usb_script_open(
app->file_path, &app->interface, &app->script_hid_cfg, false);
bad_usb_script_set_keyboard_layout(app->bad_usb_script, app->keyboard_layout);
} else {
bad_usb_script_pause_resume(app->bad_usb_script);
}
@@ -45,6 +44,7 @@ bool bad_usb_scene_work_on_event(void* context, SceneManagerEvent event) {
}
} else if(event.type == SceneManagerEventTypeTick) {
bad_usb_view_set_state(app->bad_usb_view, bad_usb_script_get_state(app->bad_usb_script));
bad_usb_view_set_interface(app->bad_usb_view, app->interface);
}
return consumed;
}
@@ -54,7 +54,18 @@ void bad_usb_scene_work_on_enter(void* context) {
bad_usb_view_set_interface(app->bad_usb_view, app->interface);
app->bad_usb_script = bad_usb_script_open(app->file_path, app->interface);
// Opening script the first time:
// - copy user settings as base config
// - load ID/BLE_ID/BT_ID config if present
// Then disable this until next script selected so user can customize options
bool first_script_load = scene_manager_get_scene_state(app->scene_manager, BadUsbSceneWork);
if(first_script_load) {
memcpy(&app->script_hid_cfg, &app->user_hid_cfg, sizeof(app->script_hid_cfg));
scene_manager_set_scene_state(app->scene_manager, BadUsbSceneWork, false);
}
// Interface and config are passed as pointers as ID/BLE_ID/BT_ID config can modify them
app->bad_usb_script = bad_usb_script_open(
app->file_path, &app->interface, &app->script_hid_cfg, first_script_load);
bad_usb_script_set_keyboard_layout(app->bad_usb_script, app->keyboard_layout);
FuriString* file_name;