# 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)
