diff --git a/applications/external/uart_terminal/README.md b/applications/external/uart_terminal/README.md index 7e2cfd212..b4a0db6cf 100644 --- a/applications/external/uart_terminal/README.md +++ b/applications/external/uart_terminal/README.md @@ -1,5 +1,9 @@ -# UART Terminal for Flipper Zero +# UART Terminal for Flipper Zero [Flipper Zero](https://flipperzero.one/) app to control various devices via UART interface. +## Download fap +| **FW Official** | **FW Unleashed** | +| - | - | +| [![FAP Factory](https://flipc.org/api/v1/cool4uma/UART_Terminal/badge)](https://flipc.org/cool4uma/UART_Terminal) | [![FAP Factory](https://flipc.org/api/v1/cool4uma/UART_Terminal/badge?firmware=unleashed)](https://flipc.org/cool4uma/UART_Terminal?firmware=unleashed) | ## Capabilities - Read log and command output by uart @@ -29,6 +33,7 @@ Copy the contents of the repository to the applications_user/uart_terminal folde Or use the tool [uFBT](https://github.com/flipperdevices/flipperzero-ufbt) for building applications for Flipper Zero. + ## How it works @@ -42,4 +47,4 @@ Or use the tool [uFBT](https://github.com/flipperdevices/flipperzero-ufbt) for b ## INFO: -~70% of the source code is taken from the [Wifi Marauder](https://github.com/0xchocolate/flipperzero-firmware-with-wifi-marauder-companion) project. Many thanks to the developers of the Wifi Marauder project. +~60% of the source code is taken from the [Wifi Marauder](https://github.com/0xchocolate/flipperzero-firmware-with-wifi-marauder-companion) project. Many thanks to the developers of the Wifi Marauder project. diff --git a/applications/external/uart_terminal/scenes/uart_terminal_scene_console_output.c b/applications/external/uart_terminal/scenes/uart_terminal_scene_console_output.c index a9f998124..38a5a20e4 100644 --- a/applications/external/uart_terminal/scenes/uart_terminal_scene_console_output.c +++ b/applications/external/uart_terminal/scenes/uart_terminal_scene_console_output.c @@ -111,11 +111,21 @@ void uart_terminal_scene_console_output_on_enter(void* context) { uart_terminal_uart_set_handle_rx_data_cb( app->uart, uart_terminal_console_output_handle_rx_data_cb); // setup callback for rx thread - // Send command with newline '\n' + // Send command with CR+LF or newline '\n' if(app->is_command && app->selected_tx_string) { - uart_terminal_uart_tx( - (uint8_t*)(app->selected_tx_string), strlen(app->selected_tx_string)); - uart_terminal_uart_tx((uint8_t*)("\n"), 1); + if(app->TERMINAL_MODE == 1) { + // char buffer[240]; + // snprintf(buffer, 240, "%s\r\n", (app->selected_tx_string)); + // uart_terminal_uart_tx((unsigned char *)buffer, strlen(buffer)); + uart_terminal_uart_tx( + (uint8_t*)(app->selected_tx_string), strlen(app->selected_tx_string)); + uart_terminal_uart_tx((uint8_t*)("\r"), 1); + uart_terminal_uart_tx((uint8_t*)("\n"), 1); + } else { + uart_terminal_uart_tx( + (uint8_t*)(app->selected_tx_string), strlen(app->selected_tx_string)); + uart_terminal_uart_tx((uint8_t*)("\n"), 1); + } } } @@ -144,4 +154,4 @@ void uart_terminal_scene_console_output_on_exit(void* context) { //if(app->is_command) { // uart_terminal_uart_tx((uint8_t*)("exit\n"), strlen("exit\n")); //} -} +} \ No newline at end of file diff --git a/applications/external/uart_terminal/scenes/uart_terminal_scene_start.c b/applications/external/uart_terminal/scenes/uart_terminal_scene_start.c index db783e9b2..d4de748b6 100644 --- a/applications/external/uart_terminal/scenes/uart_terminal_scene_start.c +++ b/applications/external/uart_terminal/scenes/uart_terminal_scene_start.c @@ -31,6 +31,7 @@ const UART_TerminalItem items[NUM_MENU_ITEMS] = { FOCUS_CONSOLE_TOGGLE, NO_TIP}, {"Send command", {""}, 1, {""}, INPUT_ARGS, FOCUS_CONSOLE_END, NO_TIP}, + {"Send AT command", {""}, 1, {"AT"}, INPUT_ARGS, FOCUS_CONSOLE_END, NO_TIP}, {"Fast cmd", {"help", "uptime", "date", "df -h", "ps", "dmesg", "reboot", "poweroff"}, 8, diff --git a/applications/external/uart_terminal/scenes/uart_terminal_scene_text_input.c b/applications/external/uart_terminal/scenes/uart_terminal_scene_text_input.c index 62c0792d4..e200ba266 100644 --- a/applications/external/uart_terminal/scenes/uart_terminal_scene_text_input.c +++ b/applications/external/uart_terminal/scenes/uart_terminal_scene_text_input.c @@ -25,7 +25,13 @@ void uart_terminal_scene_text_input_on_enter(void* context) { // Setup view UART_TextInput* text_input = app->text_input; // Add help message to header - uart_text_input_set_header_text(text_input, "Send command to UART"); + if(0 == strncmp("AT", app->selected_tx_string, strlen("AT"))) { + app->TERMINAL_MODE = 1; + uart_text_input_set_header_text(text_input, "Send AT command to UART"); + } else { + app->TERMINAL_MODE = 0; + uart_text_input_set_header_text(text_input, "Send command to UART"); + } uart_text_input_set_result_callback( text_input, uart_terminal_scene_text_input_callback, diff --git a/applications/external/uart_terminal/uart_terminal_app_i.h b/applications/external/uart_terminal/uart_terminal_app_i.h index 6b1996eb5..a0c4bb81f 100644 --- a/applications/external/uart_terminal/uart_terminal_app_i.h +++ b/applications/external/uart_terminal/uart_terminal_app_i.h @@ -12,7 +12,7 @@ #include #include "uart_text_input.h" -#define NUM_MENU_ITEMS (4) +#define NUM_MENU_ITEMS (5) #define UART_TERMINAL_TEXT_BOX_STORE_SIZE (4096) #define UART_TERMINAL_TEXT_INPUT_STORE_SIZE (512) @@ -40,6 +40,7 @@ struct UART_TerminalApp { bool focus_console_start; bool show_stopscan_tip; int BAUDRATE; + int TERMINAL_MODE; //1=AT mode, 0=other mode }; typedef enum { diff --git a/applications/external/uart_terminal/uart_text_input.c b/applications/external/uart_terminal/uart_text_input.c index 4a571b127..7d400b81e 100644 --- a/applications/external/uart_terminal/uart_text_input.c +++ b/applications/external/uart_terminal/uart_text_input.c @@ -1,6 +1,7 @@ #include "uart_text_input.h" #include #include "uart_terminal_icons.h" +#include "uart_terminal_app_i.h" #include struct UART_TextInput { @@ -36,6 +37,8 @@ static const uint8_t keyboard_origin_x = 1; static const uint8_t keyboard_origin_y = 29; static const uint8_t keyboard_row_count = 4; +#define mode_AT "Send AT command to UART" + #define ENTER_KEY '\r' #define BACKSPACE_KEY '\b' @@ -163,6 +166,47 @@ static bool char_is_lowercase(char letter) { return (letter >= 0x61 && letter <= 0x7A); } +static bool char_is_uppercase(char letter) { + return (letter >= 0x41 && letter <= 0x5A); +} + +static char char_to_lowercase(const char letter) { + switch(letter) { + case ' ': + return 0x5f; + break; + case ')': + return 0x28; + break; + case '}': + return 0x7b; + break; + case ']': + return 0x5b; + break; + case '\\': + return 0x2f; + break; + case ':': + return 0x3b; + break; + case ',': + return 0x2e; + break; + case '?': + return 0x21; + break; + case '>': + return 0x3c; + break; + } + if(char_is_uppercase(letter)) { + return (letter + 0x20); + } else { + return letter; + } +} + static char char_to_uppercase(const char letter) { switch(letter) { case '_': @@ -193,7 +237,7 @@ static char char_to_uppercase(const char letter) { return 0x3e; break; } - if(isalpha(letter)) { + if(char_is_lowercase(letter)) { return (letter - 0x20); } else { return letter; @@ -209,7 +253,7 @@ static void uart_text_input_backspace_cb(UART_TextInputModel* model) { static void uart_text_input_view_draw_callback(Canvas* canvas, void* _model) { UART_TextInputModel* model = _model; - uint8_t text_length = model->text_buffer ? strlen(model->text_buffer) : 0; + //uint8_t text_length = model->text_buffer ? strlen(model->text_buffer) : 0; uint8_t needed_string_width = canvas_width(canvas) - 8; uint8_t start_pos = 4; @@ -291,15 +335,12 @@ static void uart_text_input_view_draw_callback(Canvas* canvas, void* _model) { } else { canvas_set_color(canvas, ColorBlack); } - - if(model->clear_default_text || - (text_length == 0 && char_is_lowercase(keys[column].text))) { + if(0 == strcmp(model->header, mode_AT)) { canvas_draw_glyph( canvas, keyboard_origin_x + keys[column].x, keyboard_origin_y + keys[column].y, - //char_to_uppercase(keys[column].text)); - keys[column].text); + char_to_uppercase(keys[column].text)); } else { canvas_draw_glyph( canvas, @@ -372,10 +413,18 @@ static void uart_text_input_handle_ok( char selected = get_selected_char(model); uint8_t text_length = strlen(model->text_buffer); - if(shift) { + if(0 == strcmp(model->header, mode_AT)) { selected = char_to_uppercase(selected); } + if(shift) { + if(0 == strcmp(model->header, mode_AT)) { + selected = char_to_lowercase(selected); + } else { + selected = char_to_uppercase(selected); + } + } + if(selected == ENTER_KEY) { if(model->validator_callback && (!model->validator_callback( @@ -392,9 +441,6 @@ static void uart_text_input_handle_ok( text_length = 0; } if(text_length < (model->text_buffer_size - 1)) { - if(text_length == 0 && char_is_lowercase(selected)) { - //selected = char_to_uppercase(selected); - } model->text_buffer[text_length] = selected; model->text_buffer[text_length + 1] = 0; }