Area
Firmware
Problem
#37 added TinyEngineerExpressions and an OLED-only expression-demo, but the library is not used by the robot firmware.
- Existing activity-driven eye modes stay the only on-robot face path.
- Applications and Config cannot choose the kaomoji catalogue without a separate demo flash.
/anim docs and eye behavior assume classic procedural eyes only (blinks, flicker, X eyes, etc.).
Result: the expression library is optional and isolated; desk-robot animations cannot show those faces.
Proposed change
Integrate #37 faces as a selectable OLED eye style beside classic rounded eyes. Keep animation → servo / audio / RGB unchanged; only the OLED drawer switches.
- Extensible style layer under
src/display/eyes/styles/ (EyeStyleRenderer + registry) so later styles do not fork the animation registry.
- New setting
eyes_style: classic | kaomoji (NVS, GET/POST /settings, Config). Default classic. Apply immediately.
- When
kaomoji, map animation / eye mode / sleep phase → Expression and render() into the shared OLED (never run classic and kaomoji drawers together).
- Reset face playback to elapsed 0 when the expression or style changes (sleep phase, live style switch).
- Docs: qualify classic-specific eye details under
/anim; document the kaomoji map; cross-link from eyes_style.
Animation → face map
| Animation / phase |
Face |
none (idle) |
Idle |
typing, thinking |
Thinking |
reading, attention |
Curious |
ring |
Surprise |
welcome |
Happy |
error |
Angry |
abort |
Panic |
wakeup |
Sleepy |
sleep / sleep-close |
Sleep |
| sleep-open |
Idle |
dead |
Sad (no classic X) |
Acceptance criteria
Out of scope
- Per-anim HTTP face overrides
- Unused faces (Laugh, Wink, Smug, Cry, Shy, Love) unless mapped later
- Servo / audio / RGB changes for this feature
References
Area
Firmware
Problem
#37 added
TinyEngineerExpressionsand an OLED-onlyexpression-demo, but the library is not used by the robot firmware./animdocs and eye behavior assume classic procedural eyes only (blinks, flicker, X eyes, etc.).Result: the expression library is optional and isolated; desk-robot animations cannot show those faces.
Proposed change
Integrate #37 faces as a selectable OLED eye style beside classic rounded eyes. Keep animation → servo / audio / RGB unchanged; only the OLED drawer switches.
src/display/eyes/styles/(EyeStyleRenderer+ registry) so later styles do not fork the animation registry.eyes_style:classic|kaomoji(NVS,GET/POST /settings, Config). Defaultclassic. Apply immediately.kaomoji, map animation / eye mode / sleep phase →Expressionandrender()into the shared OLED (never run classic and kaomoji drawers together)./anim; document the kaomoji map; cross-link fromeyes_style.Animation → face map
none(idle)typing,thinkingreading,attentionringwelcomeerrorabortwakeupsleep/ sleep-closedeadAcceptance criteria
eyes_stylein NVS +/settings+ Config; docs/HTML synced.classicpreserves current eye sequences.kaomojimaps all anims; sleep/wake and style switches start at frame 0.pio run; validateeyes_style; expression asset checks still pass.Out of scope
References
lib/TinyEngineerExpressions/pio run -e expression-demo