Firmware simulator · grid.cpp + display.cpp + animations.cpp + webui.h ported to JS

TIME INVADERS, running in a tab

The word logic, transitions, attract shows and the mobile control UI below are ported line-for-line from the real ESP32 firmware — not a mockup. Both panels share one simulated frame buffer, exactly like the real board sharing LEDs between the engine and the web UI's live preview. Good for previewing wording and animations while the actual print finishes.

Simulator only --:--

The clock (shell B — subtle)

The web UI (real firmware page)

TIME INVADERS

…

Display

Theme

Animations

Big animations run on 5-minute changes; single minutes crossfade. Use the simulator's +1 min / +5 min buttons above to preview both without waiting.

Hidden arcade words

Ambient

Time

Time syncs from the internet automatically when WiFi is up. (here: resets the simulator to your computer's real clock)

Network — simulated, no real radio

Panel

Test: red = top-left, green = top-right, blue = bottom-left. Rotate/serpentine/mirror address physical LED wiring on real hardware — no visual effect on this logical simulation.
Auto-clamps to the safe budget whenever the programming port has a computer attached — its onboard diode isn't rated for full panel current and a laptop port can't source it anyway. Toggle "flashing cable plugged in" above to see the banner.

System

What's faithful, what's not

The word grid, per-minute phrasing, hidden-word positions, all six transition styles and all six attract shows are ported directly from grid.cpp/animations.cpp — same sprites, same timings, same randomisation. The engine tick mirrors display.cpp: single-minute changes crossfade, five-minute/hour boundaries run the configured transition, attract and hidden-word glints fire on their own timers, and a Pac-Man and ghost roam the whole face, slipping behind the lit words, between events.

What's necessarily simulated: Network, System and the panel-mapping controls have no real radio, flash chip or LED strip behind them, so those sections respond honestly but don't do anything — labelled inline rather than silently pretending. One deliberately-kept quirk: the real firmware's live-preview endpoint reads the raw LED buffer before the brightness scaler, so the phone's preview canvas here also ignores the brightness slider, exactly like the real one does.