|
@@ -0,0 +1,125 @@
|
|
|
|
|
+#include "cligui_main_i.h"
|
|
|
|
|
+#include "cli_control.h"
|
|
|
|
|
+#include "events.h"
|
|
|
|
|
+#include "text_input.h"
|
|
|
|
|
+#include "console_output.h"
|
|
|
|
|
+
|
|
|
|
|
+static bool cligui_custom_event_cb(void* context, uint32_t event) {
|
|
|
|
|
+ UNUSED(event);
|
|
|
|
|
+ CliguiApp* app = context;
|
|
|
|
|
+ UNUSED(app);
|
|
|
|
|
+ return true;
|
|
|
|
|
+}
|
|
|
|
|
+static bool cligui_back_event_cb(void* context) {
|
|
|
|
|
+ CliguiApp* app = context;
|
|
|
|
|
+ UNUSED(app);
|
|
|
|
|
+ return true;
|
|
|
|
|
+}
|
|
|
|
|
+static void cligui_tick_event_cb(void* context) {
|
|
|
|
|
+ CliguiApp* app = context;
|
|
|
|
|
+ size_t available = furi_stream_buffer_bytes_available(app->data->streams.app_rx);
|
|
|
|
|
+ for(size_t i = 0; i < available; i++) {
|
|
|
|
|
+ char c = 0;
|
|
|
|
|
+ size_t len = furi_stream_buffer_receive(app->data->streams.app_rx, &c, 1, 100);
|
|
|
|
|
+ if(len > 0) {
|
|
|
|
|
+ furi_string_push_back(app->text_box_store, c);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (available > 0) {
|
|
|
|
|
+ text_box_set_text(app->text_box, furi_string_get_cstr(app->text_box_store));
|
|
|
|
|
+ }
|
|
|
|
|
+ // Set input header stuff
|
|
|
|
|
+ size_t len = furi_string_size(app->text_box_store);
|
|
|
|
|
+ size_t idx = len - 2;
|
|
|
|
|
+ while (idx > 0) {
|
|
|
|
|
+ if (furi_string_get_char(app->text_box_store, idx) == '\n') {
|
|
|
|
|
+ idx++;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ idx--;
|
|
|
|
|
+ }
|
|
|
|
|
+ text_input_set_header_text(app->text_input, furi_string_get_cstr(app->text_box_store) + idx);
|
|
|
|
|
+ UNUSED(app);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+ViewPortInputCallback prev_input_callback;
|
|
|
|
|
+static void input_callback_wrapper(InputEvent* event, void* context) {
|
|
|
|
|
+ CliguiApp* app = context;
|
|
|
|
|
+ if(event->type == InputTypeLong && event->key == InputKeyBack) {
|
|
|
|
|
+ view_dispatcher_stop(app->view_dispatcher);
|
|
|
|
|
+ }
|
|
|
|
|
+ if(app->data->state == ViewTextInput) {
|
|
|
|
|
+ text_input_input_handler(app, event);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ console_output_input_handler(app, event);
|
|
|
|
|
+ }
|
|
|
|
|
+ prev_input_callback(event, app->view_dispatcher);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+int32_t cligui_main(void* p) {
|
|
|
|
|
+ UNUSED(p);
|
|
|
|
|
+ CliguiApp* cligui = malloc(sizeof(CliguiApp));
|
|
|
|
|
+ cligui->data = malloc(sizeof(CliguiData));
|
|
|
|
|
+
|
|
|
|
|
+ latch_tx_handler();
|
|
|
|
|
+ cligui->data->streams.app_tx = rx_stream;
|
|
|
|
|
+ cligui->data->streams.app_rx = tx_stream;
|
|
|
|
|
+
|
|
|
|
|
+ cligui->gui = furi_record_open(RECORD_GUI);
|
|
|
|
|
+ cligui->view_dispatcher = view_dispatcher_alloc();
|
|
|
|
|
+ cligui->view_dispatcher_i = (ViewDispatcher_internal*)(cligui->view_dispatcher);
|
|
|
|
|
+ prev_input_callback =
|
|
|
|
|
+ ((ViewPort_internal*)cligui->view_dispatcher_i->view_port)->input_callback;
|
|
|
|
|
+ view_port_input_callback_set(
|
|
|
|
|
+ cligui->view_dispatcher_i->view_port, input_callback_wrapper, cligui);
|
|
|
|
|
+ view_dispatcher_enable_queue(cligui->view_dispatcher);
|
|
|
|
|
+ view_dispatcher_set_event_callback_context(cligui->view_dispatcher, cligui);
|
|
|
|
|
+ view_dispatcher_set_custom_event_callback(cligui->view_dispatcher, cligui_custom_event_cb);
|
|
|
|
|
+ view_dispatcher_set_navigation_event_callback(cligui->view_dispatcher, cligui_back_event_cb);
|
|
|
|
|
+ view_dispatcher_set_tick_event_callback(cligui->view_dispatcher, cligui_tick_event_cb, 100);
|
|
|
|
|
+
|
|
|
|
|
+ view_dispatcher_attach_to_gui(
|
|
|
|
|
+ cligui->view_dispatcher, cligui->gui, ViewDispatcherTypeFullscreen);
|
|
|
|
|
+
|
|
|
|
|
+ view_dispatcher_send_to_front(cligui->view_dispatcher);
|
|
|
|
|
+
|
|
|
|
|
+ cligui->text_box = text_box_alloc();
|
|
|
|
|
+ view_dispatcher_add_view(
|
|
|
|
|
+ cligui->view_dispatcher, ViewConsoleOutput, text_box_get_view(cligui->text_box));
|
|
|
|
|
+ cligui->text_box_store = furi_string_alloc();
|
|
|
|
|
+ furi_string_reserve(cligui->text_box_store, TEXT_BOX_STORE_SIZE);
|
|
|
|
|
+ text_box_set_text(cligui->text_box, furi_string_get_cstr(cligui->text_box_store));
|
|
|
|
|
+ text_box_set_focus(cligui->text_box, TextBoxFocusEnd);
|
|
|
|
|
+
|
|
|
|
|
+ cligui->text_input = text_input_alloc();
|
|
|
|
|
+ text_input_set_result_callback(
|
|
|
|
|
+ cligui->text_input,
|
|
|
|
|
+ text_input_result_callback,
|
|
|
|
|
+ cligui,
|
|
|
|
|
+ cligui->text_input_store,
|
|
|
|
|
+ TEXT_INPUT_STORE_SIZE,
|
|
|
|
|
+ true);
|
|
|
|
|
+ view_dispatcher_add_view(
|
|
|
|
|
+ cligui->view_dispatcher, ViewTextInput, text_input_get_view(cligui->text_input));
|
|
|
|
|
+
|
|
|
|
|
+ view_dispatcher_switch_to_view(cligui->view_dispatcher, ViewTextInput);
|
|
|
|
|
+ cligui->data->state = ViewTextInput;
|
|
|
|
|
+
|
|
|
|
|
+ view_dispatcher_run(cligui->view_dispatcher);
|
|
|
|
|
+
|
|
|
|
|
+ unlatch_tx_handler();
|
|
|
|
|
+
|
|
|
|
|
+ view_dispatcher_remove_view(cligui->view_dispatcher, ViewConsoleOutput);
|
|
|
|
|
+ view_dispatcher_remove_view(cligui->view_dispatcher, ViewTextInput);
|
|
|
|
|
+ text_box_free(cligui->text_box);
|
|
|
|
|
+ furi_string_free(cligui->text_box_store);
|
|
|
|
|
+ text_input_free(cligui->text_input);
|
|
|
|
|
+ view_dispatcher_free(cligui->view_dispatcher);
|
|
|
|
|
+
|
|
|
|
|
+ furi_record_close(RECORD_GUI);
|
|
|
|
|
+
|
|
|
|
|
+ free(cligui->data);
|
|
|
|
|
+ free(cligui);
|
|
|
|
|
+
|
|
|
|
|
+ return 0;
|
|
|
|
|
+}
|