#pragma once #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #include #include #include #include "../views/bad_kb_view.h" #include "../bad_kb_paths.h" #define FILE_BUFFER_LEN 16 typedef enum { LevelRssi122_100, LevelRssi99_80, LevelRssi79_60, LevelRssi59_40, LevelRssi39_0, LevelRssiNum, LevelRssiError = 0xFF, } LevelRssiRange; extern const uint8_t bt_hid_delays[LevelRssiNum]; extern uint8_t bt_timeout; typedef enum { BadKbStateInit, BadKbStateNotConnected, BadKbStateIdle, BadKbStateWillRun, BadKbStateRunning, BadKbStateDelay, BadKbStateStringDelay, BadKbStateWaitForBtn, BadKbStatePaused, BadKbStateDone, BadKbStateScriptError, BadKbStateFileError, } BadKbWorkerState; struct BadKbState { BadKbWorkerState state; bool is_bt; uint32_t pin; size_t line_cur; size_t line_nb; uint32_t delay_remain; size_t error_line; char error[64]; uint32_t elapsed; }; typedef struct BadKbApp BadKbApp; typedef struct { FuriThread* thread; BadKbState st; FuriString* file_path; FuriString* keyboard_layout; uint8_t file_buf[FILE_BUFFER_LEN + 1]; uint8_t buf_start; uint8_t buf_len; bool file_end; uint32_t defdelay; uint32_t stringdelay; uint16_t layout[128]; FuriString* line; FuriString* line_prev; uint32_t repeat_cnt; uint8_t key_hold_nb; FuriString* string_print; size_t string_print_pos; Bt* bt; BadKbApp* app; } BadKbScript; BadKbScript* bad_kb_script_open(FuriString* file_path, Bt* bt, BadKbApp* app); void bad_kb_script_close(BadKbScript* bad_kb); void bad_kb_script_set_keyboard_layout(BadKbScript* bad_kb, FuriString* layout_path); void bad_kb_script_start(BadKbScript* bad_kb); void bad_kb_script_stop(BadKbScript* bad_kb); void bad_kb_script_start_stop(BadKbScript* bad_kb); void bad_kb_script_pause_resume(BadKbScript* bad_kb); BadKbState* bad_kb_script_get_state(BadKbScript* bad_kb); #define BAD_KB_NAME_LEN FURI_HAL_BT_ADV_NAME_LENGTH #define BAD_KB_MAC_LEN GAP_MAC_ADDR_SIZE #define BAD_KB_USB_LEN HID_MANUF_PRODUCT_NAME_LEN extern const uint8_t BAD_KB_EMPTY_MAC[BAD_KB_MAC_LEN]; extern uint8_t BAD_KB_BOUND_MAC[BAD_KB_MAC_LEN]; // For remember mode typedef enum { BadKbAppErrorNoFiles, } BadKbAppError; typedef struct { char bt_name[BAD_KB_NAME_LEN]; uint8_t bt_mac[BAD_KB_MAC_LEN]; FuriHalUsbHidConfig usb_cfg; } BadKbConfig; typedef enum { BadKbConnModeNone, BadKbConnModeUsb, BadKbConnModeBt, } BadKbConnMode; struct BadKbApp { Gui* gui; ViewDispatcher* view_dispatcher; SceneManager* scene_manager; NotificationApp* notifications; DialogsApp* dialogs; Widget* widget; VariableItemList* var_item_list; TextInput* text_input; ByteInput* byte_input; char usb_name_buf[BAD_KB_USB_LEN]; uint16_t usb_vidpid_buf[2]; char bt_name_buf[BAD_KB_NAME_LEN]; uint8_t bt_mac_buf[BAD_KB_MAC_LEN]; BadKbAppError error; FuriString* file_path; FuriString* keyboard_layout; BadKb* bad_kb_view; BadKbScript* bad_kb_script; Bt* bt; bool is_bt; bool bt_remember; BadKbConfig config; // User options BadKbConfig id_config; // ID and BT_ID values bool set_usb_id; bool set_bt_id; bool has_usb_id; bool has_bt_id; GapPairing prev_bt_mode; char prev_bt_name[BAD_KB_NAME_LEN]; uint8_t prev_bt_mac[BAD_KB_MAC_LEN]; FuriHalUsbInterface* prev_usb_mode; FuriHalUsbHidConfig* hid_cfg; BadKbConnMode conn_mode; FuriThread* conn_init_thread; }; int32_t bad_kb_conn_apply(BadKbApp* app); void bad_kb_conn_reset(BadKbApp* app); void bad_kb_config_refresh(BadKbApp* app); void bad_kb_config_adjust(BadKbConfig* cfg); #ifdef __cplusplus } #endif