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>
This commit is contained in:
@@ -1,60 +1,83 @@
|
||||
# Carinha PC
|
||||
# Carinha Control Panel
|
||||
|
||||
Servidor no Orange Pi Zero 3, acessado pelo PC, para controlar o Carinha no Galaxy S10 e testar servos. Dashboard: http://192.168.1.35:8100/dashboard.
|
||||
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.
|
||||
|
||||
## Desenvolvimento
|
||||
Painel: **http://192.168.1.35:8100/**
|
||||
|
||||
Pasta criada em 04/10/2026 a pedido do usuário. Código inicial copiado do projeto anterior; o original não será modificado. Design aprovado: controlar rosto, gestos, configurações e visualizar a câmera frontal pelo PC enquanto o celular mantém a carinha na tela.
|
||||
```
|
||||
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 │
|
||||
└──────────────────────┘
|
||||
```
|
||||
|
||||
- [Design](docs/DESIGN.md)
|
||||
- [Plano e verificações](docs/PLANO.md)
|
||||
- [Registro de alterações](docs/REGISTRO.md)
|
||||
## 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. Execute **iniciar.bat**. Verifica e abre **http://192.168.1.35:8100/dashboard**, sem iniciar servidor no PC. O serviço carinha-pc inicia automaticamente na placa.
|
||||
2. No celular, segure a tela do Carinha e altere o servidor para **http://192.168.1.35:8100**. O botão ADB do antigo servidor Windows não é usado nesta instalação.
|
||||
3. Troque rosto, cor e gestos. Use **Mostrar boca** e **Mostrar sobrancelhas** para ativar cada uma independentemente. Clique **Ligar câmera** para vídeo ao vivo com qualidade automática, sem trocar a tela do celular.
|
||||
4. Em **Comportamento**, ajuste som, movimento, volume, sono e economia de tela. **Configurações aplicadas no celular** depende da resposta do aparelho.
|
||||
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.
|
||||
|
||||
Brilho padrão: **70% ativo / 8% em repouso**, com **30 segundos** de espera. Retorna com som, movimento ou comando. O brilho do sistema é restaurado ao sair do app.
|
||||
## Desenvolver
|
||||
|
||||
Configurações ficam em `app-config.json` e `aparencia.json`. O vídeo não é gravado: WebRTC transmite diretamente do app ao navegador. O servidor troca apenas sinalização. Logs em `runtime/`. Qualidade automática busca 30 fps, adaptando resolução e compressão. O painel mostra os fps efetivos. [Detalhes do vídeo](docs/VIDEO-AUTO.md).
|
||||
```powershell
|
||||
# servidor local (sem I²C ele avisa "PCA9685 indisponível")
|
||||
python kiosk-server.py --porta 8100
|
||||
|
||||
APK: `android/carinha-rosto.apk`. Guia: [android/APP.md](android/APP.md).
|
||||
# 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 unittest discover -s tests -p test_controle_pc.py
|
||||
python tests/test_browser.py
|
||||
python tests/test_rtc_browser.py
|
||||
node tests/test_qualidade.js
|
||||
python android/build-apk.py
|
||||
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)
|
||||
```
|
||||
|
||||
O teste de navegador usa Playwright e um servidor efêmero próprio, sem alterar o servidor real. Testes Java em `tests/` verificam conversão de imagem e brilho; compile-os com o JDK junto das classes correspondentes. O servidor em produção exige somente Python 3.9+.
|
||||
`tests/test_tracking_browser.py` precisa dos modelos (`python obter-rastreamento.py`) e das
|
||||
imagens de teste em `../work/tracking-fixtures`.
|
||||
|
||||
**Validação física em 05/10/2026:** S10 conectado à porta 8100, telemetria de câmera/microfone ativa e JPEG recente recebido pelo PC. Configurações confirmadas pelo app e brilho ativo reportado em 70%. Ainda falta observar a orientação da imagem e a transição física do brilho para repouso.
|
||||
## Documentos
|
||||
|
||||
**Atualização 0.3 instalada:** vídeo contínuo WebRTC automático e boca/sobrancelhas independentes. Teste com câmera simulada recebeu 30 fps. Após atualizar o APK, reabra o Carinha e recarregue o painel; os fps no S10 ainda precisam ser confirmados.
|
||||
|
||||
Ferramentas de compilação reutilizadas de `C:/Users/JullioPC/Documents/Open/orange-pi-zero3/android/tools` (JDK 17 e Android SDK). Não é necessário rodar servidor na placa.
|
||||
# Atualização 0.4 — sensores e câmeras
|
||||
|
||||
Controle microfone e câmera separadamente, com permissões específicas durante o sono (padrão: só microfone). Escolha frontal/traseira e qualidade automática, manual ou máxima disponível no painel ou no menu de toque longo do app. Veja [detalhes e limites](docs/SENSORES-CAMERAS.md).
|
||||
|
||||
# Atualização 0.5 — rastreamento de rosto e mãos
|
||||
|
||||
O painel agora detecta rosto e mãos no PC, mostra pontos sobre o vídeo e pode fazer os olhos acompanharem o alvo por WebRTC. Os controles estão sob o vídeo. Só funciona com a transmissão ligada e painel aberto; os sensores e regras de sono continuam valendo. Veja [uso e validação](docs/RASTREAMENTO.md).
|
||||
|
||||
|
||||
## Dashboard e organização
|
||||
|
||||
A navegação lateral reúne Visão geral, Câmera e rosto, Conversar, Emojis, Treinamento, Servos, Braço e API. O tema escuro/ciano e os controles são compartilhados em dashboard.css/dashboard.js; CSS próprio de cada página guarda apenas seu layout específico. No celular, o rosto continua em tela cheia.
|
||||
|
||||
A biblioteca /emojis permite criar emojis prontos, editar nome e contexto, substituir por emoji, duplicar, ativar/desativar, excluir, dar feedback, desfazer e exportar. Desfazer preserva o desenho original e funciona após reiniciar o serviço. Parar expressão não movimenta motores. Reações desativadas não são escolhidas automaticamente na conversa.
|
||||
|
||||
/api gerencia o modelo Gemini e a chave. Campos de chave ficam vazios após salvar e as respostas não retornam credenciais. Alterações são guardadas em api-privada.json (permissão 600 no Linux), ignorado pelo Git e bloqueado no servidor HTTP. A configuração antiga de ambiente continua válida enquanto não houver override.
|
||||
|
||||
[Revisão, critérios e validação do dashboard](docs/DASHBOARD.md).
|
||||
[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)
|
||||
|
||||
Reference in New Issue
Block a user