Files
julioandClaude Opus 5.5 c5fd54c1d9 feat(celular): rosto e app usam SSE e token; remove telas legadas
- carinha.html assina /eventos (expressao, app_config, conversa, reacao,
  recarregar) e volta ao polling de /fila sozinho se o SSE cair; foto dos
  ajustes a cada (re)conexao; token (?t=) vai em todo fetch ao servidor
- APK 0.8-token: token nas preferencias e no menu de toque longo, enviado
  na pagina, no HTTP do Java e ao llama-server (--api-key); trocar servidor
  por Intent exige o token salvo; camera/microfone so para o servidor
  configurado ou a copia local
- cerebro/conversa mandam a chave ao llama-server do S10
- servidor: evento SSE 'recarregar'; remove /camera/frame e /app/connect;
  enderecos antigos redirecionam para a secao do painel novo
- remove dashboard, painel, conversa, emojis, treinamento, braco, servos,
  api, scripts e CSS antigos, audio-robot.js e servir-local.bat
- logica pura do painel em web/src/lib/nucleo.ts com testes node --test
  (substitui test_movimentos.js e test_rastreamento.js)
- testes de navegador portados para o painel novo (rtc, rosto, rastreamento)
- README, docs/PAINEL.md e docs/SEGURANCA.md reescritos; versao 0.8.0;
  carinha-pc.service le /etc/carinha.env

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 20:11:58 -03:00

84 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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)