Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8b57a6f

Browse files
committed
docs: update README with ADR-045–048, Observatory, adaptive classifier, AMOLED display
- Update ADR count from 44 to 48 - Add adaptive classifier (ADR-048) to Intelligence features - Add Observatory visualization (ADR-047) and AMOLED display (ADR-045) to Deployment features - Update screenshot to v2-screen.png - Add ADR-045 (AMOLED), ADR-046 (Android TV), ADR-047 (Observatory), DDD deployment model - Add AMOLED display firmware (display_hal, display_task, display_ui, LVGL config) - Add Observatory UI (13 Three.js modules, CSS, HTML entry point) - Add trained adaptive model JSON - Update .gitignore for managed_components, recordings, .swarm Co-Authored-By: claude-flow <[email protected]>
1 parent 5fa61ba commit 8b57a6f

35 files changed

Lines changed: 8672 additions & 5 deletions

.gitignore

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,16 @@ firmware/esp32-csi-node/sdkconfig.defaults
88
firmware/esp32-csi-node/sdkconfig.old
99
# Downloaded WASM3 source (fetched at configure time)
1010
firmware/esp32-csi-node/components/wasm3/wasm3-src/
11+
# ESP-IDF managed components (downloaded at build time)
12+
firmware/esp32-csi-node/managed_components/
13+
firmware/esp32-csi-node/dependencies.lock
14+
firmware/esp32-csi-node/sdkconfig.defaults.bak
15+
16+
# Claude Flow swarm runtime state
17+
.swarm/
18+
19+
# CSI recordings (local training data, machine-specific)
20+
rust-port/wifi-densepose-rs/data/recordings/
1121

1222
# NVS partition images and CSVs (contain WiFi credentials)
1323
nvs.bin

README.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,13 @@ docker run -p 3000:3000 ruvnet/wifi-densepose:latest
5757
|----------|-------------|
5858
| [User Guide](docs/user-guide.md) | Step-by-step guide: installation, first run, API usage, hardware setup, training |
5959
| [Build Guide](docs/build-guide.md) | Building from source (Rust and Python) |
60-
| [Architecture Decisions](docs/adr/README.md) | 44 ADRs — why each technical choice was made, organized by domain (hardware, signal processing, ML, platform, infrastructure) |
60+
| [Architecture Decisions](docs/adr/README.md) | 48 ADRs — why each technical choice was made, organized by domain (hardware, signal processing, ML, platform, infrastructure) |
6161
| [Domain Models](docs/ddd/README.md) | 7 DDD models (RuvSense, Signal Processing, Training Pipeline, Hardware Platform, Sensing Server, WiFi-Mat, CHCI) — bounded contexts, aggregates, domain events, and ubiquitous language |
6262

6363
---
6464

6565

66-
<img src="assets/screen.png" alt="WiFi DensePose — Live pose detection with setup guide" width="800">
66+
<img src="assets/v2-screen.png" alt="WiFi DensePose — Live pose detection with setup guide" width="800">
6767
<br>
6868
<em>Real-time pose skeleton from WiFi CSI signals — no cameras, no wearables</em>
6969

@@ -98,6 +98,7 @@ The system learns on its own and gets smarter over time — no hand-tuning, no l
9898
| 👁️ | **Cross-Viewpoint Fusion** | AI combines what each sensor sees from its own angle — fills in blind spots and depth ambiguity that no single viewpoint can resolve on its own ([ADR-031](docs/adr/ADR-031-ruview-sensing-first-rf-mode.md)) |
9999
| 🔮 | **Signal-Line Protocol** | A 6-stage processing pipeline transforms raw WiFi signals into structured body representations — from signal cleanup through graph-based spatial reasoning to final pose output ([ADR-033](docs/adr/ADR-033-crv-signal-line-sensing-integration.md)) |
100100
| 🔒 | **QUIC Mesh Security** | All sensor-to-sensor communication is encrypted end-to-end with tamper detection, replay protection, and seamless reconnection if a node moves or drops offline ([ADR-032](docs/adr/ADR-032-multistatic-mesh-security-hardening.md)) |
101+
| 🎯 | **Adaptive Classifier** | Records labeled CSI sessions, trains a 15-feature logistic regression model in pure Rust, and learns your room's unique signal characteristics — replaces hand-tuned thresholds with data-driven classification ([ADR-048](docs/adr/ADR-048-adaptive-csi-classifier.md)) |
101102

102103
### Performance & Deployment
103104

@@ -110,6 +111,8 @@ Fast enough for real-time use, small enough for edge devices, simple enough for
110111
| 🐳 | **One-Command Setup** | `docker pull ruvnet/wifi-densepose:latest` — live sensing in 30 seconds, no toolchain needed (amd64 + arm64 / Apple Silicon) |
111112
| 📡 | **Fully Local** | Runs completely on a $9 ESP32 — no internet connection, no cloud account, no recurring fees. Detects presence, vital signs, and falls on-device with instant response |
112113
| 📦 | **Portable Models** | Trained models package into a single `.rvf` file — runs on edge, cloud, or browser (WASM) |
114+
| 🔭 | **Observatory Visualization** | Cinematic Three.js dashboard with 5 holographic panels — subcarrier manifold, vital signs oracle, presence heatmap, phase constellation, convergence engine — all driven by live or demo CSI data ([ADR-047](docs/adr/ADR-047-psychohistory-observatory-visualization.md)) |
115+
| 📟 | **AMOLED Display** | ESP32-S3 boards with built-in AMOLED screens show real-time presence, vital signs, and room status directly on the sensor — no phone or PC needed ([ADR-045](docs/adr/ADR-045-amoled-display-support.md)) |
113116

114117
---
115118

assets/v2-screen.png

3.99 MB
Loading
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
# ADR-045: AMOLED Display Support for ESP32-S3 CSI Node
2+
3+
## Status
4+
5+
Proposed
6+
7+
## Context
8+
9+
The ESP32-S3 board (LilyGO T-Display-S3 AMOLED) has an integrated RM67162 QSPI AMOLED display (536x240) and 8MB octal PSRAM that were unused by the CSI firmware. Users want real-time on-device visualization of CSI statistics, vital signs, and system health without relying on an external server.
10+
11+
### Constraints
12+
13+
- Binary was 947 KB in a 1 MB partition — needed 8MB flash + custom partition table
14+
- SPIRAM was disabled in sdkconfig despite hardware having 8MB PSRAM
15+
- Core 1 is pinned to DSP (edge processing) — display must use Core 0
16+
- Existing CSI pipeline must not be affected
17+
18+
### Available APIs
19+
20+
Thread-safe edge APIs already exist (`edge_get_vitals()`, `edge_get_multi_person()`) — the display task only reads from these, no new synchronization needed.
21+
22+
## Decision
23+
24+
Add optional AMOLED display support with the following architecture:
25+
26+
### Hardware Abstraction Layer
27+
28+
- `display_hal.c/h`: RM67162 QSPI panel driver + CST816S capacitive touch via I2C
29+
- Auto-detect at boot: probe RM67162 and check SPIRAM; log warning and skip if absent
30+
31+
### UI Layer
32+
33+
- `display_ui.c/h`: LVGL 8.3 with 4 swipeable views via tileview widget
34+
- Dark theme (#0a0a0f) with cyan (#00d4ff) accent for three.js-like aesthetic
35+
- Views: Dashboard (CSI amplitude chart + stats), Vitals (breathing + HR line graphs), Presence (4x4 occupancy grid), System (CPU, heap, PSRAM, WiFi, uptime, FPS)
36+
37+
### Task Layer
38+
39+
- `display_task.c/h`: FreeRTOS task on Core 0, priority 1 (lowest)
40+
- LVGL pump loop at configurable FPS (default 30)
41+
- Double-buffered draw buffers allocated in SPIRAM
42+
43+
### Compile-Time Control
44+
45+
- `CONFIG_DISPLAY_ENABLE=y` (default): compiles display code, auto-detects hardware at boot
46+
- `CONFIG_DISPLAY_ENABLE=n`: zero-cost — no display code compiled
47+
- `CONFIG_SPIRAM_IGNORE_NOTFOUND=y`: boots fine on boards without PSRAM
48+
49+
### Flash Layout
50+
51+
8MB partition table (`partitions_display.csv`):
52+
- Dual OTA partitions: 2 x 2MB (supports larger binaries with LVGL)
53+
- SPIFFS: 1.9MB (for future font/asset storage)
54+
- NVS + otadata + phy: standard sizes
55+
56+
### Core/Task Layout
57+
58+
| Task | Core | Priority | Impact |
59+
|------|------|----------|--------|
60+
| WiFi/LwIP | 0 | 18-23 | unchanged |
61+
| OTA httpd | 0 | 5 | unchanged |
62+
| **display_task** | **0** | **1** | **NEW — lowest priority** |
63+
| edge_task (DSP) | 1 | 5 | unchanged |
64+
65+
### Dependencies
66+
67+
- LVGL ~8.3 (via ESP-IDF managed components)
68+
- espressif/esp_lcd_touch_cst816s ^1.0
69+
- espressif/esp_lcd_touch ^1.0
70+
71+
## Consequences
72+
73+
### Positive
74+
75+
- Real-time on-device stats without network dependency
76+
- Zero impact on CSI pipeline (display reads thread-safe APIs, runs at lowest priority)
77+
- Graceful degradation: works on boards without display or PSRAM
78+
- SPIRAM enabled for all boards (benefits WASM runtime too)
79+
- 8MB flash + dual OTA 2MB partitions give headroom for future features
80+
81+
### Negative
82+
83+
- Binary size increase (~200-300 KB with LVGL)
84+
- SPIRAM + 8MB flash config is specific to T-Display-S3 AMOLED boards
85+
- Boards with only 4MB flash need `CONFIG_DISPLAY_ENABLE=n` and the old partition table
86+
87+
### Risks
88+
89+
- RM67162 init sequence is board-specific; other AMOLED panels may need different commands
90+
- QSPI bus conflicts if other peripherals use SPI2_HOST (currently unused)
91+
92+
## New Files
93+
94+
| File | Purpose |
95+
|------|---------|
96+
| `main/display_hal.c/h` | RM67162 QSPI + CST816S touch HAL |
97+
| `main/display_ui.c/h` | LVGL 4-view UI |
98+
| `main/display_task.c/h` | FreeRTOS task, LVGL pump |
99+
| `main/lv_conf.h` | LVGL compile config |
100+
| `partitions_display.csv` | 8MB partition table |
101+
| `idf_component.yml` | Managed component deps |
102+
103+
## Modified Files
104+
105+
| File | Change |
106+
|------|--------|
107+
| `sdkconfig.defaults` | 8MB flash, SPIRAM, custom partitions |
108+
| `main/CMakeLists.txt` | Conditional display sources + deps |
109+
| `main/main.c` | +1 include, +5 lines guarded init |
110+
| `main/Kconfig.projbuild` | "AMOLED Display" menu |

0 commit comments

Comments
 (0)