Commit Graph
56 Commits
Author SHA1 Message Date
Hermann Björgvin 7df64eecec Merge pull request #51 from soapiece/fix/macos-daemon-retrieve-connected 2026-05-31 12:18:07 +00:00
Hermann Björgvin 6b5314ef28 Fix formatting and improve hardware section clarity 2026-05-24 20:35:06 +00:00
Hermann Björgvin c2715e7cc4 Update README with alternative board support details
Clarified compatibility with alternative boards and added guidance for pull requests.
2026-05-24 20:34:08 +00:00
Hermann Björgvin a07cab1359 Added ESP32-C6 2.16inch AMOLED to README.md 2026-05-24 20:32:13 +00:00
Hermann Björgvin de7ac5ec36 Merge pull request #37 from HermannBjorgvin/revert-29-oauth-usage-endpoint
Revert "switch daemon to `/api/oauth/usage` endpoint"
2026-05-24 20:04:18 +00:00
Hermann Björgvin 912061f1ac Merge pull request #29 from BrianPugh/oauth-usage-endpoint
switch daemon to `/api/oauth/usage` endpoint
2026-05-24 19:30:03 +00:00
Hermann Björgvin efc5641840 Merge pull request #36 from AlexanderYW/add-waveshare-amoled-216-c6-board
feat(boards): Add Waveshare ESP32-C6-Touch-AMOLED-2.16 support
2026-05-24 18:54:25 +00:00
Hermann Björgvin b75dda8a85 Merge pull request #28 from BrianPugh/macos-keychain
macos uses keychain; remove stale comments
2026-05-24 18:50:19 +00:00
Hermann Björgvin f7272ac7cf Merge pull request #30 from BrianPugh/fix-flash-all-environments
Bugfix: specify board target
2026-05-24 18:48:01 +00:00
Hermann Björgvin c25e89672a Merge pull request #27 from orbisai0security/fix-ble-rx-buf-bounds-check
fix: add buffer-length check in ble.cpp
2026-05-21 19:52:00 +00:00
Hermann Björgvin 09b5ba8c72 Updated affiliate link 2026-05-21 09:47:01 +00:00
Hermann Björgvin 7ae95a83ab Merge pull request #25 from tobby168/upstream-refactor
Add AMOLED-1.8 board + device-abstraction refactor for community ports
2026-05-21 01:55:22 +00:00
Hermann Björgvin 57e5d73c6e Merge pull request #24 from tobby168/feature/auto-sleep
Auto-sleep screen after 30 min idle
2026-05-20 17:36:20 +00:00
Hermann Björgvin 9ff81966fb Merge pull request #21 from georgetasioulis/fix-ble-state-on-reconnect 2026-05-18 18:33:10 +00:00
Hermann Björgvin baed1d722b Merge pull request #18 from tobby168/macos-ble-compat 2026-05-18 00:46:19 +00:00
Hermann Björgvin 2774ae846e Merge pull request #6 from HermannBjorgvin/macos-support
Add macOS host support
2026-05-14 18:40:43 +00:00
512039e740 Add macOS host support
Cherry-picks the macOS-specific pieces from PR #5: Python daemon using
bleak (CoreBluetooth backend), LaunchAgent template, flash-mac.sh, and
install-mac.sh. Token is read from the macOS Keychain ("Claude
Code-credentials" service); Linux behavior is unchanged. README split
into "macOS installation" and "Linux installation" sections with
parallel Flash / Pair / Install subsections.

Co-Authored-By: Chris Davidson <36679917+lorddavidson@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 18:39:13 +00:00
Hermann Björgvin 9aa6954d42 Merge pull request #4 from BlockedPath/main 2026-05-14 15:50:52 +00:00
Hermann Björgvin 40d7af93d8 Update README to reflect changes in demo and animations
Removed demo section and added attribution for Clawd animations.
2026-05-12 01:53:20 +00:00
Hermann Björgvin 4c9363440a Update README.md 2026-05-12 01:51:53 +00:00
Hermann Björgvin HaraldssonandClaude Opus 4.7 bd2afb544f Swap demo video link for inline GIF in README
GitHub's clickable-thumbnail trick worked but was awkward; a 500x500
12fps GIF renders inline everywhere. Drop the now-unused thumbnail.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 17:05:36 +00:00
Hermann Björgvin HaraldssonandClaude Opus 4.7 7281fb3c2f Use clickable thumbnail for demo video in README
GitHub strips relative src on <video> tags, so swap to an image link
pointing at the raw mp4. Extracted a frame for the thumbnail so the
two demo cells aren't visually identical.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 17:02:12 +00:00
Hermann Björgvin HaraldssonandClaude Opus 4.7 11dfa3e4b9 Add Demo section to README with photo and video
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 16:57:49 +00:00
Hermann Björgvin Haraldsson 7736ef1bab Capitalize Clawdmeter and extend tagline 2026-05-11 03:29:34 +00:00
Hermann Björgvin Haraldsson 48783bfb4b Drop open/public from library references in README 2026-05-11 03:10:50 +00:00
Hermann Björgvin Haraldsson 4e56ba4749 Rename to clawdmeter, link claudepix from splash section 2026-05-11 03:09:41 +00:00
Hermann Björgvin Haraldsson 2f40906816 Humanize README prose across remaining sections 2026-05-11 02:56:09 +00:00
Hermann Björgvin Haraldsson 1635729486 Humanize README intro paragraph 2026-05-11 02:51:29 +00:00
Hermann Björgvin Haraldsson 1a8c4038aa Rename creatures to Clawd in README and drop middle name 2026-05-11 02:44:36 +00:00
Hermann Björgvin Haraldsson b48a11c62f Correct Clawd attribution: singular animation, x.com link, mascot wording 2026-05-11 02:43:01 +00:00
Hermann Björgvin Haraldsson 3aa857f3c4 Capture Usage screenshot with live session/weekly data 2026-05-11 02:37:58 +00:00
Hermann Björgvin Haraldsson 62b226b793 Move Screens section above Features in README 2026-05-11 02:36:41 +00:00
Hermann Björgvin Haraldsson f92e1bba3e Remove stale demo.gif from previous Panlee panel 2026-05-11 02:35:43 +00:00
Hermann Björgvin Haraldsson 4b32236f67 Refresh README screenshots and prune controller-era references
Replace the 480x320 Panlee-era usage/bluetooth/controller PNGs with
fresh 480x480 captures of the current UI (Usage, Bluetooth, Splash).
Drop the Controller screen column entirely — that screen was removed
when buttons took over its shortcuts.

README cleanup: daemon poll cadence corrected to 60s, splash mood-
group + auto-rotation behaviour documented, "tap the logo to cycle"
replaced with the actual middle-button gesture, Lucide section
rewritten to point at tools/png_to_lvgl.js instead of the dead inline
Python+inkscape recipe, and intro line drops "touch controller" since
touch only toggles splash now. demo.gif flagged as stale (recapture is
a hardware task).
2026-05-11 02:33:29 +00:00
Hermann Björgvin Haraldsson 68a99cfb87 Extract make_usage_panel helper for Session/Weekly
The two panels in init_usage_screen() differed only in y-offset, pill
text, and which globals received the children — same widget tree, same
sizes, same positions. Fold into make_usage_panel() so the layout intent
shows up in two call sites instead of being duplicated by hand.

Verified by pixel-diff: pre- and post-refactor screenshots of the Usage
screen are byte-identical.
2026-05-11 02:26:18 +00:00
Hermann Björgvin Haraldsson c2f669e39f Move rotation-detect + brightness-ramp into one helper
The detect-rotation/blank/redraw block and the brightness step-up block
were two stateful chunks in loop() glued by a brightness_ramp global.
Fold them into handle_rotation_change() with local static state — the
'on rotation change, flash to black then ramp back' invariant lives in
one place and the loop body shrinks.
2026-05-11 02:22:33 +00:00
Hermann Björgvin Haraldsson d8592f7a03 Gate touch_read on ISR flag instead of double-polling
touch_read() had two branches that both called getPoint() unconditionally
— the touch_data_ready flag served no purpose. Gate the I2C transaction
on the flag so the ISR finally pulls its weight: idle loops no longer
hit I2C, getPoint() runs only when the CST9220 actually raised the
TP_INT line.

Also scope touch_pressed/x/y to file-static (no cross-TU users) and
drop the stale 'permanent while we work on it' comment by the default
boot screen — splash-on-boot is documented in CLAUDE.md.
2026-05-11 02:21:20 +00:00
Hermann Björgvin Haraldsson f1feacb3dc Remove dead functions and unused Montserrat font flags
Six public API functions had no callers anywhere in the firmware:
splash_prev, splash_set_active, splash_current_name, splash_count,
ble_is_connected, imu_set_rotation, power_is_usb_connected,
power_usb_changed. Trimming them lets power.cpp drop the VBUS state
machine (cached_usb, usb_changed_flag, last_vbus_ms,
enableVbusVoltageMeasure). usage_rate_reset becomes file-static since
the only caller is in usage_rate.cpp itself. Montserrat font flags in
platformio.ini were enabled but never referenced.
2026-05-11 02:19:45 +00:00
Hermann Björgvin Haraldsson 7ed4710d28 Drive splash animations by session usage rate
Group splash animations into four moods (idle/normal/active/heavy) and pick
which group plays based on a 5-min sliding rate of session_pct. Thresholds
sit at 0.10/0.20/0.33 %/min so Heavy fires when usage matches or beats the
5-hour session reset pace. Splash auto-rotates within the current group
every 20s; group recomputes on every BLE poll and the splash re-picks
immediately if it changes mid-display. 4-min minimum window prevents
single-sample bumps after boot from falsely landing in Heavy.
2026-05-11 02:05:38 +00:00
Hermann Björgvin Haraldsson 12172d12bf Hide battery indicator on splash screen unconditionally 2026-05-11 01:06:37 +00:00
Hermann Björgvin Haraldsson b61936b42c Centralize colors in theme.h and propagate true-black background
- Extract design tokens to firmware/src/theme.h (THEME_BG, THEME_PANEL,
  THEME_TEXT, etc.); ui.cpp aliases COL_* to the THEME_* tokens
- Splash container + canvas COL_EMPTY now use THEME_BG / 0x0000 instead
  of the hardcoded 0x0f0f0f / 0x10A2 dark grey
- tools/convert_to_c.js maps "transparent" palette entries to 0x0000
  (true black) so regenerated splash_animations.h matches the new bg
- Re-regenerate splash_animations.h
- Convert logo to RGB565A8 (alpha plane) so it composites against any
  background — no more grey halo around the upper-left logo on screens
  where the bg differs from the previous baked-in 0x18E3 color
2026-05-11 01:04:11 +00:00
Hermann Björgvin Haraldsson b34d99def8 Use true black (#000) for screen background
AMOLED pixels turn fully off, saving power and deepening contrast
against COL_PANEL (0x1f1f1e).
2026-05-11 00:54:04 +00:00
Hermann Björgvin Haraldsson 7fc8ed721a Remove Controller screen, global button shortcuts, touch-toggled splash
UX overhaul:
- Drop the Controller screen entirely (touch zones, swipe gestures, HID
  gesture engine, four icon arrays, hand icon)
- Two persistent screens (Usage, Bluetooth) cycled by the middle PWR
  button; splash becomes a touch-toggled welcome animation
- Left button (GPIO 0): hold to send Space (Claude Code voice-mode PTT)
- Right button (GPIO 18): press to send Shift+Tab (mode toggle)
- Middle button on splash cycles animations instead of screens
- Remove USB plug/unplug auto-switch (Controller was the unplug target)
- Hide battery indicator on splash when in LOW state — it's noisy over
  the pixel-art animations

Implementation:
- Delete firmware/src/hid.{cpp,h} and touch.{cpp,h}; their roles fold
  into main.cpp button handlers and LVGL CLICKED events respectively
- splash_get_root() exposes the splash container so ui.cpp can attach
  a click handler for the dismiss-on-tap behavior
- Tap detection uses LVGL's built-in LV_EVENT_CLICKED with event
  bubbling on the inner panels — debouncing is handled by LVGL
- On Bluetooth screen, only the Reset Bluetooth zone is clickable;
  taps elsewhere are no-ops (no conflict with splash toggle)

Docs:
- README: drop Controller from screens table, rewrite Physical buttons
  table, remove Gesture controls section
- CLAUDE.md: update file map, button assignments, drop gesture refs
2026-05-11 00:51:07 +00:00
Hermann Björgvin Haraldsson 90eaeec35b Add credits section to README 2026-05-11 00:17:54 +00:00
Hermann Björgvin Haraldsson 68a31b189b Add @amaanbuilds animation attribution to Bluetooth screen 2026-05-11 00:16:56 +00:00
Hermann Björgvin Haraldsson 36db239569 Stack gesture and action on separate lines with color hierarchy
Each gesture hint now wraps its gesture in white (COL_TEXT) and the
action in dim gray (COL_DIM), stacked vertically. Replaces the prior
single-line "Gesture: action" format that wrapped at arbitrary points.
2026-05-10 01:58:58 +00:00
Hermann Björgvin Haraldsson 0625d99617 Simplify Controller info row and wrap gesture hints
- Drop "of current session" trailing text from the percentage label so
  it no longer overlaps the right-aligned reset countdown
- Shrink hint font from styrene_24 to styrene_20 and enable WRAP mode
  with center alignment so each hint fits the narrow center zone
2026-05-10 01:52:03 +00:00
Hermann Björgvin Haraldsson b4e557c681 Add @hermannbjorgvin attribution to Bluetooth screen 2026-05-10 01:33:00 +00:00
Hermann Björgvin Haraldsson b0fc2b8233 Center page titles and refine Bluetooth screen layout
- Shift all three titles by +16 from screen mid so they center between
  the logo (right edge ~100) and battery icon (left edge ~412)
- Bluetooth screen: increase Reset zone height 70 -> 110 for breathing
  room around the trash icon + label
- Bluetooth screen: drop the "Bluetooth Low Energy" footer
2026-05-10 00:53:26 +00:00
Hermann Björgvin Haraldsson 8b5878724f Refine Usage screen typography and match Claude Code spinner easing
- Drop "Claude" prefix from titles, center all three
- Replace verbose "Current Session" / "Current Week" labels with rounded
  pills above the bar; reset countdown moves below the bar
- Extend bar to fill panel inner width (was 8px short)
- Symmetric vertical pill placement within panel
- Spinner: per-frame hold times + ping-pong indexing, modeled on
  Claude Code's Cavalry triangle oscillator (turn-around frames hold
  ~2x longer)
- Bottom spinner re-centered between weekly panel and screen edge
- screenshot.sh: 480x320 -> 480x480 for the new panel
- CLAUDE.md: document screenshot.sh + temporary boot-screen swap as
  the standard self-QA workflow for UI changes
2026-05-10 00:38:04 +00:00
Hermann Björgvin HaraldssonandClaude Opus 4.7 38d8894016 Make BLE daemon resilient to device swaps and add device-initiated refresh
- Cache invalidation: drop ~/.config/claude-usage-monitor/ble-address and remove
  the dead MAC from bluez on connect failure, so swapping ESP boards no longer
  pins the daemon to a stale factory MAC
- Scan robustness: pick first matching candidate (head -1), sanity-check cached
  content for valid MAC format, handle multiple Claude Controllers in bluez
- 5s tick + 60s poll: inner loop wakes every 5s for fast disconnect detection
  while keeping Anthropic API cadence at one minute
- Refresh-request channel: new GATT characteristic ...0004 NOTIFY, firmware
  fires once in onSubscribe when has_received_data is false; daemon subscribes
  via setsid'd dbus-monitor pipeline (process group cleanup avoids the
  bash-wait-on-job hang we hit on disconnect)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-09 23:44:39 +00:00
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
Hermann Björgvin HaraldssonandClaude Opus 4.6 10b8052bcc Replace USB serial/HID with Bluetooth Low Energy
Move all communication from USB to BLE. The device now advertises as
"Claude Controller" and acts as both a BLE HID keyboard (for touch
gestures) and a GATT data server (for usage updates from the daemon).

- Add NimBLE-Arduino BLE module with custom GATT service + HID keyboard
- Add third screen (Bluetooth) with connection status, MAC, reset button
- Rewrite daemon in bash using bluetoothctl/busctl for BLE GATT writes
- Add screenshot capture via LVGL snapshot over serial
- Remove TinyUSB mode — normal pio upload works again
- Update README with BLE architecture, screenshots, gesture docs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 19:30:19 +00:00
Hermann Björgvin HaraldssonandClaude Opus 4.6 930055170f Add two-screen UI with controller and Lucide icons
Two screens switchable by tapping the Claude logo:
- Usage screen: session and weekly utilization with animation
- Controller screen: touch gesture HID keyboard controls

Controller screen features:
- Lucide icons for ESC, DEL, left/right arrow buttons
- Gestures panel with hand icon header and hint list
- Session usage bar with reset timer at bottom
- Hold anywhere for voice dictation (space key)
- Hidden Ctrl+Space on logo hold

Also fixes stuck modifier keys with releaseAll() after each keystroke.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 19:15:36 +00:00
Hermann Björgvin HaraldssonandClaude Opus 4.6 94d55a88d2 Add USB HID keyboard input via touch gestures
The SC01 Plus now acts as a composite USB device (CDC serial + HID keyboard).
Touch gestures on the screen send keystrokes to the computer:

- Swipe up/down: arrow keys
- Swipe right: Enter
- Swipe left: Shift+Tab (change mode in Claude Code)
- Double-tap logo: Ctrl+Space (voice mode)
- Tap and hold: Space (held while touching)

Gesture-to-key mapping is defined as a simple config table in hid.cpp.
Touch detection uses a state machine with configurable thresholds in touch.cpp.

Switches to TinyUSB composite mode (ARDUINO_USB_MODE=0). Flashing now
requires flash.sh which handles the DTR/RTS bootloader reset.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 17:29:06 +00:00
Hermann Björgvin HaraldssonandClaude Opus 4.6 2611c70881 Initial commit: Claude Usage Tracker for Panlee SC01 Plus
Physical desk monitor that displays Claude Code usage limits (5-hour session
and 7-day weekly utilization) on an ESP32-S3 touchscreen via USB serial.

Firmware: LVGL 9 dashboard with LovyanGFX on SC01 Plus, Anthropic brand
colors and custom fonts (Tiempos, Styrene B, DejaVu Sans Mono), Claude
spinner animation with rotating status words.

Daemon: Pure bash script that reads the Claude Code OAuth token, makes a
minimal Haiku API call, extracts usage from rate-limit response headers,
and sends JSON to the ESP32 over serial. Uses inotifywait for instant
USB plug/unplug detection.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 02:37:11 +00:00