Просмотр исходного кода

[FL-1491] Gui: input injection in screen stream (#573)

* Gui: input injection in screen stream
* Cli: expose ASCII table in public header
あく 4 лет назад
Родитель
Сommit
c3fda0c8c3
3 измененных файлов с 32 добавлено и 15 удалено
  1. 14 0
      applications/cli/cli.h
  2. 0 14
      applications/cli/cli_i.h
  3. 18 1
      applications/gui/gui.c

+ 14 - 0
applications/cli/cli.h

@@ -6,6 +6,20 @@ extern "C" {
 
 
 #include <m-string.h>
 #include <m-string.h>
 
 
+typedef enum {
+    CliSymbolAsciiSOH = 0x01,
+    CliSymbolAsciiETX = 0x03,
+    CliSymbolAsciiEOT = 0x04,
+    CliSymbolAsciiBell = 0x07,
+    CliSymbolAsciiBackspace = 0x08,
+    CliSymbolAsciiTab = 0x09,
+    CliSymbolAsciiCR = 0x0D,
+    CliSymbolAsciiEsc = 0x1B,
+    CliSymbolAsciiUS = 0x1F,
+    CliSymbolAsciiSpace = 0x20,
+    CliSymbolAsciiDel = 0x7F,
+} CliSymbols;
+
 /* Cli type
 /* Cli type
  * Anonymous structure. Use cli_i.h if you need to go deeper.
  * Anonymous structure. Use cli_i.h if you need to go deeper.
  */
  */

+ 0 - 14
applications/cli/cli_i.h

@@ -24,20 +24,6 @@ BPTREE_DEF2(
     CliCommand,
     CliCommand,
     M_POD_OPLIST)
     M_POD_OPLIST)
 
 
-typedef enum {
-    CliSymbolAsciiSOH = 0x01,
-    CliSymbolAsciiETX = 0x03,
-    CliSymbolAsciiEOT = 0x04,
-    CliSymbolAsciiBell = 0x07,
-    CliSymbolAsciiBackspace = 0x08,
-    CliSymbolAsciiTab = 0x09,
-    CliSymbolAsciiCR = 0x0D,
-    CliSymbolAsciiEsc = 0x1B,
-    CliSymbolAsciiUS = 0x1F,
-    CliSymbolAsciiSpace = 0x20,
-    CliSymbolAsciiDel = 0x7F,
-} CliSymbols;
-
 struct Cli {
 struct Cli {
     CliCommandTree_t commands;
     CliCommandTree_t commands;
     osMutexId_t mutex;
     osMutexId_t mutex;

+ 18 - 1
applications/gui/gui.c

@@ -262,7 +262,24 @@ void gui_cli_screen_stream(Cli* cli, string_t args, void* context) {
     gui_set_framebuffer_callback_context(gui, gui);
     gui_set_framebuffer_callback_context(gui, gui);
     gui_set_framebuffer_callback(gui, gui_cli_screen_stream_callback);
     gui_set_framebuffer_callback(gui, gui_cli_screen_stream_callback);
     gui_redraw(gui);
     gui_redraw(gui);
-    cli_getc(gui->cli);
+
+    // Wait for control events
+    while(true) {
+        char c = cli_getc(gui->cli);
+        if(c == CliSymbolAsciiEsc) {
+            c = cli_getc(gui->cli);
+            if(c == 'i') {
+                InputEvent input_event;
+                input_event.key = cli_getc(gui->cli);
+                input_event.type = cli_getc(gui->cli);
+                osMessageQueuePut(gui->input_queue, &input_event, 0, osWaitForever);
+                osThreadFlagsSet(gui->thread, GUI_THREAD_FLAG_INPUT);
+            }
+        } else {
+            break;
+        }
+    }
+
     gui_set_framebuffer_callback(gui, NULL);
     gui_set_framebuffer_callback(gui, NULL);
     gui_set_framebuffer_callback_context(gui, NULL);
     gui_set_framebuffer_callback_context(gui, NULL);
 }
 }