feat(ui-lvgl): phone-style Home -- clock with telemetry, minimap, app grid

Home pages: favourites, the clock (tap for Clock) with three telemetry
fields picked by holding one (shared dashboard_fields), a minimap that
frames you, live shares and the target (tap for the Navigation map), and
the apps in 3x2 pages. The side button now returns to the clock page with
a cross-fade instead of going back. Home moves to HomeScreen.h.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jakub
2026-09-27 01:30:12 +02:00
co-authored by Claude Opus 5.5
parent a40a87d02c
commit e52ec2a97e
5 changed files with 612 additions and 205 deletions
@@ -41,6 +41,8 @@ public:
// ── Navigation (called from LVGL event callbacks) ────────────────────────
void showHome();
void setHomePage(int page);
void goHome(); // the side button: Home's clock page
void homeFieldSet(int slot, int field);
void showChats();
void showContacts();
void showSettings();
@@ -264,6 +266,12 @@ private:
// and keyboards go on it, not on the one sliding out).
lv_obj_t* screen() const { return _scr ? _scr : lv_screen_active(); }
void buildHome();
void buildHomeClock(lv_obj_t* box);
void buildHomeMap(lv_obj_t* box);
void homeFieldText(uint8_t field, char* buf, int n);
void homeMapFit();
void homeMapLayout();
void homeMapLoop();
void refreshHome();
void homeSwipePoll();
void buildChats();
@@ -393,6 +401,7 @@ private:
Screen _shown_screen = SCR_HOME;
char _shown_title[32] = "";
bool _nav_back = false; // set by back() around the screen it shows
bool _fade_next = false; // newScreen() cross-fades the next screen in (the side button)
lv_obj_t* _scr = nullptr; // the screen newScreen() built (active once its slide starts)
static int screenDepth(Screen s);
bool _asleep = false;