feat(13e6): bring up Waveshare 13.3" Spectra-6 end-to-end

Adds a second panel target alongside the 7.3":
- src/panels/waveshare13e6/v1/ — full epd.h impl with hardware SPI on
  FSPI, dual-CS dispatch (CS_M/CS_S split halves), PSRAM framebuffer
  for image/QR/setup-screen render paths
- src/test_display_13e6.cpp + [env:test-display-13e6] — self-contained
  first-pixels color-bar smoke test, kept as a hardware diagnostic
- [env:waveshare13e6-v1] — production env: ESP32-S3-WROOM-2 N32R16V
  with OPI flash + OPI PSRAM (the WROOM-2 is octal flash; QIO mode
  crashes at do_core_init startup.c:328)
- scripts/gen_screens_13e6.py + data/waveshare13e6-v1/ — 1200x1600
  portrait setup screens with QR overlay regions matching the driver
- scripts/data_dir.py — extra_scripts shim that routes uploadfs to the
  right data/ tree based on $PIOENV (PlatformIO ignores per-env data_dir)
- src/epd.h: epd_setup_pins() abstraction so each panel driver owns its
  own pinMode + SPI.begin; main/test_display/sim_border lose all
  panel-specific GPIO and call epd_setup_pins() once at boot
- src/operation.h: report PANEL_ID via X-Panel-Id header on every poll
  so the server can auto-correct Device.model

7.3" production env stays byte-identical, all 43 native tests pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-13 15:53:51 -04:00
parent c1bed8c218
commit 569bec322f
19 changed files with 958 additions and 28 deletions
+33
View File
@@ -0,0 +1,33 @@
"""
Per-env data_dir multiplexer.
PlatformIO's [platformio].data_dir is a single project-level setting — it
ignores `data_dir` inside [env:...] blocks. With more than one panel in the
tree (waveshare73-v1, waveshare13e6-v1), we need to route uploadfs to the
right LittleFS payload based on the active env.
Wired into envs via:
extra_scripts = pre:scripts/data_dir.py
The script runs before SCons evaluates uploadfs and overrides
PROJECT_DATA_DIR for the envs in `ENV_TO_DATA`. Envs not listed fall
through to the project default (set in [platformio]).
"""
import os
Import("env") # noqa: F821 — provided by PlatformIO's SCons context
ENV_TO_DATA = {
"waveshare73-v1": "waveshare73-v1",
"test-display": "waveshare73-v1",
"sim-yellow": "waveshare73-v1",
"sim-red": "waveshare73-v1",
"waveshare13e6-v1": "waveshare13e6-v1",
}
pioenv = env["PIOENV"] # noqa: F821
if pioenv in ENV_TO_DATA:
data_dir = os.path.join(env["PROJECT_DIR"], "data", ENV_TO_DATA[pioenv]) # noqa: F821
env.Replace(PROJECT_DATA_DIR=data_dir) # noqa: F821
print(f"[data_dir] {pioenv} -> {data_dir}")