From 11b8cb75d9a9dcf9a47196ce933700f7f28c255c Mon Sep 17 00:00:00 2001 From: Adam Pippin Date: Sun, 19 Apr 2020 02:23:58 -0700 Subject: [PATCH] Add rotation support to the UI task --- UI.cpp | 77 +++++++++++++++++++++++++++++++++++++++++++++++++--------- UI.h | 13 +++++++--- 2 files changed, 75 insertions(+), 15 deletions(-) diff --git a/UI.cpp b/UI.cpp index f127c0d..07cb99e 100644 --- a/UI.cpp +++ b/UI.cpp @@ -1,6 +1,7 @@ #include #include "Kernel.h" #include "UI.h" +#include "EAT.h" #define MAX_WINDOWS 8 @@ -10,22 +11,41 @@ void UI_draw(int parent_hwnd, int x, int y, int width, int height); struct Window windows[MAX_WINDOWS]; int next_hwnd = 1; +int rotation = ROTATION_HORIZONTAL_BUTTON_LEFT; int UI(int pid, unsigned int signal) { if (signal & SIGNAL_START) { - Kernel_signal_mask(pid, SIGNAL_START | SIGNAL_STOP | SIGNAL_REDRAW); + Kernel_signal_mask(pid, SIGNAL_START | SIGNAL_STOP | SIGNAL_REDRAW | SIGNAL_INPUT_A); windows[0].hwnd = next_hwnd++; windows[0].hwnd_parent = 0; - windows[0].layout_mode = LAYOUT_MODE_SPLIT_VERTICAL; + windows[0].layout_mode = LAYOUT_MODE_SPLIT_AUTO; windows[0].callback = &base_window_callback; + + if (EAT_allocate(3, 1)) + { + EAT_write(3, 0, rotation); + } + else + { + rotation = EAT_read(3, 0); + } } if (signal & SIGNAL_STOP) { + EAT_write(3, 0, rotation); return 255; } + + if (signal & SIGNAL_INPUT_A) + { + rotation = rotation + 1; + if (rotation == 4) + rotation = 0; + Kernel_signal(SIGNAL_REDRAW); + } if (signal & SIGNAL_REDRAW) { @@ -36,11 +56,16 @@ int UI(int pid, unsigned int signal) continue; } M5.Lcd.setTextColor(TFT_WHITE, TFT_DARKGREY); - // TODO: Get actual screen bounds somehow - // Horizontal - UI_draw(windows[i].hwnd, 0, 0, 160, 80); - // Vertical - //UI_draw(windows[i].hwnd, 0, 0, 80, 160); + if (rotation == ROTATION_HORIZONTAL_BUTTON_LEFT || rotation == ROTATION_HORIZONTAL_BUTTON_RIGHT) + { + // Horizontal + UI_draw(windows[i].hwnd, 0, 0, 160, 80); + } + else if (rotation == ROTATION_VERTICAL_BUTTON_UP || rotation == ROTATION_VERTICAL_BUTTON_DOWN) + { + // Vertical + UI_draw(windows[i].hwnd, 0, 0, 80, 160); + } } } @@ -88,7 +113,21 @@ void UI_draw(int parent_hwnd, int x, int y, int width, int height) } } - switch (parent_window->layout_mode) + int layout_mode = parent_window->layout_mode; + + if (layout_mode == LAYOUT_MODE_SPLIT_AUTO) + { + if (rotation == ROTATION_HORIZONTAL_BUTTON_LEFT || rotation == ROTATION_HORIZONTAL_BUTTON_RIGHT) + { + layout_mode = LAYOUT_MODE_SPLIT_VERTICAL; + } + else if (rotation == ROTATION_VERTICAL_BUTTON_UP || rotation == ROTATION_VERTICAL_BUTTON_DOWN) + { + layout_mode = LAYOUT_MODE_SPLIT_HORIZONTAL; + } + } + + switch (layout_mode) { case LAYOUT_MODE_NONE: { @@ -122,10 +161,10 @@ void UI_draw(int parent_hwnd, int x, int y, int width, int height) void base_window_callback(int hwnd, int x, int y, int width, int height) { M5.Lcd.fillScreen(TFT_DARKGREY); - M5.Lcd.setRotation(3); + M5.Lcd.setRotation(rotation); } -int UI_create_window(void (*callback)(int, int, int, int, int), int parent /* = 0 */, int zorder /* = 0 */, bool placeholder /* = true */) +int UI_create_window(void (*callback)(int, int, int, int, int), int parent /* = 0 */, int zorder /* = 0 */) { Window* window = UI_get_window(0); if (window->hwnd == -1) @@ -135,15 +174,29 @@ int UI_create_window(void (*callback)(int, int, int, int, int), int parent /* = window->hwnd = next_hwnd++; window->hwnd_parent = parent; - window->placeholder = placeholder; + window->placeholder = false; window->callback = callback; return window->hwnd; } -void UI_set_layout_mode(int hwnd, int layout_mode) +int UI_create_window(int parent /* = 0 */, int zorder /* = 0 */) { Window* window = UI_get_window(0); if (window->hwnd == -1) + { + Kernel_panic("Cannot create window! Out of handles!"); + } + + window->hwnd = next_hwnd++; + window->hwnd_parent = parent; + window->placeholder = true; + return window->hwnd; +} + +void UI_set_layout_mode(int hwnd, int layout_mode) +{ + Window* window = UI_get_window(hwnd); + if (window->hwnd == -1) { return; } diff --git a/UI.h b/UI.h index aea45f4..90644ba 100644 --- a/UI.h +++ b/UI.h @@ -8,10 +8,17 @@ struct Window bool placeholder = false; }; -#define LAYOUT_MODE_NONE 0 -#define LAYOUT_MODE_SPLIT_VERTICAL 1 +#define LAYOUT_MODE_NONE 0 +#define LAYOUT_MODE_SPLIT_VERTICAL 1 #define LAYOUT_MODE_SPLIT_HORIZONTAL 2 +#define LAYOUT_MODE_SPLIT_AUTO 3 + +#define ROTATION_VERTICAL_BUTTON_UP 0 +#define ROTATION_HORIZONTAL_BUTTON_RIGHT 1 +#define ROTATION_VERTICAL_BUTTON_DOWN 2 +#define ROTATION_HORIZONTAL_BUTTON_LEFT 3 int UI(int pid, unsigned int signal); -int UI_create_window(void (*callback)(int, int, int, int, int), int parent = 0, int zorder = 0, bool placeholder = false); +int UI_create_window(void (*callback)(int, int, int, int, int), int parent = 0, int zorder = 0); +int UI_create_window(int parent = 0, int zorder = 0); void UI_set_layout_mode(int hwnd, int layout_mode);