- 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>
84 lines
4.6 KiB
Markdown
84 lines
4.6 KiB
Markdown
# 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)
|