Преглед изворни кода

Added AT commands support & keyboard modification for AT commands

cool4uma пре 2 година
родитељ
комит
3f8887a90b

+ 11 - 5
scenes/uart_terminal_scene_console_output.c

@@ -111,11 +111,17 @@ 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));
+        } 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 +150,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"));
     //}
-}
+}

+ 1 - 0
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,

+ 7 - 1
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,

+ 3 - 1
uart_terminal_app_i.h

@@ -12,12 +12,13 @@
 #include <gui/modules/variable_item_list.h>
 #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)
 #define UART_CH (FuriHalUartIdUSART1)
 
+
 struct UART_TerminalApp {
     Gui* gui;
     ViewDispatcher* view_dispatcher;
@@ -40,6 +41,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 {

+ 57 - 11
uart_text_input.c

@@ -1,6 +1,7 @@
 #include "uart_text_input.h"
 #include <gui/elements.h>
 #include "uart_terminal_icons.h"
+#include "uart_terminal_app_i.h"
 #include <furi.h>
 
 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;
         }