DCC Layout Decoder v0.8.9

ROOT CAUSE FROM v0.8.0 TEST:
Serial showed:
  CONFIG SAVE ERROR: cannot open namespace
So the submitted module count was correct, but the Preferences/NVS save failed.

v0.8.9 CHANGE:
- Preferences/NVS is no longer used for decoder settings.
- All decoder configuration is stored as one binary block using ESP32 EEPROM emulation.
- EEPROM.begin(2048), EEPROM.put(), EEPROM.commit(), and immediate EEPROM.get() verification.
- Serial after Save should show:
    CONFIG SAVE OK (EEPROM): modules=2 verifyModules=2
- After power-cycle Serial should show:
    CONFIG LOAD OK (EEPROM): modules=2 ...

K83/K84 UI:
- No automatic row switching or automatic submit.
- Select Moment/Permanent normally.
- Press Save configuration.
- Page reloads after Save.
- K83 displays one DCC address; K84 displays two DCC addresses.

Because this uses a new storage backend, enter the test configuration once after upload.


v0.8.9 PDM FIX:
- Fixed all displayed version strings to v0.8.9.
- PDM is now clocked at a stable 2 kHz by esp_timer using TASK dispatch.
- 74HC595 transfer still uses hardware SPI.
- The renderer no longer depends on Arduino loop timing and does not run in a hardware ISR.
- Intended to remove visible dimming/fade flicker while preserving reliable DCC with 2-4 modules.


v0.8.9: OLED output count follows configured modules; output configuration page has browser print/PDF button.


v0.8.9: Corrected displayed version and protected DCC start address from accidental changes when saving other basic settings.


v0.8.9: Project configuration moved from EEPROM emulation to a dedicated Preferences namespace (dcc-layout). This prevents configuration collisions/corruption across reboot/power-cycle. First boot after update uses defaults; save the desired configuration once.


v0.8.9: PDM renderer moved out of the esp_timer callback. The 2 kHz timer now only notifies a low-priority FreeRTOS task on core 0, so WiFi can pre-empt light rendering while DCC remains responsive.


v0.8.9: Test page now uses asynchronous fetch requests. Output test buttons update locally without reloading the entire page; normal links remain as fallback.
