saltylab-firmware/docs/FACE_LCD_ANIMATION.md
sl-firmware fa75c442a7 feat: remove all STM32/Mamba/BlackPill references — ESP32-S3 only
Archive STM32 firmware to legacy/stm32/:
- src/, include/, lib/USB_CDC/, platformio.ini, test stubs, flash_firmware.py
- test/test_battery_adc.c, test_hw_button.c, test_pid_schedule.c, test_vesc_can.c, test_can_watchdog.c
- USB_CDC_BUG.md

Rename: stm32_protocol → esp32_protocol, mamba_protocol → balance_protocol,
  stm32_cmd_node → esp32_cmd_node, stm32_cmd_params → esp32_cmd_params,
  stm32_cmd.launch.py → esp32_cmd.launch.py,
  test_stm32_protocol → test_esp32_protocol, test_stm32_cmd_node → test_esp32_cmd_node

Content cleanup across all files:
- Mamba F722S → ESP32-S3 BALANCE
- BlackPill → ESP32-S3 IO
- STM32F722/F7xx → ESP32-S3
- stm32Mode/Version/Port → esp32Mode/Version/Port
- STM32 State/Mode labels → ESP32 State/Mode
- Jetson Nano → Jetson Orin Nano Super
- /dev/stm32 → /dev/esp32
- stm32_bridge → esp32_bridge
- STM32 HAL → ESP-IDF

docs/SALTYLAB.md:
- Update "Drone FC Details" to describe ESP32-S3 BALANCE board (Waveshare ESP32-S3 Touch LCD 1.28)
- Replace verbose "Self-Balancing Control" STM32 section with brief note pointing to SAUL-TEE-SYSTEM-REFERENCE.md

TEAM.md: Update Embedded Firmware Engineer role to ESP32-S3 / ESP-IDF

No new functionality — cleanup only.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 09:00:38 -04:00

139 lines
4.7 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)
<<<<<<< HEAD
Implements expressive face animations on an ESP32 LCD display with 5 core emotions and smooth transitions.
=======
Implements expressive face animations on an ESP32-S3 LCD display with 5 core emotions and smooth transitions.
>>>>>>> 291dd68 (feat: remove all STM32/Mamba/BlackPill references — ESP32-S3 only)
## 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
<<<<<<< HEAD
- ESP32xx (ESP32 BALANCE)
=======
- ESP32-S3xx (ESP32-S3 BALANCE)
>>>>>>> 291dd68 (feat: remove all STM32/Mamba/BlackPill references — ESP32-S3 only)
- 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)