mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-06-13 19:43:34 -07:00
BadKB usb go brrr
This commit is contained in:
@@ -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)
|
||||
|
||||
+5
-8
@@ -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;
|
||||
|
||||
+5
-6
@@ -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, "");
|
||||
}
|
||||
Reference in New Issue
Block a user