- Step 1: Verify firmware (display + buttons + nav)
- Step 2: Debug buzzer
- Step 3: WiFi speed + BLE feasibility
- Step 4: Camera capture
- Step 5: Audio recording
- Step 6: Telegram send + receive
- Step 7: End-to-end flow
- Step 8: Dual output + polish
Hardware confirmed: Xiao ESP32-S3 Sense, SSD1315 OLED (I2C: SDA=GPIO5, SCL=GPIO6, addr 0x3C), 4 buttons K1-K4 (GPIO1-4), single-color white display. 109 FPS.
Bugs found & fixed:
- Long-press K3 cascaded through multiple screens (reset was clearing longPressTriggered while held)
- Recording duration showed 0s on READY screen (get_seconds returned 0 after stop)
- Photo→Record→Photo reset batch (countdown_start was clearing all state)
- K3 long at Home triggered fake upload (changed to no-op at root)
- K4 short skipped READY screen, went straight to upload (restored staged READY flow)
- "Claude" brand references in UI (changed to generic: "Reply", "Processing", "Connected")
- RECEIVED screen auto-dismissed in 3s (now stays until user acts, scrollable)
- Message detail time was in large font (now small, matching nav bar)
UI improvements:
- Home screen: home icon, envelope icon (larger), message count + time, button guide with outlined "Hold+" pill
- Nav bar: all titles in small 5x7 font, separator moved up to row 11 — gained 5px content space
- Signal/battery icons shrunk and pushed far right
- Inbox: 6 messages visible (was 5), small font, 22-char previews (was 18)
- READY screen: batch capture (multiple photos + 1 voice), context-aware hints
- Send flow: "Sent!" confirmation → back to Home (no fake Processing/Thinking)
- Button guide:
# Inbox / * Phototop row,[Hold+] * Voice, # Backbottom row
- Flash firmware via
pio run -t upload - Open serial monitor
pio device monitor - Confirm boot message: "OpenPager v0.1"
- Confirm I2C scan finds OLED at 0x3C
- Confirm display shows splash "OpenPager v0.1"
- Confirm HOME screen appears after splash
Each button is active LOW with internal pull-up. Press each and confirm serial output.
| Button | Pin | Press expected | Serial output |
|---|---|---|---|
| K1 (UP) | GPIO1 | EVT_PRESS | "BUTTON PRESSED: UP(K1)" |
| K2 (DOWN) | GPIO2 | EVT_PRESS | "BUTTON PRESSED: DOWN(K2)" |
| K3 (SEND) | GPIO3 | EVT_PRESS | "BUTTON PRESSED: SEND(K3)" |
| K4 (CAPTURE) | GPIO4 | EVT_PRESS | "BUTTON PRESSED: CAPTURE(K4)" |
- K1 registers press + release
- K2 registers press + release
- K3 registers press + release
- K4 registers press + release
- No ghost presses (buttons not triggering on their own)
- No stuck buttons (all release properly)
- Shows "OpenPager" in yellow zone (top 16px)
- Shows signal + battery icons on the right
- Shows envelope icon + "10 messages" in blue zone
- Shows "OpenClaw: OK"
- Short press K3 (SEND) → pushes to INBOX screen
- Yellow zone shows "Inbox" + "1/10" position
- Blue zone shows message list with > and < prefixes
- First message is selected (inverted/highlighted)
- K1 (UP) moves selection up
- K2 (DOWN) moves selection down
- Selection wraps visually (list scrolls when hitting edges)
- Position counter updates (2/10, 3/10, etc.)
- Hold K2 (DOWN) triggers auto-repeat (fast scrolling)
- Hold K1 (UP) triggers auto-repeat
- Short press K3 (SEND) on a message → opens detail view
- Yellow zone shows "You" or "Claude" + time
- Blue zone shows word-wrapped message text
- If message is long: page indicator shows "12:35 1/2"
- K2 (DOWN) pages forward
- K1 (UP) pages backward
- From Message Detail: long press K3 → back to Inbox
- From Inbox: long press K3 → back to Home
- From Home: long press K3 → triggers "upload" (expected behavior)
- Back transitions feel responsive (400ms threshold)
- No double-triggers (pressing K3 long doesn't also fire short press)
- From Home: short press K4 → goes to UPLOADING screen (instant photo sim)
- UPLOADING shows "Sending /" spinner
- Auto-transitions to THINKING ("Claude..." with dots)
- Auto-transitions to RECEIVED ("New msg" with preview)
- RECEIVED auto-dismisses back to Home after 3s
- From RECEIVED: short press K3 → opens Inbox
- From Home: hold K4 (400ms+) → RECORDING screen appears
- Shows "Recording" in yellow zone
- Shows blinking dot + seconds counter
- Counter increments while held
- Release K4 → transitions to UPLOADING
- UPLOADING → THINKING → RECEIVED flow completes
- Rapid button mashing doesn't crash
- Pressing multiple buttons simultaneously doesn't break state
- Screen transitions don't leave visual artifacts
- FPS stays reasonable (check serial: should be 40+ FPS)
| # | Screen | Description | Severity |
|---|---|---|---|