## Context Unifying the Raspberry Pi 3B (1GB RAM) into a dedicated projection mapping appliance. The system must be entirely headless, controllable via any browser-enabled device on the same network. ## Goals / Non-Goals **Goals:** - Provide a "one-liner" setup script that installs the entire stack. - Enable real-time remote manipulation of mapping surfaces via WebSockets. - Implement a robust system for media management and system monitoring. - Maintain a permanent WiFi AP while allowing connection to external networks (Hybrid Mode). **Non-Goals:** - **Audio Support**: Explicitly out of scope for the Pi 3B in this version. - **Pi 4/5 Support**: Target hardware is strictly Pi 3B for this design. - **Multi-Projector Sync**: Synchronizing multiple Pi units is not part of this version. ## Decisions ### 1. Real-Time Communication (WebSockets) We will use **Socket.io** for all vertex and surface updates. This bypasses the overhead of HTTP and allows the browser to feel like a direct remote for the `ofxPiMapper` engine. ### 2. Networking Architecture (Permanent AP) - **Primary**: The Pi acts as an Access Point (`MPVJ-AP`) on `wlan0`. - **Secondary**: A virtual interface or shared `wlan0` configuration will allow connecting to venue WiFi. - **Safety**: The AP never turns off, ensuring you can always reach the UI even if the venue WiFi fails. ### 3. Media Assignment & Validation The Node.js backend will maintain a JSON manifest of mapping surfaces and their assigned sources. - **Validation**: On upload, the backend will use `ffprobe` to verify the codec (H.264 required) and resolution (Warn if > 1080p). - **Resource Warning**: The UI will display a "High Load" warning if multiple 1080p videos are assigned, recommending 720p for stable multi-surface playback. ### 4. Graphics & Build Strategy (The "Source-First" Build) To handle the "Highlight Surface" functionality, we will modify the `ofxPiMapper` C++ source code to include a `/ofxPiMapper/surface/highlight` OSC listener. - **Build Safety**: The setup script will increase the swap file to 2GB during the ~1 hour compilation to prevent OOM panics on the Pi 3B. - **Binary Fallback**: The script will accept an optional argument to point to a pre-compiled binary if available. ### 5. Log & Data Streaming - **Log Throttling**: The backend will buffer and throttle the `stdout` stream (max 10 lines per 500ms) to prevent WebSocket congestion. - **State Persistence**: A explicit "Save Mapping" button in the UI will trigger the `/ofxPiMapper/save` OSC command to persist changes to the `settings.xml` file. ## Risks / Trade-offs - **[Risk] RAM Exhaustion** → **Mitigation**: Use Preact/Vite for a lightweight frontend, set `NODE_OPTIONS="--max-old-space-size=512"`, and force `npm jobs=1`. - **[Risk] WiFi Interference** → **Mitigation**: Prioritize the WebSocket channel for vertex movements. - **[Risk] ofxPiMapper Build Time** → **Mitigation**: Attempt to pull pre-compiled binaries first; if building from source, notify the user of the 1-hour duration.