Files
clawdmeter/tools
Hermann Björgvin HaraldssonandClaude Opus 4.7 97a5443601 Migrate to Waveshare ESP32-S3-Touch-AMOLED-2.16 with auto-rotation, splash, and battery
Full hardware swap from Panlee SC01 Plus (480×320 IPS) to Waveshare 2.16"
square AMOLED (480×480, CO5300 + CST9220 + AXP2101 + QMI8658). Library
stack moves to Arduino_GFX, SensorLib, XPowersLib on the pioarduino
platform 55.03.38-1 (Arduino Core 3.x).

UI:
- 4 screens (splash, usage, controller, bluetooth) with 3-button physical
  navigation: GPIO 0 = prev, AXP PKEY = cycle, GPIO 18 = next.
- IMU-driven 90° auto-rotation. CO5300 can't rotate via MADCTL, so flush
  callback does CPU strip-rotation in PARTIAL render mode. Rotation
  transitions use AMOLED brightness flash (instant black → redraw → ramp).
- Battery indicator (Lucide icons) in upper-right, RGB565A8 alpha so it
  blends over the splash animations.
- USB plugged/unplugged auto-switches between Usage and Controller
  screens (suppressed while on splash).
- Fonts and icons re-scaled ~1.9× for the higher-DPI panel; 20px margins
  to clear rounded corners.

Splash:
- 13 × 20×20 pixel-art creature animations sourced from
  claudepix.vercel.app via tools/scrape_claudepix.js (scraper handles
  both PRESET creature-engine and standalone FRAMES+PAL formats).
  tools/convert_to_c.js emits firmware/src/splash_animations.h.
  Attribution preserved in README and the generated header.

Tooling:
- tools/png_to_lvgl.js converts alpha PNGs to LVGL RGB565A8 (planar
  layout, with --tint to colorize Lucide black-on-transparent sources).
- tools/scrape_claudepix.js, tools/convert_to_c.js for the splash
  pipeline.

Docs:
- New worktree CLAUDE.md with hardware pin map, file inventory, build
  commands, and the 8 critical gotchas (CO5300 rotation, OPI PSRAM,
  pioarduino requirement, LVGL 9 font patching, centralized touch read,
  even-aligned flush regions, touch swap/mirror values, RGB565A8 layout).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-09 22:04:04 +00:00
..

Splash animation tools

Two-step pipeline for getting third-party 20×20 pixel animations onto the device.

1. Scrape

node scrape_claudepix.js

Fetches the manifest from claudepix.vercel.app/app.js, then each animation's HTML file, evaluates the embedded JS in a Node VM context (loading the same creature-engine.js the site uses), and writes resolved frame data to tools/claudepix_data/*.json.

Each output file looks like:

{
  "filename": "idle_breathe.html",
  "name": "idle breathe",
  "category": "Idle",
  "description": "...",
  "frame_count": 17,
  "frames": [{ "hold": 500, "grid": [[0,0,...],[0,1,1,...],...] }, ...]
}

Override URL or output dir with --base and --out.

2. Convert to C

node convert_to_c.js

Reads tools/claudepix_data/*.json and emits a single firmware/src/splash_animations.h with:

  • splash_<ident>_frames[N][400] — per-frame cell codes (0 = empty, 1 = body, 2 = eye)
  • splash_<ident>_holds[N] — per-frame hold time in ms
  • splash_anims[] — master table with name, category, frame count, pointers
  • SPLASH_ANIM_COUNT

The firmware (splash.cpp) consumes this header to render and animate.

Re-running

The scraper is idempotent — re-run any time the source library updates. The converter overwrites the header. Rebuild firmware after running both.

License note

The scraper hits a public site without a stated license. Confirm reuse is appropriate for your case before redistributing the output.