Files
MeshCore-Solo/tools
Jakub 5dd035d309 fix(screenshot): drop C-style cast UB, fix ERR check order
handleScreenshotRequest() reinterpret-cast every DisplayDriver* first to
SH1106Display* then to SSD1306Display*; both casts always produce a
non-null pointer, so the SSD1306 fallback was unreachable and on any
SSD1306 build we called SH1106::getBuffer() on a SSD1306 object — UB
that only happened to work because both backing classes share an
Adafruit_GFX layout at offset zero.

Replace the cast hack with virtual getBuffer()/getBufferSize() on
DisplayDriver, overridden in SH1106Display and SSD1306Display. MyMesh
no longer needs to know about either concrete type. const-correct the
buffer pointer and widen bufferSize to uint16_t while passing through.

Also fix the matching Python decoder: it sanity-checked length before
dispatching on resp_code, so a 2-byte RESP_CODE_ERR frame was reported
as "Frame too short" instead of the actual device error. Move the
length check after the resp_code dispatch and log the error code byte.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 22:58:26 +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