# Per-Pattern Parameters - Frontend Documentation ## Overview Each pattern now has its **own unique set of parameters** (n1, n2, n3, n4, delay). When you switch patterns, the system automatically loads that pattern's saved parameters. This means: - Alternating can have n1=10, n2=10, delay=100 - Segmented Movement can have n1=5, n2=20, n3=10, n4=7, delay=50 - Each pattern remembers its own settings! --- ## How It Works ### Pattern Switching When you change patterns via `POST /api/pattern`: 1. Current pattern's parameters are **automatically saved** 2. New pattern's **saved parameters are loaded** 3. Parameters are sent to LED bars with the pattern ### Parameter Updates When you update parameters via `POST /api/parameters`: 1. Parameters update immediately 2. **Saved for the current pattern only** 3. Other patterns keep their own settings --- ## API Changes ### POST /api/pattern (Enhanced) **Before:** Only returned pattern name **Now:** Returns pattern name AND its parameters **Request:** ```json { "pattern": "alternating" } ``` **Response:** ```json { "status": "ok", "pattern": "alternating", "parameters": { "delay": 100, "n1": 10, "n2": 10, "n3": 1, "n4": 1 } } ``` **Important:** The parameters returned are the **loaded parameters for this pattern**, not global values. --- ### POST /api/parameters (Unchanged API, Enhanced Behavior) Parameters are now saved per-pattern automatically. **Request:** ```json { "n1": 20, "delay": 150 } ``` **Response:** ```json { "status": "ok", "parameters": { "brightness": 100, "delay": 150, "n1": 20, "n2": 10, "n3": 1, "n4": 1 } } ``` **What happens:** These parameters are saved for the **currently active pattern only**. --- ### GET /api/state (Enhanced) Now returns parameters for the current pattern. **Response:** ```json { "pattern": "segmented_movement", "parameters": { "brightness": 100, "delay": 50, "n1": 5, "n2": 20, "n3": 10, "n4": 7 }, "color_palette": {...}, "beat_index": 42 } ``` --- ## Usage Examples ### Example 1: Pattern-Specific Configuration ```javascript const api = 'http://10.42.0.1:8765'; // Configure alternating pattern await fetch(`${api}/api/pattern`, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({pattern: 'alternating'}) }); await fetch(`${api}/api/parameters`, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({n1: 10, n2: 10, delay: 100}) }); // Configure segmented_movement pattern await fetch(`${api}/api/pattern`, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({pattern: 'segmented_movement'}) }); await fetch(`${api}/api/parameters`, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({n1: 5, n2: 20, n3: 10, n4: 7, delay: 50}) }); // Switch back to alternating await fetch(`${api}/api/pattern`, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({pattern: 'alternating'}) }); // Parameters are now back to n1=10, n2=10, delay=100 automatically! ``` --- ### Example 2: UI Pattern Selector with Parameter Memory ```javascript class PatternController { constructor(apiBase = 'http://10.42.0.1:8765') { this.api = apiBase; } async setPattern(patternName) { const response = await fetch(`${this.api}/api/pattern`, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({pattern: patternName}) }); const result = await response.json(); // Update UI with the loaded parameters for this pattern this.updateParameterSliders(result.parameters); return result; } async updateParameter(paramName, value) { const response = await fetch(`${this.api}/api/parameters`, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({[paramName]: value}) }); return await response.json(); } updateParameterSliders(parameters) { // Update UI sliders with pattern's saved parameters document.getElementById('delay-slider').value = parameters.delay; document.getElementById('n1-slider').value = parameters.n1; document.getElementById('n2-slider').value = parameters.n2; document.getElementById('n3-slider').value = parameters.n3; document.getElementById('n4-slider').value = parameters.n4; } } // Usage const patterns = new PatternController(); // Switch to alternating - UI automatically shows its parameters await patterns.setPattern('alternating'); // Adjust parameters for alternating await patterns.updateParameter('n1', 15); // Switch to rainbow - UI automatically shows its parameters await patterns.setPattern('rainbow'); // Alternating's n1=15 is saved and will reload when you switch back! ``` --- ### Example 3: React Component ```jsx import { useState, useEffect } from 'react'; function PatternControl() { const [pattern, setPattern] = useState(''); const [parameters, setParameters] = useState({}); const API = 'http://10.42.0.1:8765'; // Load initial state useEffect(() => { fetch(`${API}/api/state`) .then(r => r.json()) .then(data => { setPattern(data.pattern); setParameters(data.parameters); }); }, []); // Change pattern - parameters auto-update const changePattern = async (newPattern) => { const response = await fetch(`${API}/api/pattern`, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({pattern: newPattern}) }); const result = await response.json(); setPattern(result.pattern); setParameters(result.parameters); // Auto-loaded for this pattern! }; // Update parameter - saves for current pattern const updateParam = async (param, value) => { await fetch(`${API}/api/parameters`, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({[param]: parseInt(value)}) }); setParameters({...parameters, [param]: parseInt(value)}); }; return (
Parameters are saved per-pattern. Switch patterns and come back - your settings are remembered!