Palettes and base effects¶
Saved custom palettes¶
The seven existing stock presets remain available; the eight saved custom slots are additional entries alongside them.
In the iOS app's Colours → Saved palettes, save the current colours under a name, choose a saved palette, swipe left for Rename/Delete, or use its update button to replace it from current colours. Full-swipe deletion is disabled; deletion confirms. The Control tab also lists saved palettes below the stock presets. Names are unique, 1–24 UTF-8 bytes (no control characters or leading/trailing spaces). Each of the eight slots stores 1–8 RGB colours and band layout on the ears in NVS; it survives reboot/OTA and is managed by the phone. Hue cycling remains an independent setting. Saving a copy leaves the active colours/preset untouched; select the saved row to use it. Removing a saved entry also leaves active RGB intact.
Restore default palettes asks for confirmation, clears saved custom slots and selects the stock purple/orange palette. It retains all non-palette settings, including brightness, calibration, overlays and hue cycling. Stock presets are immutable; editing them produces custom active colours. Native BLE edits confirm applied state and coalesce NVS writes after ten idle seconds as usual. Schema 9 defaults old records to empty slots while preserving their active colours; damaged library entries recover independently. Both firmware and app need an update for library controls (BLE capability bit 7).
Dynamic palettes¶
Enable Cycle palette hues in the app's Palette section. A full HSV hue rotation takes 60 seconds by default, adjustable from 5–300 seconds independently of animation speed. It works with every palette-driven animation, including static and sparkle; Rainbow generates its own hues. Cycling defaults off.
The main palette rotates as a group while retaining saturation and peak intensity; white/grey/black remain neutral and bands keep their layout. Saved RGB colours and preset IDs remain intact. Swatches/editors show those original colours. Background glow and gesture colours keep their colours; Enforcer remaps the shifted main frame as usual. Disabling cycling immediately restores the saved palette, and enabling it starts at its original hue. Changes to cycle duration/effect/palette preserve phase.
Settings schema 7 adds cycle and cycle_s inside the JSON palette object;
older settings default these from Kconfig (off / 60 seconds). BLE capability bit 6
advertises optional palette.cycle and palette.cycle_s properties. Rebuild firmware
and app to enable these controls; older firmware keeps them disabled.
Additional palette effects¶
The original overlay switches leave the selected animation/palette intact: enforcer, shake red, and nod green. All default off. Enforcer remaps the main animation, palette accents and background glow to yellow/white/black, preserving each pixel's peak intensity: saturated colours become yellow, greys stay neutral, and black stays black. Saved palette/background RGB values remain unchanged.
Gesture colours blend above main/background and palette accents, bypassing the enforcer remap. Motion overlays share a -100..100 point brightness offset, default +20: their cap is main brightness plus offset, clamped to 0..100% of the 100% ceiling. They may light with main at zero. Power off clears everything. All layers retain gamma, RGB trims, the current limiter and dithering. A recognised gesture attacks over 60 ms. Matching alternating continuation legs hold the colour through the detector cooldown, with 250 ms grace across reversals and a 250 ms release after the last continuation. Renewal preserves opacity; the most recent recognised gesture wins, with red winning simultaneous events. Off, diagnostics, flash and updates discard gesture state. Animation speed does not change these wall-time durations.
Use neutral + right-tilt calibration before gesture overlays. Detection projects bias-corrected gyro samples onto calibrated head axes at 100 Hz, requires a dominant axis, and publishes event counters to the renderer. Nod needs two alternating legs within 0.8 seconds; shake needs three within 1.2 seconds. A detected axis has an 0.8-second cooldown. Defaults are 45 degrees/second for shake, 35 for nod, and 6 degrees minimum swing per leg. Thresholds allow 10–180 degrees/second; swing allows 2–30 degrees. These are initial tuning values, not mounted-hardware results.
The JSON settings group is
"overlays":{"enforcer":false,"shake":false,"nod":false,"shake_threshold_dps":45,"nod_threshold_dps":35,"swing_deg":6}
in the NVS record; this is not a browser PUT payload.
Schema 6 adds these fields; older records retain their settings and use the local
overlay defaults. Kconfig supplies first-boot defaults. BLE changes coalesce their saves after ten idle seconds. No new effect IDs or palette
rewrites are involved. Mounted motion, accidental-trigger rate and gesture feel
still require hardware testing.
- Aurora (9): four softly enveloped colour clouds drift along the outline.
- Twinklefox (11): stable per-pixel clocks and gentle attack/decay; static flag stripes.
- Chase bands (12): moving palette bands with half-pixel edge blending.
- Motion twinkle (13, default): activity admits more twinkles and modestly shortens new cycles; existing fades finish without restarting. Settles over about 1–2 seconds.
- Liquid light (14): calibrated roll/pitch redistribute glowing fill with damped slosh.
- Inertia (15): calibrated left/right turns push soft-tailed comets; they coast after stopping.
- Stardust (16): activity adds independent blooming stars over quiet sparkle.
- Motion aurora (17): movement stirs/widens clouds; calibrated tilt biases their location.
Tilt (3), Motion pulse (4), and Colourwaves (10) are retired. IDs are never reused; button cycling and all control surfaces skip them. Schema 11 migrates stored selections 3→14, 4→13, 10→17, preserving other settings, and saves on the next settings change. Live writes to retired IDs are refused. Current phone/watch apps require protocol 2 and discover the supported catalogue; they do not retain a protocol-1 fallback.
All effects retain the existing palette/background controls, 16-bit colour pipeline, brightness/current limits and render ownership. Motion twinkle and Stardust need no mounting calibration. Liquid light/Inertia use idle appearances until calibrated; Motion aurora still responds to activity but needs calibration for directional bias. See motion effect behaviour and acceptance.
Twinklefox and running bands retain their MIT-licensed FastLED/WS2812FX origins. Aurora and the new motion renderers are native implementations; no runtime library is imported. Provenance and licences are in the effect notices.