Skip to content

Testing and Qualification

piggei edited this page Oct 3, 2026 · 7 revisions

Stable release qualification

0.9.4 final gate — PASS

Release 0.9.4, build 0.9.4, passed the final regression and hardware qualification gates.

Waveshare ESP32-S3-RGB-Matrix

  • cold boot and persistence reload: PASS;
  • one Alarm and a two-activity Schedule survived reboot: PASS;
  • persisted Alarm execution after reboot: PASS;
  • native 64x64, logical 16x16 -> 64x64 and 32x32 -> 64x64 scaling: PASS;
  • GIF PSRAM staging, persistent source cache and one-item prefetch: PASS;
  • cache invalidation/recovery under content changes: PASS;
  • Matrix Auto Rotation: PASS;
  • AudioReactive + standalone WLED Buzzer coexistence under combined load: PASS.

Qualified Waveshare media policy:

stage max      2 MiB
PSRAM reserve  4 MiB
source cache   1 MiB
entry max      512 KiB
metadata       12 entries
prefetch       one item, approximately 250 ms look-ahead

Adafruit MatrixPortal S3

The seven-GIF qualification corpus fits entirely inside the target-specific persistent cache. Staging, persistent reuse, one-item prefetch, mixed invalidation/eviction and PSRAM telemetry invariants all passed with zero playback fallback and zero prefetch failure in the qualification runs.

Qualified MatrixPortal media policy:

stage max      256 KiB
PSRAM reserve  1 MiB
source cache   384 KiB
entry max      256 KiB
metadata       8 entries
prefetch       one item, approximately 250 ms look-ahead

Automation regression coverage

The final release includes host regression/failure-injection coverage for:

  • Schedule quiet-period publication while a following Program multipart is active;
  • Alarm media + NVS transactional replacement;
  • Alarm rollback and safe empty-state convergence;
  • Alarm/Schedule clock-field validation;
  • Schedule staging before replacement flags are published.

0.9.3 optional Buzzer bridge gate

The 0.9.3 stable qualification validates iDotMatrix as a consumer of the standalone WLED Buzzer Usermod. Automated checks verify that the old IDotMatrixBuzzer backend, GPIO settings, LEDC/timer code and local Test endpoint are absent and that the optional weak-link bridge provided by WLED Buzzer Usermod 0.1.0 final is used instead.

Physical qualification used two firmware variants:

  1. with WLED Buzzer Usermod — verify Alarm loop/stop, Program notification, Countdown triple_beep, BLE connect, BLE disconnect, and the iDotMatrix Enable toggle;
  2. without WLED Buzzer Usermod — verify the Enable control is disabled and all non-sound iDotMatrix functions still operate normally.

0.9.2 remains the previous stable baseline. The listed integration tests, RC presentation checks and final hardware qualification have passed.

The project uses host regression, sanitizer checks, build-profile validation and physical hardware qualification.

Hardware validation reported PASS for both optional-dependency states, BLE connection/disconnection, natural Countdown, Alarm loop/stop, Program/Schedule, reboot/persistence, silent Alarm, no-sound Program and repeated-event smoke tests. Alarm was rechecked with WLED Buzzer Usermod 0.1.0 final and its 550 ms triple_beep inter-repeat silence.

Host regression suite

./run_host_tests.sh covers protocol framing/ACKs, BLE framing, FA02 assembly, Bulk/CRC, Graffiti multipart, renderer output, TEXT paging and 64-pixel payloads, audio mapping, alarms/programs, Preset/Carousel failure paths, GIF/media handling, WLED ownership, PlatformIO profile normalization, partition geometry and release-package consistency.

Critical components can also be run with AddressSanitizer/UndefinedBehaviorSanitizer through ./run_host_sanitizers.sh; component-level runs are used when the execution environment imposes a global timeout.

MatrixPortal / HUB75 qualification

Reference platform:

Adafruit MatrixPortal ESP32-S3
64x64 HUB75 panel
WLED 17.0.0-devV5
06ae26db67107cb3f6a3d107a92340035991a063

Validated areas include native 64x64 rendering, logical 16x16/32x32 scaling, 64-pixel TEXT and full 16654-byte payloads, multi-row static TEXT, GIF/image playback, Clock/timers/scoreboard, live TEXT ownership, audio effects, Alarm and Program/Schedule, Preset and Carousel, WLED ownership transitions, LittleFS coexistence and reset behavior.

For native 64x64 Clock styles 0 and 3, final 0.9.1 validation keeps HH:MM unchanged while moving only the date / and month two physical LEDs right.

Graffiti full-raster validation — 0.9.1

Evidence chain:

  1. Bluetooth capture from the official 64x64 app;
  2. standalone emulator B171 implementation;
  3. host regression reproducing exact 4096 + 4096 + 4096 packet flow and ACKs;
  4. physical MatrixPortal/HUB75 validation using several complex photographic images from the official app.

Result: hardware-validated on the qualified 64x64 target.

ESP32-C3 4 MB OTA qualification — 0.9.1

Controller : ESP32-C3 SuperMini, 4 MB
Display    : WS2812B ECO 16x16
WLED       : d55037f7510541eddc390c8f3d01afc5787aa44a
Framework  : Arduino 3.3.8 / ESP-IDF 5.5.4 shared-RMT
BLE        : NimBLE-Arduino 2.5.1
Profile    : overrides/esp32c3-16x16-audio-ota.ini
Environment: esp32c3dev_idotmatrix_audio_16x16_ota

Measured validated firmware:

firmware.bin                 1,551,008 bytes
OTA slot                     1,703,936 bytes
headroom                       152,928 bytes (~149 KiB)
LittleFS nominal                    640 KiB

Hardware stress result:

  • initial USB/serial install of the new partition table: PASS;
  • three consecutive WLED OTA updates: PASS;
  • 12 Carousel assets: PASS;
  • six Preset assets / playback: PASS;
  • three Schedule activities: PASS;
  • BLE + shared-RMT + AudioReactive + GIF cache: PASS;
  • return to native WLED effects: PASS;
  • persistent Carousel/Schedule filesystem content across OTA: PASS;
  • Preset playback before OTA and intentional Preset cleanup on OTA reboot: PASS.

Representative post-stress diagnostics: about 62,384 bytes free heap, 31,756-byte historical minimum and 49,152-byte largest free block. No progressive fragmentation, reboot or BLE/LED failure was observed in the reported test.

Result: hardware-validated for the stated board/display/WLED baseline.

Filesystem failure paths

Preset and Carousel host tests inject rename/write/manifest failures and verify rollback behavior. Preset remains deliberately volatile and is cleared at reboot.

Physical 32x32 status

A dedicated physical 32x32 panel remains pending. The logical 32x32 path has been exercised through the 64x64 hardware/scaler.

Community qualification

See Hardware Compatibility Report. Record exact WLED commit, iDotMatrix release/build, environment, hardware and PASS/FAIL/NOT TESTED results. Project status should be promoted only from reproducible evidence.

Historical 0.9.2 final qualification

The stable 0.9.2 package is promoted from the final development baseline after physical requalification of the runtime buzzer paths. The final package does not change runtime behavior beyond release/build identification.

Buzzer runtime validation

Hardware testing confirmed:

  • /json/info uses the qualified buzzerTiming=esp_timer-2ms service path;
  • Test buzzer emits one regular three-pulse trill;
  • BLE connection emits one clean short beep;
  • natural Countdown completion emits one regular three-pulse trill;
  • Alarm with sound enabled repeats with stable rhythm while media is visible;
  • Alarm configured silent remains silent;
  • Program/Schedule with sound enabled emits its finite notification groups with stable rhythm;
  • Alarm and Program/Schedule remain regular with larger GIF/image media;
  • Passive + Low returns to silent HIGH idle with no residual tone or heating.

The 90 ms ON, 70 ms gap and 550 ms inter-group pause constants are unchanged. The lateLast and lateMax diagnostics remain available for future regression analysis. buzzerTiming=wled-loop identifies the compatibility fallback and is not the qualified timing path.

Settings UI validation

The final Usermod settings page was physically validated with the intended layout and conditional behavior:

  • no horizontal rule directly below the iDotMatrix title;
  • Buzzer Pin follows the Buzzer heading without an empty line;
  • Buzzer Pin appears before Buzzer Type;
  • Active mode shows only Active buzzer active-high:;
  • Passive mode shows only Passive buzzer trigger:;
  • switching Buzzer Type updates the visible polarity option immediately in both directions;
  • Test buzzer appears exactly once;
  • the warning is on the next line and reads Save first: test uses saved settings.

Clock persistence

0.9.2 retains NVS persistence for Clock style, 12/24-hour mode, date visibility and RGB colour, restores those preferences before standalone Clock fallback, protects against transient app showDate=0 entry/style updates, and clears the stored presentation state on iDotMatrix device reset.

Clone this wiki locally