Releases: Lefix2/pixfrog
Release list
pixfrog v1.3.0
Read this before flashing
This build targets the pixfrog board — a Waveshare ESP32-P4 Module DEV-KIT with the pixfrog shield plugged onto its 2×20 header. The shield conditions the LED bus on the board being flashed and carries no firmware of its own; the pixfrog satellite is a passive repeater / power injector and runs no code either. One image covers the whole set.
The default display changed — check yours
This image drives the NV3007 428×142 bar panel, rotated 180° for the 1U rack. Every release up to and including v1.2.0 shipped the ST7789 320×240 driver instead.
If your unit has an ST7789 or an SSD1306 OLED, flashing this will leave the panel unusable — backlight on, nothing legible. Build from source with the matching overlay instead:
# ST7789V / ILI9341 320×240
idf.py -B build.st7789 -D SDKCONFIG=build.st7789/sdkconfig \
-D SDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.ci.st7789" build
# SSD1306 128×64 OLED
idf.py -B build.oled -D SDKCONFIG=build.oled/sdkconfig \
-D SDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.ci.oled" buildPIXFROG_NV3007_ROT180 is on by default because the rack mounts the panel upside down. Clear it in sdkconfig.defaults for a right-way-up mounting.
Your device has been misreporting its version
This is the first release whose firmware carries its real version. git describe was failing inside the release container, so CMake fell back to a static value and every published image announced itself as 0.1.0 — in the UI, the console and OTA. A device reporting 0.1.0 is actually running v1.2.0 or earlier. The release build now reads the version back out of the linked binary and refuses to publish on a mismatch.
Highlights
- NV3007 428×142 bar panel is the default display, with the 180° rotation the rack needs.
- No allocation on the render path. The PARLIO backend allocated its frame buffers per config change — a pixel-count preview detent freed and re-zeroed ~2.8 MB of PSRAM from
render_task, with the bus stopped throughout. Buffers are now allocated once at the cap; only the TX unit, a few KB of DMA descriptors, still tracks the frame length. Display > Refresh px— drives every pixel through red/green/blue/white for 5–300 s, to exercise sub-pixels and clear a row the incremental flush left stale. Any input aborts.- 1U rack mechanics published under
hardware/pixfrog_rack/(Fusion 360, tracked with Git LFS —git lfs installbefore cloning).
Fixes
clock_hzis clamped to a floor the frame cap can hold. The console and web API accepted 100 kHz; on APA102 at 1024 px that inflates the frame past the buffer cap, the backend refuses every frame and the channel goes dark. Floor is now 500 kHz, pinned to the cap by a test.- Released firmware reports its real version (above).
- The LED output path was verified end to end on a logic analyzer for this release — ArtNet in, GPIO out, decoded back to pixel bytes — after a first attempt at the buffer rework (#74) silently killed all output and was reverted (#75). The harness is in
tools/hw_validate/(nrz_decode.py,artnet_stream.py), because firmware counters cannot see this class of failure: PARLIO loop mode raises no completion event, so submits, FPS and underruns all read healthy with the bus silent.
What's Changed
- feat(web): aggregated multi-pixfrog web UI by @Lefix2 in #65
- feat(ui): menu overhaul — declarative engine, reorg, wheel picker, back arrows by @Lefix2 in #66
- feat(ui): NV3007 bar panel — hardware bring-up, page-unlock fix, screen-change repaint by @Lefix2 in #68
- fix: universe-number bounds checks, cross-origin write gate, and audit hygiene by @Lefix2 in #67
- feat(ui): TFT backlight dimming (PWM level, idle attenuation, dim delay) by @Lefix2 in #69
- fix(net): gate the network status on the PHY link, not the config by @Lefix2 in #70
- feat(site): restyle the Pages site on the "régie" design by @Lefix2 in #71
- feat(site): centre the nav, full-height first sections, snap scroll by @Lefix2 in #72
- feat(ui): make the NV3007 bar panel the default display by @Lefix2 in #73
- perf(led_output): stop reallocating the PARLIO frame buffers on the render path by @Lefix2 in #74
- Revert "perf(led_output): stop reallocating the PARLIO frame buffers on the render path" by @Lefix2 in #75
- feat(ui): on-demand RGBW pixel refresh, drop the repaint-on-screen-change by @Lefix2 in #76
- perf(led_output): allocate the PARLIO frame buffers once, at the cap by @Lefix2 in #77
- fix(config): clamp clock_hz to a floor the frame cap can actually hold by @Lefix2 in #78
- ci: rename the default build variant back to nv3007 by @Lefix2 in #79
- feat(hardware): 1U rack mechanics, doc refresh, site cleanup by @Lefix2 in #80
- fix(ci): make the released firmware carry its real version by @Lefix2 in #81
Full Changelog: v1.2.0...v1.3.0
pixfrog v1.2.0
Highlights since v1.1.0
Performance
- Diverse-protocol encode rework — segment-model NRZ sweep + merged clocked-SPI sweep. The worst-case mixed 8-channel rig (4 NRZ + 4 clocked) went from ~40 to ~56 fps; NRZ-only diverse configs hit 60.
LED / DMX
- Clocked-SPI clock-rate picker (1 / 2 / 4 / 8 MHz) in the web UI and the on-screen menu.
- Pixel-count is bounded to the budget — capped/truncated to what the bus can clock out within the refresh period (and the DMA buffer), enforced in the UI, web, console and at boot (e.g. WS2815 = 512 px @60 Hz, 1024 @30 Hz).
- Colour orders filtered by strip family (no bare RGB order on an RGBW strip); the redundant RGBWW order was removed.
Web UI
- New Diagnostics tab — "stats for nerds" (render timings, memory incl. PSRAM, counters, per-channel capacity) plus a device log viewer (
/api/logs, level control, download). Logs are captured from boot.
On-screen menu UX
- Edit screens reworked: value gauges with the original value marked, a focus dropdown picker for value selection, the native 18×24 XL font for big values (no more pixelation), short-press = apply / long-press = cancel, control-hint footers, and a SAVE & FINISH marker in the string editor.
Docs
- Architecture/protocol docs aligned with the implementation (triple-buffered frame buffers, enforced pixel caps).
pixfrog v1.1.0
What's Changed
- docs(pages): refresh GitHub Pages site for v1.0 by @Lefix2 in #43
- ci(pages): decouple site deploy from firmware releases by @Lefix2 in #44
- docs: dedicated flash page, architecture refresh, drop env-specific notes by @Lefix2 in #45
- docs(architecture): refresh diagrams + add fseq/fpp to module map by @Lefix2 in #46
- ci: skip code builds on doc-only branches by @Lefix2 in #47
- docs(hardware,protocols): sync with PARLIO default backend + DEV-KIT pinout by @Lefix2 in #48
- docs(hardware): trim I2C OLED to a minimal note, drop Q1-Q3 reflections, and fix the level-shifter schematic by @Lefix2 in #49
- about: update link to collecti-frog.fr (drop site. subdomain) by @Lefix2 in #50
- fix(pages): deploy FR pages, about-en and lang.js to GitHub Pages by @Lefix2 in #51
- Art-Net universe addressing: 0-based + absolute routing + auto-patch, web UI redesign, fps ceiling by @Lefix2 in #52
Full Changelog: v1.0.0...v1.1.0
v1.0.0
What's Changed
- Add DMX512 output support as fourth encoder family by @Lefix2 in #11
- feat(ui): TFT ST7789 backend — landscape 320×240, canvas API, animated splash by @Lefix2 in #12
- feat(ui): restyle TFT UI, add per-channel Off, sharpen font by @Lefix2 in #13
- fix(ui): OLED cold-boot, reboot loop & encoder polling; add NeoPixel feedback by @Lefix2 in #14
- perf: render pipeline at 60 FPS — single-pass frame encoder, right-sized DMA frames, -O2 by @Lefix2 in #15
- feat(ui): crisp 5×7 OLED font + static OLED splash by @Lefix2 in #16
- feat: devcontainer (CI parity), local CI gate, UART control console by @Lefix2 in #17
- LED output: fix silent LCD_CAM emission, multi-line frames, PARLIO TX backend by @Lefix2 in #18
- tools: artnet_validate.py — end-to-end ArtNet reception test by @Lefix2 in #19
- feat(web-config): optional HTTP config UI (SPA + REST API) by @Lefix2 in #20
- feat(ui): version display, long-press, rotation acceleration, pixel-count preview by @Lefix2 in #21
- fix(power): program LDO VO4 to 3.3V — VDD_IO_5 pads (GPIO39-48) were at 1.2V by @Lefix2 in #22
- docs: TODO.md — product roadmap incl. unhandled ArtNet opcodes by @Lefix2 in #23
- feat(net): sACN (E1.31) receiver + ArtAddress/ArtIpProg/ArtNzs handling by @Lefix2 in #24
- chore: tech debt — emulator in CI, encoder INT_N path removed by @Lefix2 in #25
- feat(ota): firmware update over the web UI — A/B partitions + rollback by @Lefix2 in #26
- feat(web): HTTP Basic auth on mutating endpoints — off by default by @Lefix2 in #27
- feat(web): land HTTP Basic auth (PR #27 was merged into an already-merged base) by @Lefix2 in #28
- feat(failsafe): per-channel signal-loss failsafe — hold/blackout/soli… by @Lefix2 in #31
- docs(hardware): import the pixfrog shield KiCad project + production files by @Lefix2 in #30
- feat(scenes): standalone parametric scenes — solid/chase/rainbow by @Lefix2 in #32
- feat: config backup/restore, channel identify, per-channel gamma + white balance by @Lefix2 in #33
- feat: 2-source merge (HTP/LTP) for ArtNet + sACN by @Lefix2 in #34
- feat: FSEQ v2 player from microSD (SDMMC GPIO39-44, zstd, FAT) by @Lefix2 in #35
- chore: rename lcd_cam_output → led_output; document vendored zstd by @Lefix2 in #36
- feat(web-ops): live /api/status, flash coredump, mDNS pixfrog.local by @Lefix2 in #39
- feat(ui): crisper native 12x16 TFT font + redesigned HOME dashboard by @Lefix2 in #40
- feat: web-ops + fseq-net + hw-validate stack → main by @Lefix2 in #41
- docs(README): catch up with the v1.0 feature set by @Lefix2 in #42
Full Changelog: v0.1.4...v1.0.0