Files
carinha-control-panel/android/app/java/br/carinha/rosto/Luz.java
T
julioandClaude Opus 5.5 2933407b9e feat(vida): jeito de gente e console com o porquê de cada decisão
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>
2026-10-11 03:37:07 -03:00

45 lines
1.6 KiB
Java

package br.carinha.rosto;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
/**
* Sensor de luz do celular (lux). A página decide o que fazer (apagaram a luz: sono; acenderam de
* repente: aperta os olhos). Manda no máximo a cada INTERVALO e só quando muda de verdade.
*/
final class Luz implements SensorEventListener {
interface Ouvinte { void luz(float lux); }
private static final long INTERVALO = 700; // ms
private final SensorManager gerente;
private final Sensor sensor;
private final Ouvinte ouvinte;
private long enviadoEm;
private float enviado = -1;
Luz(Context c, Ouvinte ouvinte) {
gerente = (SensorManager) c.getSystemService(Context.SENSOR_SERVICE);
sensor = gerente == null ? null : gerente.getDefaultSensor(Sensor.TYPE_LIGHT);
this.ouvinte = ouvinte;
}
void ligar() { if (sensor != null) gerente.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL); }
void desligar() { if (sensor != null) gerente.unregisterListener(this); }
@Override public void onSensorChanged(SensorEvent e) {
float lux = e.values[0];
long agora = System.currentTimeMillis();
boolean mudou = enviado < 0 || Math.abs(lux - enviado) > Math.max(2f, enviado * 0.15f);
if (!mudou || agora - enviadoEm < INTERVALO) return;
enviado = lux;
enviadoEm = agora;
ouvinte.luz(lux);
}
@Override public void onAccuracyChanged(Sensor s, int precisao) { }
}