The device now runs the complete face contract on glass: seven states with glyph expressions (custom 140px face font), matrix rain as pooled label streams (22px DejaVu+Noto katakana font), rage kaomoji frames (64px), orbit arc + elapsed counter wait cues, blink/talk/thought animations, idle clock (SNTP, Europe/Amsterdam), and the power ladder (active/ambient 35%/dormant 5% with rain parked). Voice path: ES7210 mic capture task streams 16k PCM over esp_websocket_client to the gateway; reply PCM buffers to PSRAM and plays via the audio task; touch-to-talk (tap to speak, tap to send). Protocol mapping per docs: thinking->effort, audio->speaking, error event->rage (auto-composes after 2 loops), WS loss->error face. Bring-up fixes: 8MB factory partition (fonts overflowed 1.5M), bsp_display_lock(0) is try-lock in this adapter (use UINT32_MAX), gong synth yields to feed IDLE0, wifi scan diagnostics (found SSID case mismatch), esp_websocket_client pinned ~1.3 (1.4 needs IDF>5.5). Verified on hardware: boots, connects to Wi-Fi and holds an open WebSocket to the gateway. Sauron (iMac TTY endpoint + ops console) planned in architecture.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
47 lines
1.3 KiB
C
47 lines
1.3 KiB
C
/* Shared app types and cross-module hooks. */
|
|
#pragma once
|
|
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
typedef enum {
|
|
FACE_BOOT, /* connecting — idle glyphs + status tag */
|
|
FACE_IDLE, /* clock, rare drips */
|
|
FACE_LISTENING, /* mic hot */
|
|
FACE_PENSIVE, /* transcribing / short waits */
|
|
FACE_EFFORT, /* Tatlock working: max rain + orbit + elapsed */
|
|
FACE_SPEAKING, /* mouth sync */
|
|
FACE_RAGE, /* request failed: table flip, auto-returns to idle */
|
|
FACE_ERROR, /* gateway unreachable */
|
|
} face_state_t;
|
|
|
|
/* face.c */
|
|
void face_init(void);
|
|
void face_set(face_state_t state); /* safe from any task */
|
|
face_state_t face_get(void);
|
|
void face_activity(void); /* reset the power ladder to active */
|
|
|
|
/* audio.c */
|
|
void audio_init(void);
|
|
void audio_play_gong(void);
|
|
void audio_capture_start(void);
|
|
void audio_capture_stop(void);
|
|
void audio_playback_begin(void);
|
|
void audio_playback_feed(const uint8_t *data, size_t len);
|
|
void audio_playback_end(void);
|
|
bool audio_is_playing(void);
|
|
|
|
/* net.c */
|
|
void net_start(void);
|
|
|
|
/* gw_client.c */
|
|
void gw_start(void);
|
|
bool gw_connected(void);
|
|
void gw_send_text(const char *json);
|
|
void gw_send_bin(const uint8_t *data, size_t len);
|
|
|
|
/* desklock_main.c */
|
|
void app_on_touch(void);
|
|
void app_on_playback_done(void);
|