From c3fda0c8c3fcefd9c60d7a6b979fbea8802d7f3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=82=E3=81=8F?= Date: Fri, 9 Jul 2021 05:16:54 +0300 Subject: [PATCH] [FL-1491] Gui: input injection in screen stream (#573) * Gui: input injection in screen stream * Cli: expose ASCII table in public header --- applications/cli/cli.h | 14 ++++++++++++++ applications/cli/cli_i.h | 14 -------------- applications/gui/gui.c | 19 ++++++++++++++++++- 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/applications/cli/cli.h b/applications/cli/cli.h index adca4ea2..4d393620 100644 --- a/applications/cli/cli.h +++ b/applications/cli/cli.h @@ -6,6 +6,20 @@ extern "C" { #include +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 * Anonymous structure. Use cli_i.h if you need to go deeper. */ diff --git a/applications/cli/cli_i.h b/applications/cli/cli_i.h index 98e4e00c..66ffdda6 100755 --- a/applications/cli/cli_i.h +++ b/applications/cli/cli_i.h @@ -24,20 +24,6 @@ BPTREE_DEF2( CliCommand, 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 { CliCommandTree_t commands; osMutexId_t mutex; diff --git a/applications/gui/gui.c b/applications/gui/gui.c index dcabfb74..56debd6d 100644 --- a/applications/gui/gui.c +++ b/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(gui, gui_cli_screen_stream_callback); 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_context(gui, NULL); }