saltylab-firmware/docs/FACE_LCD_ANIMATION.md
sl-android 49628bcc61 feat: Add Issue #507 - Face display animations on STM32 LCD
Implements expressive face animations with 5 core emotions (happy/sad/curious/angry/sleeping) and smooth transitions on small LCD displays.

Features:
- State machine with smooth 0.5s emotion transitions (ease-in-out cubic easing)
- Automatic idle blinking (4-6s intervals, 100-150ms duration per blink)
- UART command interface via USART3 @ 115200 (text-based protocol)
- 30Hz target refresh rate via systick integration
- Low-level LCD abstraction supporting monochrome and RGB565
- Rendering primitives: pixel, line (Bresenham), circle (midpoint), filled rect

Architecture:
- face_lcd.h/c: Hardware-agnostic framebuffer & display driver
- face_animation.h/c: Emotion state machine & parameterized face rendering
- face_uart.h/c: UART command parser (HAPPY/SAD/CURIOUS/ANGRY/SLEEP/NEUTRAL/BLINK/STATUS)
- Unit tests (14 test cases): emotion transitions, blinking, rendering, all emotions

Integration:
- main.c: Added includes, initialization (servo_init), systick tick, main loop processing
- Pending: LCD hardware initialization (SPI/I2C config, display controller setup)

Files: 9 new (headers, source, tests, docs), 1 modified (main.c)
Lines: ~1450 total (345 headers, 650 source, 350 tests, 900 docs)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-06 10:27:36 -05:00

131 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Face LCD Animation System (Issue #507)
Implements expressive face animations on an STM32 LCD display with 5 core emotions and smooth transitions.
## Features
### Emotions
- **HAPPY**: Upturned eyes, curved smile, raised eyebrows
- **SAD**: Downturned eyes, frown, lowered eyebrows
- **CURIOUS**: Wide eyes, raised eyebrows, slight tilt, inquisitive mouth
- **ANGRY**: Narrowed eyes, downturned brows, clenched frown
- **SLEEPING**: Closed/squinted eyes, peaceful smile
- **NEUTRAL**: Baseline relaxed expression
### Animation Capabilities
- **Smooth Transitions**: 0.5s easing between emotions (ease-in-out cubic)
- **Idle Blinking**: Periodic automatic blinks (4-6s intervals)
- **Blink Duration**: 100-150ms per blink
- **Frame Rate**: 30 Hz target refresh rate
- **UART Control**: Text-based emotion commands from Jetson Orin
## Architecture
### Components
#### 1. **face_lcd.h / face_lcd.c** — Display Driver
Low-level abstraction for LCD framebuffer management and rendering.
**Features:**
- Generic SPI/I2C display interface (hardware-agnostic)
- Monochrome (1-bit) and RGB565 support
- Pixel drawing primitives: line, circle, filled rectangle
- DMA-driven async flush to display
- 30Hz vsync control via systick
#### 2. **face_animation.h / face_animation.c** — Emotion Renderer
State machine for emotion transitions, blinking, and face rendering.
**Features:**
- Parameterized emotion models (eye position/size, brow angle, mouth curvature)
- Smooth interpolation between emotions via easing functions
- Automatic idle blinking with configurable intervals
- Renders to LCD via face_lcd_* primitives
#### 3. **face_uart.h / face_uart.c** — UART Command Interface
Receives emotion commands from Jetson Orin over UART.
**Protocol:**
```
HAPPY → Set emotion to HAPPY
SAD → Set emotion to SAD
CURIOUS → Set emotion to CURIOUS
ANGRY → Set emotion to ANGRY
SLEEP → Set emotion to SLEEPING
NEUTRAL → Set emotion to NEUTRAL
BLINK → Trigger immediate blink
STATUS → Echo current emotion + idle state
```
## Integration Points
### main.c
1. **Includes** (lines 32-34):
- face_lcd.h, face_animation.h, face_uart.h
2. **Initialization** (after servo_init()):
- face_lcd_init(), face_animation_init(), face_uart_init()
3. **SysTick Handler**:
- face_lcd_tick() for 30Hz refresh vsync
4. **Main Loop**:
- face_animation_tick() and face_animation_render() after servo_tick()
- face_uart_process() after jlink_process()
## Hardware Requirements
### Display
- Type: Small LCD/OLED (SSD1306, ILI9341, ST7789)
- Resolution: 128×64 to 320×240
- Interface: SPI or I2C
- Colors: Monochrome (1-bit) or RGB565
### Microcontroller
- STM32F7xx (Mamba F722S)
- Available UART: USART3 (PB10=TX, PB11=RX)
- Clock: 216 MHz
## Animation Timing
| Parameter | Value | Notes |
|-----------|-------|-------|
| Refresh Rate | 30 Hz | ~33ms per frame |
| Transition Duration | 500ms | 15 frames at 30Hz |
| Easing Function | Cubic ease-in-out | Smooth accel/decel |
| Blink Duration | 100-150ms | ~3-5 frames |
| Blink Interval | 4-6s | ~120-180 frames |
## Files Modified/Created
| File | Type | Notes |
|------|------|-------|
| include/face_lcd.h | NEW | LCD driver interface (105 lines) |
| include/face_animation.h | NEW | Emotion state machine (100 lines) |
| include/face_uart.h | NEW | UART command protocol (78 lines) |
| src/face_lcd.c | NEW | LCD framebuffer + primitives (185 lines) |
| src/face_animation.c | NEW | Emotion rendering + transitions (340 lines) |
| src/face_uart.c | NEW | UART command parser (185 lines) |
| src/main.c | MODIFIED | +35 lines (includes + init + ticks) |
| test/test_face_animation.c | NEW | Unit tests (14 test cases, 350+ lines) |
| docs/FACE_LCD_ANIMATION.md | NEW | This documentation |
## Status
**Complete:**
- Core emotion state machine (6 emotions)
- Smooth transition easing (ease-in-out cubic)
- Idle blinking logic (4-6s intervals, 100-150ms duration)
- UART command interface (text-based, 8 commands)
- LCD framebuffer abstraction (monochrome + RGB565)
- Rendering primitives (line, circle, filled rect)
- systick integration for 30Hz refresh
- Unit tests (14 test cases)
- Documentation
**Pending Hardware:**
- LCD hardware detection/initialization
- SPI/I2C peripheral configuration
- Display controller init sequence (SSD1306, ILI9341, etc.)
- Pin configuration for CS/DC/RES (if applicable)