mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-20 04:54:45 -07:00
merge ofw pr 4136 [ci skip]
BadUSB: Full USB/BLE parameter customization, UI improvements, and more by Willy-JL
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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, "");
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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, "");
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user