BadKB usb go brrr

This commit is contained in:
Willy-JL
2023-06-12 01:46:13 +01:00
parent 70e040300f
commit 0348aff9b8
8 changed files with 224 additions and 30 deletions
+25
View File
@@ -33,6 +33,10 @@ static void bad_kb_load_settings(BadKbApp* app) {
BadKbConfig* cfg = &app->config;
strcpy(cfg->bt_name, "");
memcpy(cfg->bt_mac, BAD_KB_EMPTY_MAC, BAD_KB_MAC_LEN);
strcpy(cfg->usb_cfg.manuf, "");
strcpy(cfg->usb_cfg.product, "");
cfg->usb_cfg.vid = 0;
cfg->usb_cfg.pid = 0;
Storage* storage = furi_record_open(RECORD_STORAGE);
FlipperFormat* file = flipper_format_file_alloc(storage);
@@ -49,6 +53,23 @@ static void bad_kb_load_settings(BadKbApp* app) {
if(!flipper_format_read_hex(file, "Bt_Mac", (uint8_t*)&cfg->bt_mac, BAD_KB_MAC_LEN)) {
memcpy(cfg->bt_mac, BAD_KB_EMPTY_MAC, BAD_KB_MAC_LEN);
}
if(flipper_format_read_string(file, "Usb_Manuf", tmp_str) && !furi_string_empty(tmp_str)) {
strcpy(cfg->usb_cfg.manuf, furi_string_get_cstr(tmp_str));
} else {
strcpy(cfg->usb_cfg.manuf, "");
}
if(flipper_format_read_string(file, "Usb_Product", tmp_str) &&
!furi_string_empty(tmp_str)) {
strcpy(cfg->usb_cfg.product, furi_string_get_cstr(tmp_str));
} else {
strcpy(cfg->usb_cfg.product, "");
}
if(!flipper_format_read_uint32(file, "Usb_Vid", &cfg->usb_cfg.vid, 1)) {
cfg->usb_cfg.vid = 0;
}
if(!flipper_format_read_uint32(file, "Usb_Pid", &cfg->usb_cfg.pid, 1)) {
cfg->usb_cfg.pid = 0;
}
furi_string_free(tmp_str);
flipper_format_file_close(file);
}
@@ -78,6 +99,10 @@ static void bad_kb_save_settings(BadKbApp* app) {
flipper_format_write_string(file, "Keyboard_Layout", app->keyboard_layout);
flipper_format_write_string_cstr(file, "Bt_Name", cfg->bt_name);
flipper_format_write_hex(file, "Bt_Mac", (uint8_t*)&cfg->bt_mac, BAD_KB_MAC_LEN);
flipper_format_write_string_cstr(file, "Usb_Manuf", cfg->usb_cfg.manuf);
flipper_format_write_string_cstr(file, "Usb_Product", cfg->usb_cfg.product);
flipper_format_write_uint32(file, "Usb_Vid", &cfg->usb_cfg.vid, 1);
flipper_format_write_uint32(file, "Usb_Pid", &cfg->usb_cfg.pid, 1);
flipper_format_file_close(file);
}
flipper_format_free(file);
@@ -137,6 +137,8 @@ struct BadKbApp {
VariableItemList* var_item_list;
TextInput* text_input;
ByteInput* byte_input;
char usb_name_buf[32];
uint16_t usb_vidpid_buf[2];
char bt_name_buf[BAD_KB_NAME_LEN];
uint8_t bt_mac_buf[BAD_KB_MAC_LEN];
@@ -149,7 +151,7 @@ struct BadKbApp {
Bt* bt;
bool is_bt;
bool bt_remember;
BadKbConfig config; // User options (TODO: allow users to change usb cfg)
BadKbConfig config; // User options
BadKbConfig id_config; // ID and BT_ID values
BadKbConfig prev_config; // State to restore at exit
@@ -7,10 +7,20 @@
enum VarItemListIndex {
VarItemListIndexKeyboardLayout,
VarItemListIndexConnection,
VarItemListIndexBtRemember,
};
enum VarItemListIndexBt {
VarItemListIndexBtRemember = VarItemListIndexConnection + 1,
VarItemListIndexBtDeviceName,
VarItemListIndexBtMacAddress,
VarItemListIndexRandomizeBtMac,
VarItemListIndexBtRandomizeMac,
};
enum VarItemListIndexUsb {
VarItemListIndexUsbManufacturerName = VarItemListIndexConnection + 1,
VarItemListIndexUsbProductName,
VarItemListIndexUsbVidPid,
VarItemListIndexUsbRandomizeVidPid,
};
void bad_kb_scene_config_connection_callback(VariableItem* item) {
@@ -73,6 +83,26 @@ void bad_kb_scene_config_on_enter(void* context) {
} else if(bad_kb->set_bt_id) {
variable_item_set_locked(item, true, "Script has\nBT_ID cmd!\nLocked to\nset MAC!");
}
} else {
item = variable_item_list_add(var_item_list, "USB Manufacturer Name", 0, NULL, bad_kb);
if(bad_kb->set_usb_id) {
variable_item_set_locked(item, true, "Script has\nID cmd!\nLocked to\nset Mname!");
}
item = variable_item_list_add(var_item_list, "USB Product Name", 0, NULL, bad_kb);
if(bad_kb->set_usb_id) {
variable_item_set_locked(item, true, "Script has\nID cmd!\nLocked to\nset Pname!");
}
item = variable_item_list_add(var_item_list, "USB VID and PID", 0, NULL, bad_kb);
if(bad_kb->set_usb_id) {
variable_item_set_locked(item, true, "Script has\nID cmd!\nLocked to\nset IDs!");
}
item = variable_item_list_add(var_item_list, "Randomize USB VID:PID", 0, NULL, bad_kb);
if(bad_kb->set_usb_id) {
variable_item_set_locked(item, true, "Script has\nID cmd!\nLocked to\nset IDs!");
}
}
variable_item_list_set_enter_callback(
@@ -95,23 +125,56 @@ bool bad_kb_scene_config_on_event(void* context, SceneManagerEvent event) {
case VarItemListIndexKeyboardLayout:
scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigLayout);
break;
case VarItemListIndexBtDeviceName:
scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigName);
break;
case VarItemListIndexBtMacAddress:
scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigMac);
break;
case VarItemListIndexRandomizeBtMac:
furi_hal_random_fill_buf(bad_kb->config.bt_mac, BAD_KB_MAC_LEN);
/* fall through */
case VarItemListIndexBtRemember:
/* fall through */
case VarItemListIndexConnection:
bad_kb_config_refresh(bad_kb);
break;
default:
break;
}
if(bad_kb->is_bt) {
switch(event.event) {
case VarItemListIndexBtRemember:
bad_kb_config_refresh(bad_kb);
break;
case VarItemListIndexBtDeviceName:
scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigBtName);
break;
case VarItemListIndexBtMacAddress:
scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigBtMac);
break;
case VarItemListIndexBtRandomizeMac:
furi_hal_random_fill_buf(bad_kb->config.bt_mac, BAD_KB_MAC_LEN);
bad_kb_config_refresh(bad_kb);
break;
default:
break;
}
} else {
switch(event.event) {
case VarItemListIndexUsbManufacturerName:
scene_manager_set_scene_state(
bad_kb->scene_manager, BadKbSceneConfigUsbName, true);
scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigUsbName);
break;
case VarItemListIndexUsbProductName:
scene_manager_set_scene_state(
bad_kb->scene_manager, BadKbSceneConfigUsbName, false);
scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigUsbName);
break;
case VarItemListIndexUsbVidPid:
scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigUsbVidPid);
break;
case VarItemListIndexUsbRandomizeVidPid:
furi_hal_random_fill_buf(
(void*)bad_kb->usb_vidpid_buf, sizeof(bad_kb->usb_vidpid_buf));
bad_kb->config.usb_cfg.vid = bad_kb->usb_vidpid_buf[0];
bad_kb->config.usb_cfg.pid = bad_kb->usb_vidpid_buf[1];
bad_kb_config_refresh(bad_kb);
break;
default:
break;
}
}
}
return consumed;
@@ -3,5 +3,7 @@ ADD_SCENE(bad_kb, work, Work)
ADD_SCENE(bad_kb, error, Error)
ADD_SCENE(bad_kb, config, Config)
ADD_SCENE(bad_kb, config_layout, ConfigLayout)
ADD_SCENE(bad_kb, config_name, ConfigName)
ADD_SCENE(bad_kb, config_mac, ConfigMac)
ADD_SCENE(bad_kb, config_bt_name, ConfigBtName)
ADD_SCENE(bad_kb, config_bt_mac, ConfigBtMac)
ADD_SCENE(bad_kb, config_usb_name, ConfigUsbName)
ADD_SCENE(bad_kb, config_usb_vidpid, ConfigUsbVidPid)
@@ -1,24 +1,21 @@
#include "../bad_kb_app.h"
#define TAG "BadKbConfigMac"
void bad_kb_scene_config_mac_byte_input_callback(void* context) {
void bad_kb_scene_config_bt_mac_byte_input_callback(void* context) {
BadKbApp* bad_kb = context;
view_dispatcher_send_custom_event(bad_kb->view_dispatcher, BadKbAppCustomEventByteInputDone);
}
void bad_kb_scene_config_mac_on_enter(void* context) {
void bad_kb_scene_config_bt_mac_on_enter(void* context) {
BadKbApp* bad_kb = context;
ByteInput* byte_input = bad_kb->byte_input;
memmove(bad_kb->bt_mac_buf, bad_kb->config.bt_mac, BAD_KB_MAC_LEN);
byte_input_set_header_text(byte_input, "Set BT MAC address");
byte_input_set_result_callback(
byte_input,
bad_kb_scene_config_mac_byte_input_callback,
bad_kb_scene_config_bt_mac_byte_input_callback,
NULL,
bad_kb,
bad_kb->bt_mac_buf,
@@ -27,7 +24,7 @@ void bad_kb_scene_config_mac_on_enter(void* context) {
view_dispatcher_switch_to_view(bad_kb->view_dispatcher, BadKbAppViewByteInput);
}
bool bad_kb_scene_config_mac_on_event(void* context, SceneManagerEvent event) {
bool bad_kb_scene_config_bt_mac_on_event(void* context, SceneManagerEvent event) {
BadKbApp* bad_kb = context;
bool consumed = false;
@@ -42,7 +39,7 @@ bool bad_kb_scene_config_mac_on_event(void* context, SceneManagerEvent event) {
return consumed;
}
void bad_kb_scene_config_mac_on_exit(void* context) {
void bad_kb_scene_config_bt_mac_on_exit(void* context) {
BadKbApp* bad_kb = context;
ByteInput* byte_input = bad_kb->byte_input;
@@ -1,22 +1,21 @@
#include "../bad_kb_app.h"
static void bad_kb_scene_config_name_text_input_callback(void* context) {
static void bad_kb_scene_config_bt_name_text_input_callback(void* context) {
BadKbApp* bad_kb = context;
view_dispatcher_send_custom_event(bad_kb->view_dispatcher, BadKbAppCustomEventTextInputDone);
}
void bad_kb_scene_config_name_on_enter(void* context) {
void bad_kb_scene_config_bt_name_on_enter(void* context) {
BadKbApp* bad_kb = context;
TextInput* text_input = bad_kb->text_input;
strlcpy(bad_kb->bt_name_buf, bad_kb->config.bt_name, BAD_KB_NAME_LEN);
text_input_set_header_text(text_input, "Set BT device name");
text_input_set_result_callback(
text_input,
bad_kb_scene_config_name_text_input_callback,
bad_kb_scene_config_bt_name_text_input_callback,
bad_kb,
bad_kb->bt_name_buf,
BAD_KB_NAME_LEN,
@@ -25,7 +24,7 @@ void bad_kb_scene_config_name_on_enter(void* context) {
view_dispatcher_switch_to_view(bad_kb->view_dispatcher, BadKbAppViewTextInput);
}
bool bad_kb_scene_config_name_on_event(void* context, SceneManagerEvent event) {
bool bad_kb_scene_config_bt_name_on_event(void* context, SceneManagerEvent event) {
BadKbApp* bad_kb = context;
bool consumed = false;
@@ -40,7 +39,7 @@ bool bad_kb_scene_config_name_on_event(void* context, SceneManagerEvent event) {
return consumed;
}
void bad_kb_scene_config_name_on_exit(void* context) {
void bad_kb_scene_config_bt_name_on_exit(void* context) {
BadKbApp* bad_kb = context;
TextInput* text_input = bad_kb->text_input;
@@ -0,0 +1,56 @@
#include "../bad_kb_app.h"
static void bad_kb_scene_config_usb_name_text_input_callback(void* context) {
BadKbApp* bad_kb = context;
view_dispatcher_send_custom_event(bad_kb->view_dispatcher, BadKbAppCustomEventTextInputDone);
}
void bad_kb_scene_config_usb_name_on_enter(void* context) {
BadKbApp* bad_kb = context;
TextInput* text_input = bad_kb->text_input;
if(scene_manager_get_scene_state(bad_kb->scene_manager, BadKbSceneConfigUsbName)) {
strlcpy(bad_kb->usb_name_buf, bad_kb->config.usb_cfg.manuf, 32);
text_input_set_header_text(text_input, "Set USB manufacturer name");
} else {
strlcpy(bad_kb->usb_name_buf, bad_kb->config.usb_cfg.product, 32);
text_input_set_header_text(text_input, "Set USB product name");
}
text_input_set_result_callback(
text_input,
bad_kb_scene_config_usb_name_text_input_callback,
bad_kb,
bad_kb->usb_name_buf,
32,
true);
view_dispatcher_switch_to_view(bad_kb->view_dispatcher, BadKbAppViewTextInput);
}
bool bad_kb_scene_config_usb_name_on_event(void* context, SceneManagerEvent event) {
BadKbApp* bad_kb = context;
bool consumed = false;
if(event.type == SceneManagerEventTypeCustom) {
consumed = true;
if(event.event == BadKbAppCustomEventTextInputDone) {
if(scene_manager_get_scene_state(bad_kb->scene_manager, BadKbSceneConfigUsbName)) {
strlcpy(bad_kb->config.usb_cfg.manuf, bad_kb->usb_name_buf, 32);
} else {
strlcpy(bad_kb->config.usb_cfg.product, bad_kb->usb_name_buf, 32);
}
bad_kb_config_refresh(bad_kb);
}
scene_manager_previous_scene(bad_kb->scene_manager);
}
return consumed;
}
void bad_kb_scene_config_usb_name_on_exit(void* context) {
BadKbApp* bad_kb = context;
TextInput* text_input = bad_kb->text_input;
text_input_reset(text_input);
}
@@ -0,0 +1,50 @@
#include "../bad_kb_app.h"
void bad_kb_scene_config_usb_vidpid_byte_input_callback(void* context) {
BadKbApp* bad_kb = context;
view_dispatcher_send_custom_event(bad_kb->view_dispatcher, BadKbAppCustomEventByteInputDone);
}
void bad_kb_scene_config_usb_vidpid_on_enter(void* context) {
BadKbApp* bad_kb = context;
ByteInput* byte_input = bad_kb->byte_input;
bad_kb->usb_vidpid_buf[0] = __REVSH(bad_kb->config.usb_cfg.vid);
bad_kb->usb_vidpid_buf[1] = __REVSH(bad_kb->config.usb_cfg.pid);
byte_input_set_header_text(byte_input, "Set USB VID:PID");
byte_input_set_result_callback(
byte_input,
bad_kb_scene_config_usb_vidpid_byte_input_callback,
NULL,
bad_kb,
(void*)bad_kb->usb_vidpid_buf,
sizeof(bad_kb->usb_vidpid_buf));
view_dispatcher_switch_to_view(bad_kb->view_dispatcher, BadKbAppViewByteInput);
}
bool bad_kb_scene_config_usb_vidpid_on_event(void* context, SceneManagerEvent event) {
BadKbApp* bad_kb = context;
bool consumed = false;
if(event.type == SceneManagerEventTypeCustom) {
consumed = true;
if(event.event == BadKbAppCustomEventByteInputDone) {
bad_kb->config.usb_cfg.vid = __REVSH(bad_kb->usb_vidpid_buf[0]);
bad_kb->config.usb_cfg.pid = __REVSH(bad_kb->usb_vidpid_buf[1]);
bad_kb_config_refresh(bad_kb);
}
scene_manager_previous_scene(bad_kb->scene_manager);
}
return consumed;
}
void bad_kb_scene_config_usb_vidpid_on_exit(void* context) {
BadKbApp* bad_kb = context;
ByteInput* byte_input = bad_kb->byte_input;
byte_input_set_result_callback(byte_input, NULL, NULL, NULL, NULL, 0);
byte_input_set_header_text(byte_input, "");
}