gestes_routes
gestes_routes
¶
Le mode gestes : armer, envoyer des images, désarmer.
Spatial Mesh, gestes — 25 août 2026. La caméra est ouverte par l'APPLICATION, pas par le serveur : macOS ne pose la question qu'à un paquet, et l'interpréteur Python n'en est pas un (voir docs/spatial-mesh/GESTES.md). L'interface capture donc, et poste ici les images ; le serveur voit, décide, et rend un état.
Le §78 gouverne ce module : rien ne guette en permanence. Une session s'arme explicitement, se désarme d'elle-même après un temps mort, et le voyant vert de la caméra dit la vérité pendant tout ce temps. Une caméra qui tournerait « au cas où » ferait de Diapason autre chose qu'un assistant.
Aucune image n'est écrite sur le disque, jamais : elle vit le temps d'un appel à Vision, et seuls des points articulaires lui survivent.
Classes¶
FichierPourGeste
¶
Bases: BaseModel
Le chemin rendu par le dialogue natif — jamais un contenu encodé.
ChoixDAppareil
¶
Bases: BaseModel
La réponse à « vers lequel ? » : le jeton posé, et un appareil.
Functions:¶
session_active
¶
Le mode gestes est-il armé ? Constaté, pour l'interface et les tests.
Source code in src/diapason/server/gestes_routes.py
claps_actifs
¶
Le micro écoute-t-il vraiment ? Un objet gardé n'est pas une preuve.
Source code in src/diapason/server/gestes_routes.py
ecouter_les_claps
¶
Ouvrir le micro pour entendre un double-clap, et rien d'autre.
Le détecteur ne transcrit rien et ne garde rien : il suit le niveau sonore et cherche deux pics rapprochés. Aucune parole n'est analysée, aucun son n'est enregistré.
Source code in src/diapason/server/gestes_routes.py
ne_plus_ecouter
¶
Refermer le micro. Il ne doit pas rester ouvert par oubli.
Source code in src/diapason/server/gestes_routes.py
mesurer_la_piece
¶
Premier temps : écouter la pièce se taire.
Source code in src/diapason/server/gestes_routes.py
mesurer_les_claps
¶
Second temps : écouter claper, dans la pièce qu'on vient de mesurer.
Source code in src/diapason/server/gestes_routes.py
oublier_les_claps
¶
Revenir au réglage d'usine. Le fil garde son seuil tant qu'il tourne : il faut donc le relancer pour que l'oubli prenne effet.
Source code in src/diapason/server/gestes_routes.py
armer
¶
Armer le mode gestes. La caméra ne s'ouvre qu'après, côté interface.
Source code in src/diapason/server/gestes_routes.py
desarmer_route
¶
Désarmer. L'interface éteint la caméra en recevant cette réponse.
Source code in src/diapason/server/gestes_routes.py
preparer_un_fichier
¶
preparer_un_fichier(
body: FichierPourGeste,
) -> dict[str, Any]
Préparer le fichier que le prochain poing attrapera.
Cette porte reste derrière l'authentification locale de l'application. Elle ne téléverse rien et ne renvoie jamais le chemin : le navigateur ne reçoit que le nom, le type et la taille qu'il doit afficher.
Source code in src/diapason/server/gestes_routes.py
oublier_le_fichier_prepare
¶
Retirer le fichier préparé sans toucher à ce qui est déjà tenu.
Source code in src/diapason/server/gestes_routes.py
repondre_au_choix
¶
Trancher une question en attente, et rendre ce que le récepteur a dit.
Le jeton sert de clé d'idempotence : deux réponses — un clic ET une phrase — n'envoient qu'une fois.
Source code in src/diapason/server/gestes_routes.py
envoyer_ce_qui_est_tenu
¶
Envoyer la main vers un appareil, sans question préalable.
Le chemin de « envoie ça sur mon téléphone » quand aucune question n'est en suspens. L'appel est une issue terminale : succès, refus ou erreur viennent du destinataire et consomment l'intention ; recommencer sera un nouveau geste visible, jamais une reprise silencieuse.
Source code in src/diapason/server/gestes_routes.py
choisir_lappareil
¶
choisir_lappareil(body: ChoixDAppareil) -> dict[str, Any]
Trancher entre les candidats, et envoyer pour de bon.
Le deviceId reçu n'est jamais cru sur parole : il doit figurer dans la
liste que le serveur a lui-même mesurée en posant la question. Un client
ne choisit pas une destination, il choisit PARMI celles qu'on lui a
proposées — c'est ce qui empêche cette route de devenir un « envoie
n'importe quoi à n'importe qui » déguisé en réponse.
Source code in src/diapason/server/gestes_routes.py
renoncer_au_depot
¶
« Laisse tomber. » Sans cette route, la seule sortie serait le silence.
Une question qui ne peut qu'expirer laisse l'utilisateur attendre quarante-cinq secondes pour apprendre qu'il ne se passera rien. Renoncer est une réponse ; elle mérite d'exister.
Source code in src/diapason/server/gestes_routes.py
image
async
¶
Une image de plus. Rend l'état APRÈS cette image.
Le corps est l'image brute (JPEG ou PNG) envoyée par l'interface. Elle n'est jamais écrite : Vision la lit en mémoire, et seuls des points en sortent.
Source code in src/diapason/server/gestes_routes.py
1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 | |
appliquer
¶
Poser les seuils dérivés des deux mesures, et les garder.
Source code in src/diapason/server/gestes_routes.py
calibrer
¶
Mesurer une pose — « ouverte » puis « fermee ».
La calibration ne devine pas : elle enregistre ce que la main de CETTE personne produit réellement, et place les seuils entre les deux poses.
Source code in src/diapason/server/gestes_routes.py
finir_la_mesure
¶
Clore une mesure et rendre sa moyenne — ou avouer qu'il n'y a rien.