O #telao tinha display:flex, que vencia o atributo hidden: depois do jogo o
"EU SOU O CAMPEÃO!!!" ficava preso na tela do rosto. #telao[hidden] volta a
esconder. Conferido no S10: some sozinho no tempo pedido.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- comando "telao" (validado: texto curto, tom, símbolos permitidos, até
2 lados) e letreiro por cima do rosto: título enorme que estoura e
pisca, as duas jogadas (VOCÊ ✊ × ✋ CARINHA), cor por resultado;
- pedra, papel e tesoura: 3, 2, 1 piscando, "JÁ!", o que ele leu da sua
mão, "VENCI!!!" / "VOCÊ GANHOU!" / "EMPATE!" com placar e o campeão;
quantos dedos e achou! também usam o telão;
- o cartão do painel mostra o mesmo destaque.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- lib/maos.ts: dedos esticados pelos 21 pontos do MediaPipe (vale em
qualquer rotação), contagem, jogada e leitura estável (mão parada);
- lib/jogos.svelte.ts: os três jogos conversam com o Carinha por comandos
(fala com legenda, gestos e símbolo nos olhos) e contam como brincadeira
para o modo vida; cartão "Jogos com a mão" no Ao vivo liga a câmera e o
rastreamento com um toque;
- servidor: comandos "dizer" (até 120 caracteres) e "olhos" (símbolos e
números permitidos, 0,5 a 8 s); rosto mostra o símbolo nos olhos.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Console (console.py + tela Console no painel):
- cada parte registra o que fez e o motivo: modo vida (com necessidades
e humor), sentidos, celular (ordens e o que o rosto fez), IA local,
aprendizado e ideias do dia; últimas 400 linhas, ao vivo pelo SSE;
- tela com o "agora" (humor, necessidades, o que está fazendo, próxima
decisão, última decisão, jeito), filtros, detalhes, pausa e busca.
Jeito de gente:
- saudade: a festa cresce com o tempo fora (aceno, "Oi! Você voltou!",
"Senti sua falta!"); bom dia lembrando de ontem;
- pedidos com motivo ("Brinca comigo?", "Me faz um carinho?", mostrar a
figurinha nova), no máximo 1 a cada 20 min;
- larga atividade no meio quando fica chato; personalidade (curiosidade,
brincadeira, timidez) que pesa nos gestos e amadurece com o convívio;
- no rosto: acordar grogue, sonhar com algo do dia (balão no motor),
hesitar antes de gestos, errar na atividade e ficar sem graça, olhar
nos olhos e desviar, sorrir de volta (FaceLandmarker no rastreador do
painel) e reagir à luz (sensor de luz no app 0.10.0);
- ordem "dizer" com legenda e voz de robô.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
O roteador/chip Wi-Fi descarta o multicast entre aparelhos sem fio: a placa
não via ninguém e o celular não recebia o _carinha._tcp. Sem anúncio em 6 s,
o app pergunta /app/health a cada endereço da rede (32 em paralelo) e usa
quem responde carinha-pc. Testado no S10: achou .35 em ~17 s.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- sistema/rede: a placa vira "carinha" na rede (avahi), http://carinha.local
na porta 80 (nftables redireciona para a 8100, sem tocar no 192.168.4.1
do portal Carinha-Config) e anúncio "_carinha._tcp" na 8100;
- app 0.9.1: quando o endereço salvo não responde, procura o anúncio na
rede (NsdManager), testa o endereço achado e passa a usar e guardar.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Todo dia, a partir das 9h, o Carinha cria 3 atividades novas (inspiracao.py):
- sinais de fontes abertas: tempo da cidade (Open-Meteo), datas
comemorativas da semana (lista fixa + feriados da BrasilAPI), "neste dia"
da Wikipédia e assuntos em alta no Google Trends Brasil;
- o Gemini escolhe ideias leves (descarta tragédia, política e afins) e
cada uma vira atividade pelo estúdio (Criacao.gerar), com motivo e uma
curiosidade;
- até 3 tentativas por dia, 30 min entre elas; botão "Criar mais agora";
- as atividades criadas entram na rotina do modo vida (as de hoje com 40%
de chance) e, com alguém perto, ele conta a curiosidade: legenda e voz
de robô (ordem "aprendi", até 2x por dia cada);
- painel: cartão "Ideias do dia" no estúdio (Mostrar, Contar, o que ele
viu na internet, ajustes: quantas, horário, cidade, fontes) e tópico no
guia.
Correções achadas no caminho:
- WebView de fábrica do S10 (Chrome 102) não tem AbortSignal.timeout: o
celular nunca mandava o status e a placa o via offline;
- arquivos estáticos com Cache-Control no-cache e o app com LOAD_NO_CACHE:
o WebView seguia com uma carinha.html velha depois de deploy;
- status do celular recusado vai para o journal (1 linha por minuto);
- legenda mais estreita para não cobrir a bateria.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sem servidor o app não finge mais que está tudo normal:
- o app guarda a última aparência e os ajustes vindos da placa (ponte
CarinhaApp); a cópia do APK abre com eles;
- a carinha dorme e não acorda com nada; no canto direito aparece a
placa ✕ celular animada com "sem conexão com a placa";
- o app tenta a placa a cada 10 s e volta sozinho; se a placa cai com
a página aberta, em 15 s ela dorme e mostra o aviso;
- endereço padrão passa a ser a Orange Pi (192.168.1.35:8100).
Também no app (0.9.0):
- modo quiosque como dono do aparelho (Quiosque/Admin, menu "Modo
quiosque"); a Samsung recusa com bootloader desbloqueado, vale no
LineageOS;
- carinha como tela inicial (HOME);
- android/enxugar-s10.ps1 desativa 57 apps sem uso no S10 (-Reativar
desfaz).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Menu "Criar com IA" (Ao vivo › Gestos e Reações) com grade igual à dos
favoritos. Para cada pedido escolhe-se o tipo (expressão, atividade ou
figurinha) e a IA: Gemini, IA local (qualquer servidor compatível com
OpenAI na rede, como o ROG Ally com LM Studio/llama-server) ou o Qwen do S10.
- A IA não escreve código: responde uma receita de formato fixo (schema
JSON) montada só com peças que o rosto já anima. O servidor valida,
limita números e descarta peças desconhecidas antes de chegar ao celular.
- Reaproveita o que existe: o prompt leva exemplos reais dos gestos e
atividades atuais, e "Basear em" manda a receita de um gesto, atividade
ou criação para a IA fazer uma variação.
- Expressões viram sequências como as de sequencias(), com mãos e espiral.
- Atividades usam uma cena genérica com o bonequinho (poses, pernas, pulo,
balanço) e os objetos das cenas feitas à mão (bola, livro, xícara,
notas, estrelas, coração, Zzz, chama, bolha, halter, microfone,
controle, pincel, flor), com movimentos pular/girar/subir/orbitar.
- Figurinhas reaproveitam o desenho e a biblioteca de reações.
- A estrela põe expressões e atividades criadas nos favoritos (e nas
teclas 1 a 9); a IA local é configurada na própria tela, com teste.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Parado ele vivia escondendo o rosto: a IA local (Qwen 0.6B) reagia a cada
som ou "sozinho" a cada 20-60 s e repetia 'esconder' apesar do "varie".
- IA local: cada evento só oferece gestos que combinam (barulho: susto ou
olhar; movimento: olhar e acenar), os dois últimos ficam fora do enum,
no máximo a cada 45 s, não interrompe atividade e, com o modo vida
ligado, não reage a "sozinho".
- Sem ninguém olhando (sem movimento/PIR há 3 min) nada de gesto "para
alguém" (acenar, tímido, esconder...): ele vive a vida dele e começa
atividades com mais frequência.
- Gestos soltos no celular: quase sempre sutis (olhar de lado, piscar
devagar), gesto grande raro e nunca repetido em seguida.
- Olhar em repouso com fixações e sacadas em vez do vaivém contínuo.
- Tonto: espirais girando no lugar dos olhos (todos os rostos, inclusive
Matriz) e boca de "ó". Bocejo: mão na frente da boca com tapinhas e
Zzz subindo. As mãos agora aparecem também quando o gesto vem sozinho.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Quatorze cenas novas para o bonequinho: cochilar na caminha (cobertor
respirando e Zzz), café (vapor e gole), cozinhar (vira a panqueca no
fogão), regar a plantinha (cresce e dá flor), violão, dançar (globo
espelhado), pular corda, meditar flutuando, telescópio (céu estrelado e
estrela cadente), pipa com rabiola, bolhas de sabão, skate (com ollie),
computador (código aparecendo) e pescar (o peixe pula preso na linha).
Necessidades puxam comportamento, como no The Sims:
- energia < 40%: às vezes cochila; < 20%: dorme de verdade com sono
respeitado (som comum, movimento e PIR não acordam) até 95%; acordar
de propósito (toque, painel) encerra o sono pesado;
- alegria abaixo de 60%: o rosto vai ficando emburrado (zanga 0 a 1:
testa franzida, boca para baixo, olhos bravos); < 30%: mal-humorado;
- diversão < 45%: faz uma atividade de 2 a 5 min escolhida pelo pique
(cansado prefere calmas, café dá energia); pode ser interrompido;
- durante a atividade a diversão sobe e a energia cai conforme o tipo.
Com o modo vida ligado o celular não adormece mais por 20 s de silêncio:
quem decide o sono é a energia. A cor escolhida nunca muda com a zanga.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Atividades: a tela se divide, o rosto vai para a esquerda e encolhe, e
à direita um bonequinho do Carinha (silhueta na cor dos olhos) faz algo:
ler (vira a página), cantar (microfone e notas), jogar bola
(embaixadinha), videogame (TV com joguinho), pintar (cavalete que ganha
pinceladas) e malhar (halteres e suor). Os olhos grandes acompanham:
leem as linhas, seguem a bola, olham a TV. Camada própria atrás dos
olhos, vale para todos os rostos; em pé (retrato) a cena vai para baixo.
- Comando {tipo: "atividade", valor: nome|parar}; toque na tela, dormir
e E-Stop encerram; o celular informa a atividade na telemetria.
- Modo vida escolhe pelo humor (feliz canta e joga bola, tranquilo lê
e pinta, entediado joga videogame), nunca de madrugada, e não
interrompe uma atividade em andamento.
- Gestos novos: rir, comemorar, tímido, confuso, bocejar e tonto; o
humor e o modo vida também os usam.
- Painel: favoritos vão até 20 e o bravo volta junto com os novos;
botões de atividade no Ao vivo, no Ctrl+K e tópico no guia.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
De vez em quando, fora dos gestos, um canto da boca sobe, uma sobrancelha
arqueia, a testa franze pensando, a boca entreabre num suspiro, e tudo
volta suave ao neutro. O humor do modo vida escolhe quais (carente fica
preocupado, feliz dá sorrisinhos, cansado suspira). As sobrancelhas
descem um pouco ao piscar. Vale para o SVG e para a Matriz de LEDs.
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 celular adormece sozinho (silêncio sem movimento) e acorda com som,
movimento ou toque; isso vem na telemetria, não no SSE de ordens, e a
prévia do painel continuava acordada. Ao vivo e mini-rosto agora seguem
o `dormindo` da telemetria; as prévias de edição (Rosto, Reações) não.
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>
Surpreso, triste e dormindo usavam azuis fixos; agora usam tons da cor
escolhida (mais clara no susto, mais escura e apagada na tristeza e no
sono). Nas reacoes da biblioteca o ciano padrao vira a cor escolhida e o
azul-claro um tom claro dela, no celular e nas miniaturas do painel.
Bravo (vermelho) e coracao (rosa) continuam, pois fazem parte da emocao.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dormindo, os rostos novos mostram os olhos como tracos (-) e tres Z de
tamanhos diferentes saem do canto do olho direito, sobem crescendo e somem
em ciclo. Na Matriz a boca vira '_' (- _ -) e os Z sao maiores, em LEDs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A sobrancelha passa a ser posicionada a partir do topo real do olho de cada
estilo e formato (antes usava a altura do olho classico, alto demais nos
rostos novos). Nos rostos novos a boca sobe um pouco. Novos ajustes
'Subir a boca' e 'Distancia das sobrancelhas' (tela Rosto e Ajustes),
validados no servidor.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- opcao "iris" (app config, Ajustes e tela Rosto): anel mais escuro com
pupila que acompanha o olhar, dilata na alegria e contrai no susto; na
Matriz vira LEDs apagados
- Matriz desenha boca e sobrancelhas em LEDs (antes a tela de pontos
cobria o SVG); Bloco e Lente passam a obedecer o ajuste de boca
- tela Rosto: boca, sobrancelhas e iris ali mesmo; as teclas de emocao
agora vao ao celular por padrao ("testar so na previa" e opcional)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Se o servidor caia no meio da transmissao, o app tentava reabrir a camera
ainda presa pelo sensor de movimento; o getUserMedia ficava esperando para
sempre e a fila de pedidos do painel travava (video "desligado" ate
reiniciar o app). Agora abrir a camera tem prazo de 8 s, cada pedido do
painel tem prazo de 12 s e uma camera encerrada de repente desfaz a sessao
para a proxima mensagem reabrir. Validado no S10: servidor reiniciado com
video ativo volta sozinho em ~8 s. APK 0.8.2.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
O coaxar vinha do zumbido de 72 Hz, da ressonancia grave (~230 Hz), da
oitava de baixo e do FM desalinhado. Agora: ressonancia de lata fina
(~850 Hz), FM harmonico leve, realce em 3,2 kHz, oitava de baixo quase
nula e tom 25% acima. Bravo vira bipes zangados e pensar vira 'hmm?' com
bipinhos; nenhum som tem energia relevante abaixo de 250 Hz.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Modulacao em anel (72 Hz), ressonancia de lata (atraso de 4,3 ms
realimentado), degraus digitais com saturacao suave e FM com razao 1,41
nas silabas. Volume geral ajustado para compensar.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- voz-robo.js: silabas com deslize de tom, vibrato e filtro de formante
("uou", "ohh"), motorzinho de ruido filtrado e cliques; tudo gerado na
hora com Web Audio, sem gravacoes nem arquivos de terceiros
- um som proprio para cada gesto, incluindo maos (motor ao subir e descer)
- balbucio de robo na resposta da conversa (mesma frase, mesmo som; sobe
no fim quando e pergunta) e silencio dos gestos enquanto ele "fala"
- tela Rosto: ouvir a voz no PC e botao "Testar fala"; bipes antigos
ficam como reserva
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
As maos sobem em arco a partir dos cantos de baixo, girando no caminho,
com um leve passa-e-volta e uma chegando um instante depois da outra.
Ficam inclinadas para dentro (~24 graus) mostrando o dorso (nos dos
dedos, polegar para fora) e sem tapar o olho inteiro. Espiar gira a mao
pelo punho como uma porta; acenar tambem balanca pelo punho.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Quatro dedos separados (medio maior, levemente abertos), polegar para o
lado do rosto, punho de robo e contorno so na borda externa. Ao acenar os
dedos balancam; ao pensar o punho fecha com o indicador no rosto; para
esconder e espiar as maos cobrem o olho inteiro.
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>
- rosto-motor.js desenha emoji e figurinha dentro dos olhos no estilo e
formato escolhidos (brilho, piscada; na Lente no lugar da iris; na
Matriz os LEDs usam as cores do desenho)
- MotorRosto.retrato desenha um retrato parado em qualquer canvas
- miniaturas da biblioteca no painel usam o mesmo motor, no rosto, formato
e cor atuais do robo (3:2, com o simbolo "ao redor" no canto)
- emoji e figurinha "ao redor" ganham o brilho na cor da reacao
- cartoes da biblioteca com as acoes numa linha so
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>