CDC Badge OS
Firmware for the CDC Badge v1.0 hardware security key
Loading...
Searching...
No Matches
CanvasView.h
Go to the documentation of this file.
1#pragma once
2
3#include "cdc_ui/IView.h"
4#include <cstddef>
5#include <cstdint>
6
7class Gdey029T94;
8
9namespace cdc::ui {
10
22class CanvasView : public ViewBase {
23public:
24 enum class WidgetType : uint8_t {
25 None = 0,
26 Slider = 1,
27 Text = 2,
28 Button = 3,
29 };
30
31 enum class WidgetEvent : uint8_t {
35 };
36
37 static constexpr uint8_t MAX_WIDGETS = 8;
38 static constexpr uint16_t MAX_TEXT_LEN = 256;
39 static constexpr uint16_t T9_SETTLE_MS = 800;
40
43 static constexpr uint16_t MAX_CMDS = 96;
44 static constexpr uint16_t TEXT_ARENA = 2048;
45
46 using KeyCallback = void(*)(char key, uint32_t focused_widget);
47 using WidgetCallback = void(*)(uint32_t widget_id, WidgetEvent event);
48 using LongPressCallback = void(*)(char key);
49
50 void init(const char* title);
51
52 void setKeyCallback(KeyCallback cb) { keyCb_ = cb; }
53 void setWidgetCallback(WidgetCallback cb) { widgetCb_ = cb; }
57 void setFooter(const char* hint);
58 void setKeyRepeat(uint16_t initial_ms, uint16_t repeat_ms);
59 void getBodySize(uint16_t* w, uint16_t* h) const;
60
61 void clearBody();
62 void setTextSize(uint8_t size) { textSize_ = size > 0 ? size : 1; }
63 void setTextInverted(bool inverted) { textInverted_ = inverted; }
65 void setFontId(uint8_t font_id) { fontId_ = font_id; }
66 void drawText(int16_t x, int16_t y, const char* text);
67 void drawTextAligned(int16_t x, int16_t y, int16_t w, const char* text, uint8_t align);
68 void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, bool filled);
69 void invertRect(int16_t x, int16_t y, int16_t w, int16_t h);
70 void drawHLine(int16_t x, int16_t y, int16_t w);
71 void drawVLine(int16_t x, int16_t y, int16_t h);
72 void commit(bool full_refresh);
73
74 bool addSlider(uint32_t id, int32_t min, int32_t max, int32_t initial, int32_t step);
75 bool addText(uint32_t id, uint16_t max_len, const char* initial);
76 bool addButton(uint32_t id);
77 bool removeWidget(uint32_t id);
78
79 bool setValue(uint32_t id, int32_t value);
80 bool getValue(uint32_t id, int32_t* out) const;
81 bool setText(uint32_t id, const char* text);
82 int getText(uint32_t id, char* out, size_t cap) const;
83
84 bool setFocus(uint32_t id);
85 uint32_t getFocus() const { return focused_; }
86
87 void render(bool partial) override;
88 InputResult onKey(char key) override;
89 InputResult onLongPress(char key) override;
90 void onEnter(void* context) override;
91 void onResume() override;
92 void onExit() override;
93 const char* getName() const override { return "CanvasView"; }
94
95private:
96 enum class CmdType : uint8_t { Text, TextAligned, Rect, HLine, VLine };
97
98 struct DrawCmd {
99 CmdType type = CmdType::Text;
100 int16_t x = 0;
101 int16_t y = 0;
102 int16_t w = 0;
103 int16_t h = 0;
104 uint16_t strOff = 0; // byte offset into textArena_
105 uint16_t strLen = 0; // string length (excluding NUL)
106 uint8_t align = 0;
107 uint8_t fontId = 0;
108 uint8_t textSize = 1;
109 bool filled = false;
110 bool inverted = false;
111 };
112
113 struct Widget {
114 uint32_t id = 0;
116 int32_t value = 0;
117 int32_t min = 0;
118 int32_t max = 0;
119 int32_t step = 1;
120 uint16_t max_len = 0;
121 uint16_t text_len = 0;
122 char text[MAX_TEXT_LEN] = {0};
123 char t9_last_key = 0;
124 uint8_t t9_press_count = 0;
125 uint32_t t9_last_time = 0;
126 };
127
128 Widget* findWidget(uint32_t id);
129 const Widget* findWidget(uint32_t id) const;
130 Widget* focusedWidget();
131 InputResult dispatchKeyToWidget(Widget& w, char key);
132 void t9_commit_pending(Widget& w);
133 void t9_apply_key(Widget& w, char key, uint32_t now);
134
135 Gdey029T94* gfx() const;
136 void applyKeypadConfig();
137 uint16_t internText(const char* text, uint16_t* outLen);
138 void replayDisplayList();
139 void paintText(int16_t x, int16_t y, int16_t w, const char* text,
140 uint8_t align, uint8_t fontId, uint8_t textSize,
141 bool inverted);
142 int bodyTop() const { return headerHeight_; }
143 int bodyBottom() const;
144
145 Widget widgets_[MAX_WIDGETS] {};
146 uint8_t widgetCount_ = 0;
147 uint32_t focused_ = 0;
148
149 const char* footer_ = nullptr;
150 KeyCallback keyCb_ = nullptr;
151 WidgetCallback widgetCb_ = nullptr;
152 LongPressCallback longPressCb_ = nullptr;
153
154 DrawCmd cmds_[MAX_CMDS] {};
155 uint16_t cmdCount_ = 0;
156 char textArena_[TEXT_ARENA] {};
157 uint16_t textArenaUsed_ = 0;
158 bool overflowLogged_ = false;
159
160 uint8_t textSize_ = 1;
161 uint8_t fontId_ = 0;
162 bool textInverted_ = false;
163 int headerHeight_ = 18;
164 bool needsFullRefresh_ = true;
165
166 uint16_t keyRepeatInitialMs_ = 0;
167 uint16_t keyRepeatPeriodMs_ = 0;
168 bool headerDrawnOnce_ = false;
169};
170
171} // namespace cdc::ui
Generic canvas view exposed to WASM plugins for custom UIs.
Definition CanvasView.h:22
void getBodySize(uint16_t *w, uint16_t *h) const
bool removeWidget(uint32_t id)
InputResult onLongPress(char key) override
int getText(uint32_t id, char *out, size_t cap) const
void(*)(uint32_t widget_id, WidgetEvent event) WidgetCallback
Definition CanvasView.h:47
void drawText(int16_t x, int16_t y, const char *text)
void(*)(char key) LongPressCallback
Definition CanvasView.h:48
void drawHLine(int16_t x, int16_t y, int16_t w)
uint32_t getFocus() const
Definition CanvasView.h:85
void init(const char *title)
InputResult onKey(char key) override
void commit(bool full_refresh)
void onResume() override
static constexpr uint16_t MAX_CMDS
Definition CanvasView.h:43
void onExit() override
void setLongPressCallback(LongPressCallback cb)
void onEnter(void *context) override
void setWidgetCallback(WidgetCallback cb)
Definition CanvasView.h:53
static constexpr uint8_t MAX_WIDGETS
Definition CanvasView.h:37
bool setFocus(uint32_t id)
void setFontId(uint8_t font_id)
Select one of the canonical font ids (see cdc_views/Fonts.h).
Definition CanvasView.h:65
bool setValue(uint32_t id, int32_t value)
bool addText(uint32_t id, uint16_t max_len, const char *initial)
bool getValue(uint32_t id, int32_t *out) const
bool addButton(uint32_t id)
bool setText(uint32_t id, const char *text)
static constexpr uint16_t T9_SETTLE_MS
Definition CanvasView.h:39
static constexpr uint16_t MAX_TEXT_LEN
Definition CanvasView.h:38
void invertRect(int16_t x, int16_t y, int16_t w, int16_t h)
void setKeyRepeat(uint16_t initial_ms, uint16_t repeat_ms)
bool addSlider(uint32_t id, int32_t min, int32_t max, int32_t initial, int32_t step)
void setFooter(const char *hint)
static constexpr uint16_t TEXT_ARENA
Definition CanvasView.h:44
void drawTextAligned(int16_t x, int16_t y, int16_t w, const char *text, uint8_t align)
void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, bool filled)
void(*)(char key, uint32_t focused_widget) KeyCallback
Definition CanvasView.h:46
void setTextInverted(bool inverted)
Definition CanvasView.h:63
const char * getName() const override
Definition CanvasView.h:93
void setTextSize(uint8_t size)
Definition CanvasView.h:62
void setKeyCallback(KeyCallback cb)
Definition CanvasView.h:52
void drawVLine(int16_t x, int16_t y, int16_t h)
Centralized key-code constants for cdc_views.
Definition IModule.h:8
InputResult
Definition IView.h:10