# DreamStack Thin Client — Waveshare ESP32-P4 10.1" Panel

A 10.1" touchscreen that acts as a **dumb pixel display with touch input**. All rendering happens on the source device (laptop, Pi, server). The panel just shows pixels and reports touches.

## Architecture

```
SOURCE (laptop/Pi)              RELAY (:9100)              THIS DEVICE
───────────────                 ─────────────              ───────────

DreamStack app renders          WebSocket hub              Waveshare ESP32-P4
  800×1280 canvas                                          10.1" IPS + touch
                                
pixels ──→ XOR delta ──→ RLE ──→ relay ────────────────→   RLE decode
                                                           XOR apply
                                                           blit to screen
                                
                                ←── touch {id,x,y,phase} ← GT9271 touch
```

## Hardware

| Component | Spec |
|---|---|
| Board | Waveshare ESP32-P4-WIFI6 |
| Display | 10.1" IPS, 800×1280, MIPI DSI |
| Touch | GT9271, 10-point capacitive, toughened glass |
| CPU | ESP32-P4 RISC-V 400MHz |
| RAM | 32MB PSRAM (framebuffer lives here) |
| WiFi | WiFi 6 (ESP32-C6) |
| Display driver | `waveshare/esp_lcd_jd9365_10_1` (JD9365) |

## Project Structure

```
devices/waveshare-p4-panel/
├── CMakeLists.txt              # ESP-IDF project
├── README.md                   # This file
└── main/
    ├── CMakeLists.txt          # Component registration
    ├── idf_component.yml       # Dependencies (display driver, WebSocket)
    ├── Kconfig.projbuild       # WiFi SSID/password, relay URL
    ├── main.c                  # Entry point: WiFi → WS → receive/blit/touch
    ├── ds_codec.h              # RLE decode + XOR apply (header)
    ├── ds_codec.c              # RLE decode + XOR apply (implementation)
    └── ds_protocol.h           # Bitstream header parsing + touch encoding
```

## Building

### Prerequisites
- ESP-IDF v5.3+ ([install guide](https://docs.espressif.com/projects/esp-idf/en/latest/esp32p4/get-started/))
- VSCode + ESP-IDF extension (recommended)

### Build & Flash
```bash
# Set target to ESP32-P4
idf.py set-target esp32p4

# Configure WiFi and relay URL
idf.py menuconfig
# → DreamStack Thin Client → WiFi SSID, Password, Relay URL

# Build
idf.py build

# Flash (connect via USB-C)
idf.py -p /dev/ttyUSB0 flash monitor
```

## TODO (pending hardware arrival)
- [ ] Wire up `display_init()` with actual MIPI DSI + JD9365 driver
- [ ] Wire up `touch_task()` with GT9271 I2C touch driver
- [ ] Test framebuffer allocation in PSRAM (800×1280×2 = 2MB)
- [ ] Measure end-to-end latency (target: <50ms)
- [ ] Add reconnection logic for WiFi + WebSocket drops
