# Carinha Control Panel Robô de mesa: o **rosto** roda num Galaxy S10 (app Android), o **servidor** num Orange Pi Zero 3 (Python, só biblioteca padrão) e o **painel** em qualquer navegador da rede. O mesmo servidor comanda um braço de 7 articulações por um PCA9685 (I²C) e conversa por Gemini ou Qwen local. Painel: **http://192.168.1.35:8100/** ``` PC / celular (navegador) Orange Pi :8100 Galaxy S10 (app) ┌──────────────────────┐ HTTP ┌──────────────────────┐ HTTP ┌──────────────────┐ │ painel Svelte (web/) │ ───────► │ kiosk-server.py │ ◄─────── │ carinha.html │ │ 1 EventSource │ ◄─SSE─── │ /eventos /estado │ ──SSE──► │ (rosto) │ │ WebRTC ◄────────────┼──────────┼── sinalização /rtc ──┼──────────┼─► câmera │ └──────────────────────┘ │ braço · servos (I²C) │ └──────────────────┘ │ conversa · reações │ └──────────────────────┘ ``` ## O painel Quatro áreas + ajustes, todas alimentadas por **um** fluxo SSE (`/eventos`), sem polling: | Área | O que tem | |---|---| | **Ao vivo** | Câmera do celular (WebRTC) e rosto lado a lado, gestos favoritos, aparência, sensores, IA local, acontecimentos | | **Conversa** | Chat com voz, motor de IA, memória (lembranças + rotina) | | **Reações** | Biblioteca (criar, editar, desfazer), criar com Gemini, todos os gestos, diário | | **Movimento** | Braço com homem-morto, sequências, posturas, calibração e diagnóstico do PCA9685 | | **Ajustes** | Celular (agrupado, com busca), IA e chave Gemini, token, sistema | Controles que valem em qualquer tela: - **Parar tudo** (botão vermelho, `Shift+Espaço` ou `Esc` duas vezes): desliga todos os servos, para reações e acalma o rosto. Os motores ficam travados até **Rearmar**. - **Ctrl+K**: paleta com gestos, rostos, cores, telas, ações e posturas. - **1–9**: gestos favoritos (fixe com a estrela em Reações › Gestos). **g** + letra navega (`g v` Ao vivo, `g c` Conversa, `g r` Reações, `g m` Movimento, `g a` Ajustes). - O braço **só se move enquanto você segura** o botão ou o slider; ao soltar, os motores desligam em menos de meio segundo. Detalhes em [docs/PAINEL.md](docs/PAINEL.md). ## Usar 1. `iniciar.bat` confere o Orange Pi e abre o painel. 2. No celular, toque longo › **Mudar o servidor** › `http://192.168.1.35:8100`. 3. Se a placa tiver token (recomendado, veja [docs/SEGURANCA.md](docs/SEGURANCA.md)): toque longo › **Token do servidor** no celular, e o painel pede o token uma vez. ## Desenvolver ```powershell # servidor local (sem I²C ele avisa "PCA9685 indisponível") python kiosk-server.py --porta 8100 # painel com recarga automática, falando com o servidor local ou com a placa cd web; npm install npm run dev # usa http://127.0.0.1:8100 $env:CARINHA_SERVIDOR='http://192.168.1.35:8100'; npm run dev ``` Publicar na placa: `.\deploy.ps1` (compila o painel, faz backup e reinicia o serviço). ## Verificações ```powershell python -m pytest tests -q --ignore-glob='*browser*' # servidor: token, SSE, E-Stop, trava, módulos cd web; npm run check; npm test; npm run build; cd .. # tipos, lógica pura e build do painel python tests/test_painel_web_browser.py # painel de ponta a ponta (Playwright) python tests/test_rtc_browser.py # WebRTC real com câmera sintética python tests/test_browser.py # rosto (carinha.html) node tests/test_qualidade.js # qualidade automática do vídeo python android/build-apk.py # APK (precisa de keystore e libs nativas) ``` `tests/test_tracking_browser.py` precisa dos modelos (`python obter-rastreamento.py`) e das imagens de teste em `../work/tracking-fixtures`. ## Documentos [Painel](docs/PAINEL.md) · [Segurança](docs/SEGURANCA.md) · [Orange Pi](docs/ORANGEPI.md) · [Braço](docs/BRACO.md) · [Conversa](docs/CONVERSA.md) · [IA local](docs/IA-LOCAL.md) · [Vídeo](docs/VIDEO-AUTO.md) · [Rastreamento](docs/RASTREAMENTO.md) · [Repositório](docs/GITEA.md) · [Registro](docs/REGISTRO.md)