O servidor manda "ritmo calmo|normal|agitado" ao celular junto com o
humor, e o rosto ajusta limiares e quantos estímulos precisa:
- calmo: limiares 50% mais altos, 3 sustos seguidos para reagir, o dobro
de sons e 4 movimentos para acordar, 3 disparos do PIR em 2 min;
- normal: reage a barulho alto e movimento forte, 2 movimentos ou os
sons configurados para acordar;
- agitado: limiares 40% mais baixos, reage a qualquer som ou movimento
(com reações variadas) e acorda no primeiro estímulo.
A madrugada silenciosa continua valendo por cima. Com o modo vida
desligado o celular volta ao "normal" (só os Ajustes).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Antes um único som acima do limiar, um quadro de movimento ou um pulso
do PIR acordavam o rosto; deitado na cama, ele acordava toda hora.
- Som: precisa de `somAcordar` barulhos (padrão 3) em 1 minuto; o mesmo
barulho comprido conta uma vez.
- Madrugada silenciosa (padrão 23h às 7h, configurável): movimento,
rastreamento, PIR e modo presença não acordam; só barulho ALTO
repetido, toque ou conversa.
- Vida: de madrugada não acorda sozinho e volta a dormir mesmo com gente
se mexendo, a não ser que alguém tenha interagido nos últimos 10 min.
- Painel: grupo "Sono e madrugada" nos Ajustes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Novo módulo vida.py: energia, alegria, companhia e diversão caem com o
tempo e sobem com presença (PIR), movimento, conversa e carinho. Delas sai
o humor e, do humor, os atos: gestos, cochilo quando cansado, dormir à
noite sem ninguém por perto, acenar pedindo atenção quando carente com
gente perto, tocar reações da biblioteca e inventar figurinhas novas com
o Gemini (no máximo 3 por dia, 90 min entre elas).
- O celular recebe "humor x" e escolhe os gestos soltos por ele.
- Toque na tela do celular conta como carinho/cutucada (/vida/cuidar).
- Respeita E-Stop e o modo presença (ninguém em casa = quieto).
- Painel: cartão Vida no Ao vivo com humor, barras, cuidados, ritmo e
diário; liga por padrão.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
O HC-SR505 segura a saída em alto ~8 s e rearma a cada movimento; com
alguém na frente o pino ficava alto direto e passar a mão não gerava
borda nova, então o painel parecia não detectar nada. Agora o gpiomon
escuta as duas bordas, o nível inicial vem do gpioget e o status/SSE
levam `ativo`. A bolinha do Ao vivo fica acesa enquanto o pino está
alto, e o modo presença não manda dormir com o sensor ainda segurando.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- "Eventos" vira item do menu principal: lista por dia (Hoje, Ontem...),
presenca e movimento em destaque, botao "Ver foto" com miniatura
- modo presenca: o PIR liga a camera do celular e acorda o Carinha; sem
ninguem por N minutos (5 por padrao) a camera desliga, ele dorme e fica
em silencio (sons e fala desligados enquanto dorme)
- historico guarda so os ultimos 3 dias (ajustavel de 1 a 30), com faxina
automatica de eventos e fotos antigos
- testes da retencao e do modo presenca
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- historico.py: eventos de PIR (gpiomon no pino 11, gpiochip1 linha 70),
movimento e som do celular em SQLite; ate 200 eventos e 100 fotos;
cada sensor e a foto ligam/desligam; intervalo minimo por tipo
- PIR acorda o Carinha quando ele esta dormindo
- APK 0.8.3: o app consulta o pedido de foto e envia uma foto da camera
frontal (quadro da camera de movimento ou do video ao vivo)
- tela apaga depois de X minutos dormindo (preto total + brilho minimo no
AMOLED); acende com som, movimento, toque, comando ou PIR
- painel: tela Historico (sensores, fotos, filtros, apagar), atalho em Ao
vivo e no Ctrl+K, ajustes "Apagar a tela quando dormir"
- testes do historico (servico e rotas HTTP)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- rosto-motor.js desenha luvinhas na cor dos olhos que sobem da borda da
tela, sincronizadas com as sequencias de rosto de mesmo nome
- faixa de baixo: legenda da resposta da conversa com efeito de digitacao,
tres pontinhos enquanto a IA pensa, equalizador ao dancar e indicador de
carga (raio e porcentagem) quando o celular esta no carregador
- gestos novos no servidor, no painel e na tela Rosto; a IA (Qwen/Gemini)
pode responder acenando, se escondendo ou pensando
- a previa do painel tambem mostra a legenda da conversa
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- aviso no painel quando a bateria do celular chega a 15% e a 5% sem
carregador (uma vez cada; volta a valer depois de carregar)
- selo do celular fica vermelho com bateria baixa
- celular offline mostra ha quanto tempo foi o ultimo sinal e com quanta
bateria; abaixo de 10% sugere que a bateria acabou
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- rosto-motor.js: emocoes como posicao de palpebra (cima, inclinacao, baixo)
com transicao suave; respiracao, sacadas e piscada que achata o olho
- rostos novos Carinha Viva, Bloco, Matriz (LEDs) e Lente (iris/pupila);
os classicos continuam; emoji/figurinha nos olhos seguem no SVG
- formato do olho (padrao, redondo, pilula, quadrado, largo) para Viva,
Bloco e Matriz; salvo na aparencia e enviado como ordem "formato X"
- toque na tela do S10: cutucar = susto e risada, deslizar = carinho,
tocar dormindo acorda
- painel: tela Rosto (celular em destaque, cartoes de rosto, formatos,
cores, testar emocoes so na previa ou no celular, lista do que ja esta
pronto); Ao vivo leva a ela; paleta ganha rostos e formatos
- corrige /comando rosto que nao salvava a aparencia
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- palco fixo no topo: camera grande com o rosto num quadrinho no canto
(toque troca os dois); botao "Ligar camera" direto no palco
- controles em lista agrupada estilo Ajustes do iPhone (Grupo, Linha,
Interruptor): camera e rastreamento, gestos, aparencia, personalidade
- cartao do celular com modelo, Android, versao do app, bateria, Wi-Fi,
IP e estado do rosto
- APK 0.8.1 informa ip/modelo/android/app/wifi (ACCESS_WIFI_STATE, so o
nivel do sinal); servidor usa o IP informado pelo app em vez do
endereco da conexao
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 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>
- Controle: opt-in de movimento fisico, botao "segure para mover"
(mouse, toque e teclado), sliders das articulacoes tambem so movem
enquanto pressionados; velocidade e interpolacao ficam no servidor
- sequencias prontas e posturas salvas: previa so na tela ou execucao
segurando o botao ate o fim; soltar interrompe na hora
- posturas com nome inline (sem prompt), exclusao confirmada inline,
exportar/importar; posturas aparecem na paleta (Ctrl+K)
- Calibracao: testes de fim de curso por canal, marcar limites e tabela
editavel com validacao antes de salvar
- Diagnostico (antigo Servos): ao vivo limitado a 10/s, bloqueado quando
o braco esta com os motores
- desenho esquematico do braco em SVG com previa animada
- servidor: evento 'motores' tambem ao ligar canais; renovar no alvo
devolve movendo=false para a sequencia avancar
- aba escondida ou E-Stop soltam o braco e desativam o movimento
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Conversa: chat empurrado por SSE, indicador de "pensando", gesto da
resposta com repetir, voz com aviso claro quando o contexto nao e seguro
e leitura em voz alta so de respostas novas
- Memoria unificada: lembrancas da conversa + rotina/preferencias em abas;
apagar tudo com confirmacao inline (sem confirm nativo)
- Reacoes: biblioteca com miniaturas estaticas (sem iframe por cartao),
busca, mostrar no celular, feedback, editar em <dialog>, duplicar,
ativar e excluir com Desfazer no toast; criar com IA; diario; grade de
gestos com estrela para favoritos; uma unica previa lateral
- treinamento recarrega por evento SSE ao terminar, sem polling
- corrige icones encolhidos em botoes .pequeno.icone
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- web/ com Vite + Svelte 5 + TypeScript; servidor entrega web/dist em "/"
(telas antigas seguem em /dashboard, /painel, /braco...)
- design system em tokens CSS, tema escuro e claro, fontes locais
- estado unico: foto de /estado + um EventSource em /eventos, sem polling
- shell com navegacao lateral/inferior, selos de status reais e E-Stop fixo
- command palette (Ctrl+K), gestos favoritos com atalhos 1-9, g+letra navega
- Ao vivo: camera WebRTC e rastreamento portados para TS, rosto, aparencia,
sensores do celular, IA local e feed de acontecimentos
- Ajustes: campos do celular agrupados com busca, salvamento otimista e
restaurar padrao (GET /app/padrao); motor da conversa, Gemini e token
- carinha.html ganha modo ?painel=1 dirigido por postMessage (sem polling)
- teste Playwright de ponta a ponta do painel novo
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- comum.py: ler_json (Origin/JSON/tamanho), gravar_atomico e token
(CARINHA_TOKEN ou seguranca.json), substituindo 6 copias nos modulos
- eventos.py: hub SSE em /eventos com heartbeat e Last-Event-ID;
modulos publicam expressao, telemetria, conversa, reacao, ia, motores
- /estado agrega o snapshot inicial; /comando unifica gesto/rosto/cor/reacao
- /parar-tudo desliga o PCA9685, para reacoes e trava motores ate /rearmar
- braco: lease (ttl_ms) e interpolacao com limite de velocidade no servidor
- braco e diagnostico nao disputam o PCA9685 (409 para o segundo dono)
- fila limitada (20) com validade de 10 s; POST /face usa prefixo "rosto"
- /app/config passa a checar Origin e JSON; versao vem de version.json
- figurinhas automaticas do Gemini limitadas a 6 por hora
- rosto entende a ordem "calma" enviada pelo E-Stop
Token so e exigido quando configurado (docs/SEGURANCA.md).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>