e68909d64d
Main / Build (BookPlayer) (push) Has been cancelled
Main / Build (Brainfuck) (push) Has been cancelled
Main / Build (Breakout) (push) Has been cancelled
Main / Build (Calculator) (push) Has been cancelled
Main / Build (Diceware) (push) Has been cancelled
Main / Build (EpubReader) (push) Has been cancelled
Main / Build (GPIO) (push) Has been cancelled
Main / Build (GraphicsDemo) (push) Has been cancelled
Main / Build (HelloWorld) (push) Has been cancelled
Main / Build (M5UnitTest) (push) Has been cancelled
Main / Build (Magic8Ball) (push) Has been cancelled
Main / Build (MediaKeys) (push) Has been cancelled
Main / Build (MystifyDemo) (push) Has been cancelled
Main / Build (SerialConsole) (push) Has been cancelled
Main / Build (Snake) (push) Has been cancelled
Main / Build (TamaTac) (push) Has been cancelled
Main / Build (TodoList) (push) Has been cancelled
Main / Build (TwoEleven) (push) Has been cancelled
Main / Bundle (push) Has been cancelled
- Migrates tactility-app-development from ~/.hermes/skills/ into .claude/skills/ for repo co-location - Adds AGENTS.md with local workstation context, hardware table, board-direct build/env wrapper (PYTHONPATH fix), ELF missing-symbol triage, app patterns (immersive, QVGA rail, tutorial 2-row, GameKit bubbling, screenshot rate-limit), and skill index Refs: personal Gitea mirror
5.6 KiB
5.6 KiB
Symbol Check — BibleVerse session (updated July 12 v5 pretty font)
Tool: undefined symbols vs firmware exports
import pathlib, re, subprocess
elf = pathlib.Path("Apps/BibleVerse/build/cmake-build-esp32s3/BibleVerse.app.elf")
r = subprocess.run(["zsh","-c", f"source ~/esp/esp-idf/export.sh >/dev/null 2>&1; xtensa-esp32s3-elf-nm -D {elf}"], capture_output=True, text=True)
undef = [l.split()[-1] for l in r.stdout.splitlines() if len(l.split())>=2 and l.split()[-2]=='U']
pat = re.compile(r'(?:ESP_ELFSYM_EXPORT|DEFINE_MODULE_SYMBOL)\s*\(\s*([A-Za-z0-9_]+)\s*\)')
exp=set()
for fp in pathlib.Path("../firmware").rglob("*.*"):
if 'build' in str(fp): continue
if fp.suffix not in ('.c','.h','.cpp'): continue
try: exp.update(m.group(1) for m in pat.finditer(fp.read_text(errors='ignore')))
except: pass
missing = [s for s in undef if s not in exp]
print(f"undef {len(undef)} missing {missing}")
Session results
- Before fix:
undef 68, missing ['lv_font_montserrat_14']— source used&lv_font_montserrat_14. - After
lvgl_get_text_font(FONT_SIZE_SMALL):undef 68, missing []✅ - Editorial v4: 0 missing, anim symbols ok, app 4413440 bytes, heap 54KB stable on .129
- v5 pretty font: Georgia Italic embedded C 26/22/20/18/16 + regular 24 via
lv_font_conv, 315KB.rodatain PSRAM, 0 missing, app 4.3MB, heap47539 free largest 20480 psram 4810944stable, screenshot 5336 bytes Habakkuk 1:17 serif italic editorial. - v6 final beautiful
2142871: 0 missing,undef 0, app 4.3M, heap46215-47591 free largest 20480 psram 4810396stable, screenshots 8683 menu visible (top Zeph 1:3 / 31094 + bottom pills) + 6882 immersive hidden, lift -7 15px corrected from -22 30px per user, black bar fixed. Gotchalv_timer_t user_datafield incomplete →t->user_datainvalid → must uselv_timer_get_user_data(t)+lv_timer_set_user_data(exports 372/373/382/388). Checkedgrep timer symbols.c. Timer used for chrome auto-hide 10s + book browser anim.
Known missing table
| Symbol | Status | Workaround |
|---|---|---|
lv_font_montserrat_14/18/24 |
Not exported | lvgl_get_text_font(FONT_SIZE_SMALL/DEFAULT/LARGE) OR embedded C serif via lv_font_conv → see pretty-font.md |
LV_SYMBOL_STAR |
May be absent | Use LV_SYMBOL_OK, LV_SYMBOL_DUMMY |
xTaskGetCurrentTaskHandle |
Not exported | Avoid task identity check; release lock |
lv_image_set_rotation |
Not exported | lv_obj_set_style_transform_rotation(obj, deg*10, 0) |
cJSON, esp_websocket_client |
Static | Vendor source or raw lwip_socket APIs |
New missing from v2/v3/v4/v5 UI passes
lv_obj_set_style_bg_grad_color/dir/stop→ Not exported 0.8.0-dev. Gradient failsmissing symbol. Use solid0x0E0E14.LV_OPA_95→ Not defined (only 0/10/20/30/40/50/60/70/80/90/100/COVER/TRANSP). UseCOVERor90.lv_arc_create,lv_arc_set_range/value/bg_angles,lv_arc_get_value→ Not exported on 0.7.0-dev, addeddff93cb6 Add lv_arc.h symbols (#496)after 0.7 release. Symptom blue modalError / Application failed to start: missing symbol / OK, heap healthy ~31KB not OOM. Fix horizontal slide usinglv_slider_create+lv_indev_get_point/active. Seebook-browser.md.lv_roller_create→ Not exported 0.7 nor 0.8.lv_indev_get_point/active,lv_slider_create/range/value/set_value→ Exported since 0.6 safe.lv_anim_init,set_var/values/duration/exec_cb/path_cb/start,path_ease_out/linear/ease_in,path_ease_in_out→ Exported since 0.6 safe (checked lines 435-446). Used for editorial fade 220/300ms. Safe for 0.7/0.8 fleet.lv_binfont_create/destroy→ Exported 0.8 but VFS path fragile —tt_app_get_assets_pathreturns void, not bool (checkbuf[0]!='\0'). Prefer embedded C fonts viaLV_FONT_DECLARE— lives in PSRAM (315KB.rodata), no FS needed. Seepretty-font.md. Old.fntbins 52KB still bundled inassets/fonts/but not used.lv_font_tembedded C — no symbol needed, static const.
Heap OOM vs missing-symbol distinction
- OOM:
heap free 275B total 310KB largest_block 23, install500 failed to create temp directory, screenshot500. Cause 66-button browser 132-264 objs. Fix ~10 obj browser. - Missing symbol:
heap free 31779 largest 12288healthy, install200 ok, run200 ok, but app shows blueError missing symboldialog, screenshot200 2755. Fix checksymbols.c.
Font scaling v4/v5
Only 3 sizes via lvgl_get_text_font() fallback, but v5 uses embedded serif as primary:
size_t len = strlen(verse);
enum LvglFontSize fs; int line_sp, pad_v, pad_h;
if (len < 40) { fs=FONT_SIZE_LARGE; line_sp=14; pad_v=10; pad_h=28; letter_sp=1; } // v4 tightened
else if (len <100) { fs=FONT_SIZE_LARGE; line_sp=10; pad_v=8; pad_h=24; }
else if (len <200) { fs=FONT_SIZE_DEFAULT; line_sp=8; pad_v=6; pad_h=20; }
else if (len <350) { fs=FONT_SIZE_SMALL; line_sp=6; pad_v=4; pad_h=16; }
else { fs=FONT_SIZE_SMALL; line_sp=4; pad_v=2; pad_h=12; } // Esther 492c
// v5: resolve to embedded Georgia Italic 26/20/16 else fallback
lv_obj_set_style_text_font(lbl_verse, resolve_verse_font(ctx, fs), 0);
Proven .112 Genesis 2:10 77c LARGE, .129 Ephesians 1:4 4138 bytes screenshot editorial warm #F2F0E8 + ref uppercase tracking 2 #9A9AA8 gap 10, v5 Habakkuk 1:17 5336 bytes serif italic editorial vision PASS.
Exported: lvgl_get_text_font, get_text_font_height, get_shared_icon_font, set_style_text_font, timer_create, label_set_text, text_line_space, pad_*, text_opa, anim_*, LV_FONT_DECLARE (macro, not symbol).
CI: fail if missing>0, heap stable >40KB with fonts.