feat(servidor): adiciona SSE, token, E-Stop real e trava de hardware
- 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>
This commit is contained in:
@@ -46,7 +46,7 @@ class ControleTest(unittest.TestCase):
|
||||
self.thread = threading.Thread(target=self.server.serve_forever, daemon=True)
|
||||
self.thread.start()
|
||||
self.url = 'http://127.0.0.1:%d' % self.server.server_port
|
||||
kiosk.FILA.clear()
|
||||
kiosk.FILA.limpar()
|
||||
|
||||
def tearDown(self):
|
||||
self.server.shutdown()
|
||||
@@ -64,12 +64,12 @@ class ControleTest(unittest.TestCase):
|
||||
return e.code, e.read()
|
||||
|
||||
def test_config_is_persisted_without_consuming_gestures(self):
|
||||
kiosk.FILA.append('feliz')
|
||||
kiosk.FILA.adicionar('feliz')
|
||||
code, body = self.request('/app/config', {'volume': 0.7, 'sompausa': 40})
|
||||
self.assertEqual(code, 200)
|
||||
self.assertEqual(json.loads(body)['config']['volume'], 0.7)
|
||||
self.assertEqual(self.request('/app/config')[0], 200)
|
||||
self.assertEqual(kiosk.FILA, ['feliz'])
|
||||
self.assertEqual(kiosk.FILA.ordens(), ['feliz'])
|
||||
self.assertEqual(json.loads((Path(self.tmp.name) / 'app.json').read_text())['sompausa'], 40)
|
||||
|
||||
def test_invalid_configuration_does_not_partially_apply(self):
|
||||
|
||||
Reference in New Issue
Block a user