Files
MeshCore-Solo/tools
Jakub 1332358ee7 fix(screenshot): use GxEPD2 visible dimensions; fix phys_x formula
Firmware: add screenshotWidth()/screenshotHeight() virtual pair to
DisplayDriver (default: width()/height()).  GxEPDDisplay overrides to
return display.width()/display.height() — the GxEPD2-reported values
that use WIDTH_VISIBLE (e.g. 122 for GxEPD2_213_B74), not the full
physical WIDTH stored in DisplayDriver (128).  MyMesh uses these
instead of display->width()/height() for the screenshot header bytes.

Result for GxEPD2_213_B74 + DISPLAY_ROTATION=1:
  header was 250×128 → now 250×122  (correct visible canvas)

Python decoder (tools/screenshot.py):
- Remove hardcoded EINK_PHYS_WIDTH=128 / EINK_VISIBLE_W=122 constants.
- Derive phys_stride from buffer_size / log_width (works for any panel).
- Fix phys_x formula: was (EINK_PHYS_WIDTH-1-ly = 127-ly),
  now (vis_w-1-ly = log_height-1-ly = 121-ly for 213_B74).
  Old formula addressed invisible columns 122-127; new formula correctly
  maps logical rows 0..121 to visible physical columns 121..0.
- vis_w = log_height (no hardcoded trim; header now carries correct value).

This also works for square panels (e.g. 128×128 where WIDTH=WIDTH_VISIBLE):
  header will carry 128×128, decoder produces a correct 128×128 image.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-28 01:19:22 +02:00
..

Display Screenshot Tool

⚠️ Note: The screenshot feature requires the ENABLE_SCREENSHOT build flag to be enabled. Add -D ENABLE_SCREENSHOT to your PlatformIO build flags, then recompile and flash the firmware.

The firmware supports capturing the current display contents and transmitting it over USB serial. This is useful for debugging, remote monitoring, or creating documentation.

Important: When the device is connected to the companion app, the USB serial port is not available for communication. To use the screenshot tool, ensure the device is not connected to the companion app.

Usage:

  1. Build and flash firmware with -D ENABLE_SCREENSHOT build flag enabled

Example for the OLED dual firmware:

PLATFORMIO_BUILD_FLAGS="-D ENABLE_SCREENSHOT" pio run -e WioTrackerL1_companion_dual -t upload
  1. Connect the device to your computer via USB (ensure no companion app connection)

  2. Install dependencies and run the screenshot tool. To manage python and python dependencies, use uv: https://docs.astral.sh/uv/

    cd tools
    uv run tools/screenshot.py
    

    Options:

    • --port PORT — Serial port to use (default: auto-detect)
    • --scale SCALE — Upscale factor for the output image (1=no upscale, 2=2x, 3=3x, 4=4x, etc.; default: 1)
  3. In the tool's interactive menu, press S to capture a screenshot

  4. The tool will save the screenshot as a PNG file in tools/pngs/ with a timestamp-based filename

How it works:

  • The tool sends the CMD_GET_SCREENSHOT command (66) to the device
  • The device responds with RESP_CODE_SCREENSHOT (29) containing the framebuffer data
  • The framebuffer is transmitted in chunks (128×64 display = 1024 bytes, split across multiple frames)
  • The tool reassembles the chunks and converts them to a PNG image