6#include "freertos/FreeRTOS.h"
7#include "freertos/semphr.h"
69 using KeyCallback = void(*)(
char key, uint32_t focused_widget);
74 using AnimCallback = void(*)(uint32_t done_action_id, uint32_t handle,
77 void init(
const char* title);
96 void setKeyRepeat(uint16_t initial_ms, uint16_t repeat_ms);
102 void clearBody(
bool keep_sprites =
false);
103 void setTextSize(uint8_t size) { textSize_ = size > 0 ? size : 1; }
111 void drawText(int16_t x, int16_t y,
const char* text);
112 void drawTextAligned(int16_t x, int16_t y, int16_t w,
const char* text, uint8_t align);
113 void drawRect(int16_t x, int16_t y, int16_t w, int16_t h,
bool filled);
115 void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1);
116 void drawCircle(int16_t x, int16_t y, int16_t r,
bool filled);
117 void drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
118 int16_t x2, int16_t y2,
bool filled);
119 void drawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r,
bool filled);
122 void drawBitmap(int16_t x, int16_t y, int16_t w, int16_t h,
123 const uint8_t* data, uint32_t len);
124 void drawHLine(int16_t x, int16_t y, int16_t w);
125 void drawVLine(int16_t x, int16_t y, int16_t h);
126 void commit(
bool full_refresh);
138 bool elemMove(uint32_t
id, int16_t dx, int16_t dy);
140 bool elemShow(uint32_t
id,
bool visible);
150 bool elemSetZ(uint32_t
id, int8_t z);
152 bool elemGetOffset(uint32_t
id, int16_t* ox, int16_t* oy)
const;
156 uint16_t* w, uint16_t* h);
162 int32_t
spriteCreate(uint16_t w, uint16_t h, uint16_t frame_count,
163 const uint8_t* data, uint32_t len);
164 bool spriteSetMask(uint32_t handle,
const uint8_t* mask, uint32_t len);
172 bool spritePlay(uint32_t handle, uint8_t mode, uint16_t frame_ms,
173 uint16_t repeat, uint32_t done_action_id);
179 void drawSprite(int16_t x, int16_t y, uint32_t handle);
191 int32_t
marquee(int16_t x, int16_t y, int16_t window_w,
const char* text,
192 uint16_t step_px, uint16_t frame_ms);
201 uint32_t
animBlink(uint32_t elem_id, uint16_t period_ms, uint16_t count,
202 uint32_t done_action_id);
204 bool animPause(uint32_t handle,
bool paused);
212 bool addSlider(uint32_t
id, int32_t min, int32_t max, int32_t initial, int32_t step);
213 bool addText(uint32_t
id, uint16_t max_len,
const char* initial);
217 bool setValue(uint32_t
id, int32_t value);
218 bool getValue(uint32_t
id, int32_t* out)
const;
219 bool setText(uint32_t
id,
const char* text);
220 int getText(uint32_t
id,
char* out,
size_t cap)
const;
225 void render(
bool partial)
override;
228 void onEnter(
void* context)
override;
232 void onTick(uint32_t nowMs)
override;
233 const char*
getName()
const override {
return "CanvasView"; }
244 enum class CmdType : uint8_t {
245 Text, TextAligned, Rect, HLine, VLine,
246 Pixel, Line, Circle, Triangle, RoundRect, Bitmap, Sprite
250 CmdType type = CmdType::Text;
263 uint8_t textSize = 1;
266 bool inverted =
false;
276 uint16_t max_len = 0;
277 uint16_t text_len = 0;
279 char t9_last_key = 0;
280 uint8_t t9_press_count = 0;
281 uint32_t t9_last_time = 0;
294 Widget* findWidget(uint32_t
id);
295 const Widget* findWidget(uint32_t
id)
const;
296 Elem* findElem(uint32_t
id);
297 const Elem* findElem(uint32_t
id)
const;
298 void applyElemOffset(DrawCmd& c, int16_t ox, int16_t oy)
const;
299 void compactArenas();
300 void pushCmd(DrawCmd& c);
301 bool dropElemCmds(uint32_t
id);
302 void replayCmd(
const DrawCmd& cmd);
303 bool cmdBounds(
const DrawCmd& c, int16_t* x, int16_t* y,
304 uint16_t* w, uint16_t* h);
305 bool ensureSpriteArena();
308 bool getElemOffset(uint32_t elemId, int16_t* ox, int16_t* oy)
override;
309 bool setElemOffset(uint32_t elemId, int16_t ox, int16_t oy)
override;
310 bool setElemVisible(uint32_t elemId,
bool visible)
override;
311 Widget* focusedWidget();
312 InputResult dispatchKeyToWidget(Widget& w,
char key);
313 void t9_commit_pending(Widget& w);
314 void t9_apply_key(Widget& w,
char key, uint32_t now);
316 Gdey029T94* gfx()
const;
317 void applyKeypadConfig();
318 uint16_t internText(
const char* text, uint16_t* outLen);
319 uint16_t internBlob(
const uint8_t* data, uint16_t len);
321 void replayDisplayList();
322 void paintText(int16_t x, int16_t y, int16_t w,
const char* text,
323 uint8_t align, uint8_t fontId, uint8_t textSize,
325 int bodyTop()
const {
return headerHeight_; }
326 int bodyBottom()
const;
329 uint8_t widgetCount_ = 0;
330 uint32_t focused_ = 0;
333 uint8_t elemCount_ = 0;
334 uint32_t curElem_ = 0;
336 const char* footer_ =
nullptr;
342 uint16_t cmdCount_ = 0;
344 uint16_t textArenaUsed_ = 0;
346 uint16_t blobUsed_ = 0;
347 bool overflowLogged_ =
false;
349 uint8_t textSize_ = 1;
351 uint8_t shade_ = 255;
352 bool inkWhite_ =
false;
353 bool textInverted_ =
false;
354 int headerHeight_ = 18;
355 bool needsFullRefresh_ =
true;
357 uint16_t keyRepeatInitialMs_ = 0;
358 uint16_t keyRepeatPeriodMs_ = 0;
359 bool headerDrawnOnce_ =
false;
363 SemaphoreHandle_t editMutex_ =
nullptr;
366 anim::CanvasAnimator animator_;
367 anim::SpriteStore sprites_;
372 uint32_t lastAnimStepMs_ = 0;
373 uint32_t idleCleanupAtMs_ = 0;
374 uint32_t pausedAtMs_ = 0;
375 uint8_t animCommitCount_ = 0;
378 volatile bool animActive_ =
false;
Host-side animation engine for the plugin canvas: fixed-point easing, element-offset tweens and multi...
Shared RAII wrappers for firmware resources.
Generic canvas view exposed to WASM plugins for custom UIs.
bool elemShow(uint32_t id, bool visible)
Show or hide the element (hidden elements are skipped on replay).
void setAnimCallback(AnimCallback cb)
uint32_t animStart(const anim::TweenConfig &cfg)
void getBodySize(uint16_t *w, uint16_t *h) const
bool removeWidget(uint32_t id)
void endElem()
Stop tagging draw calls with an element id.
bool spriteSetScale(uint32_t handle, uint8_t scale)
Integer upscale 1..4 applied whenever the sprite is drawn.
static constexpr uint8_t ANIM_FPS_DEFAULT
bool elemGetBounds(uint32_t id, int16_t *x, int16_t *y, uint16_t *w, uint16_t *h)
InputResult onLongPress(char key) override
int getText(uint32_t id, char *out, size_t cap) const
uint32_t animBlink(uint32_t elem_id, uint16_t period_ms, uint16_t count, uint32_t done_action_id)
void(*)(uint32_t widget_id, WidgetEvent event) WidgetCallback
@ ANIM_REFRESH_LIGHT
PARTIAL_LIGHT always, no automatic cleanup.
@ ANIM_REFRESH_AUTO
PARTIAL_LIGHT while running + FAST cleanup.
void drawText(int16_t x, int16_t y, const char *text)
void(*)(char key) LongPressCallback
void drawHLine(int16_t x, int16_t y, int16_t w)
uint32_t getFocus() const
void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1)
static constexpr uint8_t ANIM_FPS_MAX
void clearBody(bool keep_sprites=false)
bool beginElem(uint32_t id)
void drawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, bool filled)
void init(const char *title)
InputResult onKey(char key) override
void(*)(uint32_t done_action_id, uint32_t handle, uint32_t ref_id) AnimCallback
bool elemClear(uint32_t id)
void commit(bool full_refresh)
bool spriteFrameView(uint32_t handle, anim::SpriteStore::FrameView *out) const
bool spriteDestroy(uint32_t handle)
static constexpr uint16_t MAX_CMDS
static constexpr uint8_t ANIM_HYGIENE_COMMITS
Endless animations get one hygiene FAST every this many anim commits.
bool spriteSetFlags(uint32_t handle, uint8_t flags)
void setLongPressCallback(LongPressCallback cb)
void onEnter(void *context) override
bool animPause(uint32_t handle, bool paused)
bool spriteStop(uint32_t handle)
static constexpr uint16_t ANIM_CLEANUP_IDLE_MS
Idle time after the last animation before the AUTO ghost-cleanup FAST.
uint8_t animActiveCount() const
Live tweens plus playing sprites.
void setWidgetCallback(WidgetCallback cb)
static constexpr uint16_t BLOB_ARENA
Pixel-data arena for recorded bitmaps. 8 KB holds one full-body mono bitmap.
void drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, bool filled)
bool spriteSetMask(uint32_t handle, const uint8_t *mask, uint32_t len)
static constexpr uint8_t MAX_WIDGETS
bool setFocus(uint32_t id)
bool spritePlay(uint32_t handle, uint8_t mode, uint16_t frame_ms, uint16_t repeat, uint32_t done_action_id)
void setFontId(uint8_t font_id)
Select one of the canonical font ids (see cdc_views/Fonts.h).
bool spriteSetFrameDurations(uint32_t handle, const uint16_t *ms, uint16_t count)
int8_t animState(uint32_t handle) const
void drawBitmap(int16_t x, int16_t y, int16_t w, int16_t h, const uint8_t *data, uint32_t len)
bool animCancel(uint32_t handle)
Handle 0 cancels all (no events).
bool setValue(uint32_t id, int32_t value)
bool addText(uint32_t id, uint16_t max_len, const char *initial)
bool elemSetZ(uint32_t id, int8_t z)
static constexpr uint32_t SPRITE_ARENA
Pixel arena for sprite frame sheets (lazy PSRAM allocation).
bool getValue(uint32_t id, int32_t *out) const
bool addButton(uint32_t id)
void setEditMutex(SemaphoreHandle_t mutex)
bool setText(uint32_t id, const char *text)
static constexpr uint16_t T9_SETTLE_MS
bool elemRemove(uint32_t id)
hal::RefreshMode preferredEnterRefresh() const override
bool elemMove(uint32_t id, int16_t dx, int16_t dy)
Shift the element's replay offset by a delta.
int32_t spriteGetFrame(uint32_t handle) const
static constexpr uint16_t MAX_TEXT_LEN
void setKeyRepeat(uint16_t initial_ms, uint16_t repeat_ms)
int32_t marquee(int16_t x, int16_t y, int16_t window_w, const char *text, uint16_t step_px, uint16_t frame_ms)
void setShade(uint8_t shade)
Fill ink for subsequent filled shapes: 0=none, 255=solid, between=dither.
bool spriteSetFrame(uint32_t handle, uint16_t frame)
void drawCircle(int16_t x, int16_t y, int16_t r, bool filled)
bool elemSetOffset(uint32_t id, int16_t ox, int16_t oy)
Set the element's replay offset relative to its recorded coordinates.
bool addSlider(uint32_t id, int32_t min, int32_t max, int32_t initial, int32_t step)
bool setAnimPolicy(uint8_t policy, uint8_t max_fps)
Configure refresh policy and step-rate cap (0 = default 4 fps).
void drawPixel(int16_t x, int16_t y)
void setFooter(const char *hint)
static constexpr uint16_t TEXT_ARENA
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
void setTextInverted(bool inverted)
bool elemGetOffset(uint32_t id, int16_t *ox, int16_t *oy) const
Read the element's current replay offset.
void drawSprite(int16_t x, int16_t y, uint32_t handle)
Record a draw-by-reference of the sprite's current frame at (x, y).
bool prefersLightRefresh() const override
int32_t spriteCreate(uint16_t w, uint16_t h, uint16_t frame_count, const uint8_t *data, uint32_t len)
void onTick(uint32_t nowMs) override
const char * getName() const override
void setTextSize(uint8_t size)
static constexpr uint8_t MAX_ELEMS
void setKeyCallback(KeyCallback cb)
void drawVLine(int16_t x, int16_t y, int16_t h)
void setInkWhite(bool white)
Draw subsequent shapes in white instead of black (eraser/wipes).
Interface the animator drives; implemented by CanvasView on its elements.
std::unique_ptr< T[], CapsFreeDeleter > PsramUniquePtr
Centralized key-code constants for cdc_views.
Replay accessors: geometry, flags and pixel pointers of a sprite.
Tween start configuration (mirrors host_anim_t plus the blink shorthand).