diff --git a/source/UI/UI.cpp b/source/UI/UI.cpp new file mode 100644 index 00000000..13b38293 --- /dev/null +++ b/source/UI/UI.cpp @@ -0,0 +1,4 @@ +#include "UI.h" +void ui_render_screen(Screen_t *screen, ScreenContext_t *context) { + // Basically switch out the handlers +} \ No newline at end of file diff --git a/source/UI/UI.h b/source/UI/UI.h new file mode 100644 index 00000000..3790bcc6 --- /dev/null +++ b/source/UI/UI.h @@ -0,0 +1,45 @@ +#pragma once +#include + +typedef enum { + SimplifiedHome, // Basic home + SimplifiedHomeWarning, // Home with temp warning + DetailedHome, // Detailed home view + DetailedHomeWarning, // Home with temp warning + DebugMenu, // Debugging metrics + settingsCategory, // Settings category with icon + SettingsEntryBool, // Tickbox setting + SettingsEntry3Number, // Settings adjust with 3 number digits + SettingsEntry2Number, // Settings adjust with 2 number digits + SettingsEntry1Number, // Settings adjust with 2 number digits + SettingsEntry1Text, // Setting with single text char for state + ScrollingText, // Scrolling large text (warnings, help text) + SolderingMode, // Basic soldering mode + DetailedSolderingMode, // Detailed soldering mode + NumberAdjust, // Number adjust of number with <> either side +} screenLayout_t; + +typedef void (*render_prep_fn)(); +typedef void (*tick_fn)(); +typedef void (*button_handler_fn)(); + +typedef struct { + // on_enter + // on_exit + tick_fn tick; + render_prep_fn render_prepare; + screenLayout_t layout; // Render layout used + button_handler_fn handle_button; +} Screen_t; + +typedef union { + int32_t i32; + void *ptr; +} screen_arg_t; + +typedef struct { + screen_arg_t args[4]; +} ScreenContext_t; + +// +void ui_render_screen(Screen_t *screen, ScreenContext_t *context); diff --git a/source/UI/UI_Elements.cpp b/source/UI/UI_Elements.cpp new file mode 100644 index 00000000..56d7a017 --- /dev/null +++ b/source/UI/UI_Elements.cpp @@ -0,0 +1,53 @@ +#include "UI_Elements.h" + +void render_Text(screen_arg_t *args); +void render_Number(screen_arg_t *args); +void render_Image(screen_arg_t *args); +void render_PowerSource(screen_arg_t *args); +void render_Temperature(screen_arg_t *args); +void render_InputVoltage(screen_arg_t *args); +void render_ScrollBar(screen_arg_t *args); +void render_CheckBox(screen_arg_t *args); +void render_TextScroller(screen_arg_t *args); + +void ui_render_element(ElementTypes_t element, screen_arg_t *args) { + switch (element) { + case ElementTypes_t::Text: + render_Text(args); + break; + case ElementTypes_t::Number: + render_Number(args); + break; + case ElementTypes_t::Image: + render_Image(args); + break; + case ElementTypes_t::PowerSource: + render_PowerSource(args); + break; + case ElementTypes_t::Temperature: + render_Temperature(args); + break; + case ElementTypes_t::InputVoltage: + render_InputVoltage(args); + break; + case ElementTypes_t::ScrollBar: + render_ScrollBar(args); + break; + case ElementTypes_t::CheckBox: + render_CheckBox(args); + break; + case ElementTypes_t::TextScroller: + render_TextScroller(args); + break; + } +} + +void render_Text(screen_arg_t *args) {} +void render_Number(screen_arg_t *args) {} +void render_Image(screen_arg_t *args) {} +void render_PowerSource(screen_arg_t *args) {} +void render_Temperature(screen_arg_t *args) {} +void render_InputVoltage(screen_arg_t *args) {} +void render_ScrollBar(screen_arg_t *args) {} +void render_CheckBox(screen_arg_t *args) {} +void render_TextScroller(screen_arg_t *args) {} \ No newline at end of file diff --git a/source/UI/UI_Elements.h b/source/UI/UI_Elements.h new file mode 100644 index 00000000..14b654d5 --- /dev/null +++ b/source/UI/UI_Elements.h @@ -0,0 +1,28 @@ +#pragma once +#include "UI.h" +typedef enum { + Text, // Basic text splat, using re-encoded strings + Number, // Draws numbers using best size for the height (always one line) + Image, // Pre-rendered bitmap that can be memcpy'ed in + PowerSource, // Draws a battery icon, or text for voltage, or DC power plug + Temperature, // Draws the number with temperature symbol following (height picks font) + InputVoltage, // Draws the number with V following and also 1 dp(height picks font) + ScrollBar, // Draws a vertical scrollbar, number sets percentage 0-100 + CheckBox, // Draws checkbox, ticked = number!=0 + TextScroller, // Renders text, scrolling with time +} ElementTypes_t; + +typedef struct { + struct { + uint8_t x; + uint8_t y; + } position; + struct { + uint8_t w; + uint8_t h; + } size; + + +} ElementSettings_t; + +void ui_render_element(ElementTypes_t element, screen_arg_t *args); \ No newline at end of file diff --git a/source/UI/layout_96x16.yaml b/source/UI/layout_96x16.yaml new file mode 100644 index 00000000..61d1fc5a --- /dev/null +++ b/source/UI/layout_96x16.yaml @@ -0,0 +1,246 @@ +layouts: + simplifiedHome: + mirrorOnRotate: true + elements: + - type: image + position: + x: 0 + y: 0 + size: + w: 42 + h: 16 + - type: image + position: + x: 0 + y: 0 + size: + w: 42 + h: 16 + - type: powerSource + position: + x: 84 + y: 0 + size: + w: 12 + h: 16 + + simplifiedHomeWarning: + mirrorOnRotate: true + elements: + - type: text + position: + x: 0 + y: 0 + size: + w: 42 + h: 16 + - type: image + position: + x: 0 + y: 0 + size: + w: 42 + h: 16 + - type: powerSource + position: + x: 84 + y: 0 + size: + w: 12 + h: 16 + detailedHome: + elements: + - type: temperature + position: + x: 0 + y: 0 + size: + w: 48 + h: 16 + - type: temperature + position: + x: 48 + y: 0 + size: + w: 32 + h: 8 + - type: inputVoltage + position: + x: 48 + y: 0 + size: + w: 32 + h: 8 + detailedHomeWarning: + elements: + - type: temperature + position: + x: 0 + y: 0 + size: + w: 48 + h: 16 + - type: inputVoltage + position: + x: 48 + y: 0 + size: + w: 32 + h: 8 + + SebugMenu: + elements: + - type: text + position: + x: 0 + y: 0 + size: + w: 96 + h: 8 + - type: text + position: + x: 0 + y: 8 + size: + w: 48 + h: 8 + - type: number + position: + x: 48 + y: 8 + size: + w: 48 + h: 8 + SettingsCategory: + elements: + - type: text + position: + x: 0 + y: 0 + size: + w: 78 + h: 16 + - type: image + position: + x: 79 + y: 0 + size: + w: 16 + h: 16 + - type: scrollBar + x: 95 + h: 16 + SettingsEntryBool: + elements: + - type: text + position: + x: 0 + y: 0 + size: + w: 78 + h: 16 + - type: checkbox + position: + x: 79 + y: 0 + size: + w: 16 + h: 16 + - type: scrollBar + x: 95 + h: 16 + + SettingsEntry3Number: + elements: + - type: text + position: + x: 0 + y: 0 + size: + w: 78 + h: 16 + - type: number + position: + x: 79 + y: 0 + size: + w: 36 + h: 16 + - type: scrollBar + x: 95 + h: 16 + + SettingsEntry2Number: + elements: + - type: text + position: + x: 0 + y: 0 + size: + w: 78 + h: 16 + - type: number + position: + x: 79 + y: 0 + size: + w: 36 + h: 16 + - type: scrollBar + x: 95 + h: 16 + SettingsEntry1Number: + elements: + - type: text + position: + x: 0 + y: 0 + size: + w: 78 + h: 16 + - type: number + position: + x: 79 + y: 0 + size: + w: 36 + h: 16 + - type: scrollBar + x: 95 + h: 16 + SettingsEntry1Text: + elements: + - type: text + position: + x: 0 + y: 0 + size: + w: 78 + h: 16 + - type: number + position: + x: 79 + y: 0 + size: + w: 36 + h: 16 + - type: scrollBar + x: 95 + h: 16 + ScrollingText: + elements: + - type: textScroller + position: + x: 0 + y: 0 + size: + w: 96 + h: 16 + SolderingMode: + elements: + DetailedSolderingMode: + elements: + NumberAdjust: + elements: + +