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>
54 lines
1.5 KiB
Markdown
54 lines
1.5 KiB
Markdown
# Splash animation tools
|
||
|
||
Two-step pipeline for getting third-party 20×20 pixel animations onto the device.
|
||
|
||
## 1. Scrape
|
||
|
||
```bash
|
||
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:
|
||
```json
|
||
{
|
||
"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
|
||
|
||
```bash
|
||
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.
|