Skip to content

pixfrog v1.3.0

Choose a tag to compare

@github-actions github-actions released this 01 Sep 18:46
· 252 commits to main since this release
0826d2d

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" build

PIXFROG_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 install before cloning).

Fixes

  • clock_hz is 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