diff --git a/logitacker/logitacker.c b/logitacker/logitacker.c index dc75508..8b53d0c 100644 --- a/logitacker/logitacker.c +++ b/logitacker/logitacker.c @@ -148,7 +148,7 @@ static void main_event_handler_bsp(bsp_event_t ev) { ev); // call BSP handler function of p_processor and hand in p_processor (self) as first arg } - +#define CLI_NAME_MAX_LEN 64 // Transfers execution to active_enum_process_sub_event void logitacker_enter_mode_passive_enum(uint8_t *rf_address) { if (p_processor != NULL && p_processor->p_deinit_func != NULL) (*p_processor->p_deinit_func)(p_processor); @@ -156,7 +156,7 @@ void logitacker_enter_mode_passive_enum(uint8_t *rf_address) { p_processor->p_init_func(p_processor); m_state_local.mainstate = LOGITACKER_MODE_PASSIVE_ENUMERATION; - sprintf(g_logitacker_cli_name, "LOGITacker (passive enum) $ "); + snprintf(g_logitacker_cli_name, CLI_NAME_MAX_LEN, "LOGITacker (passive enum) $ "); } void logitacker_enter_mode_prx(uint8_t *rf_address) { @@ -165,7 +165,7 @@ void logitacker_enter_mode_prx(uint8_t *rf_address) { p_processor->p_init_func(p_processor); m_state_local.mainstate = LOGITACKER_MODE_PRX; - sprintf(g_logitacker_cli_name, "LOGITacker (prx) $ "); + snprintf(g_logitacker_cli_name, CLI_NAME_MAX_LEN, "LOGITacker (prx) $ "); } @@ -176,7 +176,7 @@ void logitacker_enter_mode_pair_sniff() { p_processor->p_init_func(p_processor); m_state_local.mainstate = LOGITACKER_MODE_SNIFF_PAIRING; - sprintf(g_logitacker_cli_name, "LOGITacker (sniff pairing) $ "); + snprintf(g_logitacker_cli_name, CLI_NAME_MAX_LEN, "LOGITacker (sniff pairing) $ "); } @@ -187,7 +187,7 @@ void logitacker_enter_mode_active_enum(uint8_t *rf_address) { p_processor->p_init_func(p_processor); m_state_local.mainstate = LOGITACKER_MODE_ACTIVE_ENUMERATION; - sprintf(g_logitacker_cli_name, "LOGITacker (active enum) $ "); + snprintf(g_logitacker_cli_name, CLI_NAME_MAX_LEN, "LOGITacker (active enum) $ "); } void logitacker_enter_mode_covert_channel(uint8_t *rf_address, nrf_cli_t const *p_cli) { @@ -197,8 +197,8 @@ void logitacker_enter_mode_covert_channel(uint8_t *rf_address, nrf_cli_t const * p_processor->p_init_func(p_processor); m_state_local.mainstate = LOGITACKER_MODE_COVERT_CHANNEL; - //sprintf(g_logitacker_cli_name, "LOGITacker (covert channel) $ "); - sprintf(g_logitacker_cli_name, " "); // empty prompt, use the one from bound shell + //snprintf(g_logitacker_cli_name, "LOGITacker (covert channel) $ "); + snprintf(g_logitacker_cli_name, CLI_NAME_MAX_LEN, " "); // empty prompt, use the one from bound shell } static uint8_t temp_dev_id = 1; @@ -231,7 +231,7 @@ void logitacker_enter_mode_pair_device(uint8_t const *rf_address) { p_processor->p_init_func(p_processor); m_state_local.mainstate = LOGITACKER_MODE_PAIR_DEVICE; - sprintf(g_logitacker_cli_name, "LOGITacker (pair device) $ "); + snprintf(g_logitacker_cli_name, CLI_NAME_MAX_LEN, "LOGITacker (pair device) $ "); } @@ -242,7 +242,7 @@ void logitacker_enter_mode_injection(uint8_t const *rf_address) { p_processor->p_init_func(p_processor); m_state_local.mainstate = LOGITACKER_MODE_INJECT; - sprintf(g_logitacker_cli_name, "LOGITacker (injection) $ "); + snprintf(g_logitacker_cli_name, CLI_NAME_MAX_LEN, "LOGITacker (injection) $ "); } void logitacker_enter_mode_discovery() { @@ -254,7 +254,7 @@ void logitacker_enter_mode_discovery() { p_processor->p_init_func(p_processor); //call init function m_state_local.mainstate = LOGITACKER_MODE_DISCOVERY; - sprintf(g_logitacker_cli_name, "LOGITacker (discover) $ "); + snprintf(g_logitacker_cli_name, CLI_NAME_MAX_LEN, "LOGITacker (discover) $ "); } @@ -292,7 +292,7 @@ uint8_t rf_addr_usb[5] = {0}; uint32_t logitacker_init() { logitacker_options_init_state(); - sprintf(g_logitacker_cli_name, "LOGITacker $ "); + snprintf(g_logitacker_cli_name, CLI_NAME_MAX_LEN, "LOGITacker $ "); logitacker_flash_init(); logitacker_options_restore_from_flash(); // try to restore options from flash (updates stats like boot count) logitacker_options_store_to_flash(); // store back updated options diff --git a/logitacker/logitacker.h b/logitacker/logitacker.h index 3af2dfd..31ae1f5 100644 --- a/logitacker/logitacker.h +++ b/logitacker/logitacker.h @@ -47,8 +47,7 @@ typedef enum { LOGITACKER_MODE_IDLE } logitacker_mode_t; -char g_logitacker_cli_name[32]; - +extern char g_logitacker_cli_name[]; uint32_t logitacker_init(); void logitacker_enter_mode_discovery(); @@ -80,4 +79,4 @@ uint32_t logitacker_covert_channel_push_data(covert_channel_payload_data_t const -#endif \ No newline at end of file +#endif diff --git a/logitacker/logitacker_cli.c b/logitacker/logitacker_cli.c index 342c09e..71a7f67 100644 --- a/logitacker/logitacker_cli.c +++ b/logitacker/logitacker_cli.c @@ -665,7 +665,7 @@ static void cmd_options_inject_lang(nrf_cli_t const *p_cli, size_t argc, char ** return; } else { - nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "need language layout name as first argument (f.e. us, de, da, fr)\r\n"); + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "need language layout name as first argument (f.e. us, de, da, es, fr)\r\n"); return; } diff --git a/logitacker/logitacker_keyboard_map.c b/logitacker/logitacker_keyboard_map.c index 58fe911..984b289 100644 --- a/logitacker/logitacker_keyboard_map.c +++ b/logitacker/logitacker_keyboard_map.c @@ -216,7 +216,6 @@ uint32_t logitacker_keyboard_map_combo_str_to_hid_report(char const *in_str, /* maps the given wchar to respective HID report sequence (currently only US,DE layout) */ uint32_t logitacker_keyboard_map_wc_to_hid_reports(hid_keyboard_report_t **p_out_report_seq, uint32_t *out_rep_seq_len, logitacker_keyboard_map_lang_t in_layout, wchar_t in_rune) { - if (in_layout == LANGUAGE_LAYOUT_US) { switch (in_rune) { LAYOUT_US(LAYOUT_SWITCH_CASE) @@ -229,6 +228,12 @@ uint32_t logitacker_keyboard_map_wc_to_hid_reports(hid_keyboard_report_t **p_out default: return NRF_ERROR_INVALID_PARAM; } + } else if (in_layout == LANGUAGE_LAYOUT_ES) { //ES case + switch (in_rune) { + LAYOUT_ES(LAYOUT_SWITCH_CASE) + default: + return NRF_ERROR_INVALID_PARAM; + } } else if (in_layout == LANGUAGE_LAYOUT_DA) { switch (in_rune) { LAYOUT_DA(LAYOUT_SWITCH_CASE) @@ -320,8 +325,9 @@ logitacker_keyboard_map_lang_t logitacker_keyboard_map_lang_from_str(char * lang if (strcmp(lang_str, "us") == 0 || strcmp(lang_str, "US") == 0 ) return LANGUAGE_LAYOUT_US; if (strcmp(lang_str, "da") == 0 || strcmp(lang_str, "DA") == 0 ) return LANGUAGE_LAYOUT_DA; if (strcmp(lang_str, "fr") == 0 || strcmp(lang_str, "FR") == 0 ) return LANGUAGE_LAYOUT_FR; + if (strcmp(lang_str, "es") == 0 || strcmp(lang_str, "ES") == 0 ) return LANGUAGE_LAYOUT_ES; lab_default: NRF_LOG_WARNING("unknown language layout '%s' ... using 'us' as default", nrf_log_push(lang_str)); return LANGUAGE_LAYOUT_US; // default -} \ No newline at end of file +} diff --git a/logitacker/logitacker_keyboard_map.h b/logitacker/logitacker_keyboard_map.h index ba090cf..ea94f7a 100644 --- a/logitacker/logitacker_keyboard_map.h +++ b/logitacker/logitacker_keyboard_map.h @@ -407,6 +407,15 @@ DEF_REPORT_SEQUENCE_NAMED(US_RALT_AND_9, DEF_REPORT(HID_MOD_KEY_RI DEF_REPORT_SEQUENCE_NAMED(US_RALT_AND_0, DEF_REPORT(HID_MOD_KEY_RIGHT_ALT, HID_KEY_0)); +// ES-specific sequences (avoiding duplicates and using unique names) +DEF_REPORT_SEQUENCE_NAMED(ES_RALT_1, DEF_REPORT(HID_MOD_KEY_RIGHT_ALT, HID_KEY_1)); +DEF_REPORT_SEQUENCE_NAMED(ES_RALT_2, DEF_REPORT(HID_MOD_KEY_RIGHT_ALT, HID_KEY_2)); +DEF_REPORT_SEQUENCE_NAMED(ES_INVERTED_QUESTION, DEF_REPORT(HID_MOD_KEY_RIGHT_ALT, HID_KEY_MINUS)); +DEF_REPORT_SEQUENCE_NAMED(ES_NTILDE, DEF_REPORT(HID_MOD_KEY_RIGHT_ALT, HID_KEY_SEMICOLON)); +DEF_REPORT_SEQUENCE_NAMED(ES_NTILDE_SHIFT, DEF_REPORT(HID_MOD_KEY_RIGHT_ALT | HID_MOD_KEY_LEFT_SHIFT, HID_KEY_SEMICOLON)); + + + #define LAYOUT_US(PROC_FUNC) \ PROC_FUNC(L'\t', HID_REPORT_SEQUENCE_US_TAB) \ PROC_FUNC(L'\n', HID_REPORT_SEQUENCE_US_ENTER) \ @@ -837,6 +846,13 @@ DEF_REPORT_SEQUENCE_NAMED(US_RALT_AND_0, DEF_REPORT(HID_MOD_KEY_RI PROC_FUNC(L'€', HID_REPORT_SEQUENCE_RALT_AND_E) \ PROC_FUNC(L'¿', HID_REPORT_SEQUENCE_RALT_AND_M) \ +#define LAYOUT_ES(PROC_FUNC) \ + PROC_FUNC(L'ñ', HID_REPORT_SEQUENCE_ES_NTILDE) \ + PROC_FUNC(L'Ñ', HID_REPORT_SEQUENCE_ES_NTILDE_SHIFT) \ + PROC_FUNC(L'¡', HID_REPORT_SEQUENCE_ES_RALT_1) \ + PROC_FUNC(L'¿', HID_REPORT_SEQUENCE_ES_INVERTED_QUESTION) \ + PROC_FUNC(L'@', HID_REPORT_SEQUENCE_ES_RALT_2) \ + #define LAYOUT_SWITCH_CASE(nameval, val) case nameval: {*p_out_report_seq=(void*)val; *out_rep_seq_len=sizeof(val) ;return NRF_SUCCESS; } @@ -848,6 +864,7 @@ typedef enum { LANGUAGE_LAYOUT_US, LANGUAGE_LAYOUT_DA, LANGUAGE_LAYOUT_FR, + LANGUAGE_LAYOUT_ES, // Add ES layout } logitacker_keyboard_map_lang_t; typedef struct { diff --git a/logitacker/logitacker_options.c b/logitacker/logitacker_options.c index f40e980..e8e984d 100644 --- a/logitacker/logitacker_options.c +++ b/logitacker/logitacker_options.c @@ -210,6 +210,9 @@ void logitacker_options_print(nrf_cli_t const * p_cli) case LANGUAGE_LAYOUT_FR: injection_lan_str = "fr"; break; + case LANGUAGE_LAYOUT_ES: + injection_lan_str = "es"; + break; } char * workmode_str = "unknown"; diff --git a/logitacker/logitacker_usb.h b/logitacker/logitacker_usb.h index 52f33b4..ce50c48 100644 --- a/logitacker/logitacker_usb.h +++ b/logitacker/logitacker_usb.h @@ -166,8 +166,7 @@ typedef enum { } -const app_usbd_hid_generic_t m_app_hid_generic; - +extern const app_usbd_hid_generic_t m_app_hid_generic; // User event handler. //static void usbd_hid_generic_event_handler(app_usbd_class_inst_t const * p_inst, app_usbd_hid_user_event_t event); diff --git a/main.c b/main.c index 585d28d..94aa2bc 100644 --- a/main.c +++ b/main.c @@ -143,7 +143,13 @@ void unifying_event_handler(unifying_evt_t const *p_event) { NRF_CLI_CDC_ACM_DEF(m_cli_cdc_acm_transport); NRF_CLI_DEF(m_cli_cdc_acm, g_logitacker_cli_name, &m_cli_cdc_acm_transport.transport, '\r', 20); - +#define CLI_NAME_MAX_LEN 64 +char g_logitacker_cli_name[CLI_NAME_MAX_LEN] = "logitacker"; +//warinings fix +int _close(int fd) { return -1; } +int _lseek(int fd, int ptr, int dir) { return -1; } +int _read(int fd, char *ptr, int len) { return -1; } +int _write(int fd, char *ptr, int len) { return -1; } int main(void)