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>
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
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) { }
|
||||
}
|
||||
@@ -109,6 +109,7 @@ public class MainActivity extends Activity {
|
||||
private String token = ""; // CARINHA_TOKEN do servidor; vazio = servidor aberto
|
||||
private final CerebroLocal cerebroLocal = new CerebroLocal();
|
||||
private Descoberta descoberta; // acha a placa na rede quando o endereço salvo não responde
|
||||
private Luz luz; // sensor de luz: a página reage a apagar/acender a luz
|
||||
private boolean jaCaiuParaLocal = false;
|
||||
private boolean jaRecarregou = false;
|
||||
private boolean usandoLocal = false; // servidor caiu: ficamos na copia do APK
|
||||
@@ -193,6 +194,11 @@ public class MainActivity extends Activity {
|
||||
cerebroLocal.chave = token;
|
||||
cerebroLocal.iniciar(this, servidor);
|
||||
descoberta = new Descoberta(this);
|
||||
luz = new Luz(this, new Luz.Ouvinte() {
|
||||
@Override public void luz(final float lux) {
|
||||
if (emPrimeiroPlano) web.evaluateJavascript("window.eilik&&window.eilik.luz&&window.eilik.luz(" + fmt(lux) + ")", null);
|
||||
}
|
||||
});
|
||||
remoto = new ControleRemoto(new Runnable() {
|
||||
@Override public void run() {
|
||||
runOnUiThread(new Runnable() {
|
||||
@@ -867,6 +873,7 @@ public class MainActivity extends Activity {
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
emPrimeiroPlano = true;
|
||||
luz.ligar();
|
||||
ultimoUsoTela = System.currentTimeMillis();
|
||||
remoto.servidor(servidor);
|
||||
remoto.iniciar();
|
||||
@@ -890,6 +897,7 @@ public class MainActivity extends Activity {
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
emPrimeiroPlano = false;
|
||||
luz.desligar();
|
||||
remoto.parar();
|
||||
rtcWeb.evaluateJavascript("window.rtcParar&&window.rtcParar()", null);
|
||||
rtcAtivo = false;
|
||||
|
||||
Reference in New Issue
Block a user