at fonctionne un peu comme if, à la différence qu'il tourne en permanence en tâche de fond:
at (distance < 50) echo "Obstacle détecté";
La commande echo dans l'exemple précédent s'exécutera dès que le test deviendra vrai, et ce, une seule et unique fois. Pour être plus précis, at déclenche la commande lorsque le test bascule de vrai à faux. Ceci est très utile pour démarrer une action lorsque une condition est remplie pour réagir à cette condition. Si vous exécutez le code précédent, le message
Obstacle détecté
s'affichera une fois lorsque vous mettrez votre main devant l'Aibo.
onleave quant à lui se rapproche de else et est suivi d'une action qui sera exécutée dès que le test basculera de vrai à faux:
at (distance < 50) echo "Obstacle détecté" onleave echo "Obstacle disparu";
whenever fonctionne un peu comme while, à la différence qu'il ne termine jamais et tourne en tâche de fond:
whenever (distance < 50) echo "Il y a un obstacle";
La commande echo sera exécutée tant que le test restera vrai. Et s'il redevient vrai par la suite, la boucle redémarrera pour, à nouveau, durer tant que le test restera vrai. Comparé à l'exemple précédent, la différence est que le message
Il y a un obstacle
sera affiché de nombreuses fois, aussi longtemps que vous laisserez votre main devant la tête du robot.
Il est possible d'ajouter une construction else pour indiquer une action à réaliser pendant que le test est faux:
whenever (distance < 50) echo "Il y a un obstacle" else echo "Il y n'a pas d'obstacle";
whenever et at sont deux constructions fondamentales que vous aurez à utiliser lorsque vous programmerez des réactions et des captures d'événements sur votre robot.
La commande wait (n) attendra pendant n millisecondes avant de s'arrêter. Pratique pour provoquer une pause lors d'une séquence de commandes, typiquement des commandes motrices:
headPan = 0 | wait(1s) | headPan = 90;
La commande waituntil(test) attend que le test devienne vrai. Utile pour synchroniser des programmes parallèles.
La commande timeout (n) cmd exécute la commande cmd et l'arrête ensuite si après n millisecondes elle n'a toujours pas fini.
timeout(10s) loop legRF2 = legLF2;
La commande stopif (test) cmd exécute la commande cmd et l'arrête ensuite si le test devient vrai avant qu'elle n'ait fini.
stopif(distance<50) robot.walk();
La commande freezeif (test) cmd exécute la commande cmd et la gèle ensuite si le test devient vrai avant qu'elle n'ait fini. La commande est dégelée si le test devient faux à nouveau.
freezeif(!ball.visible) trackball();
Cela peut s'avérer très utile pour indiquer que certaines portions de code ne tournent que lorsque certaines conditions sont réunies.
Les tests utilisés dans les commandes de capture d'événements comme at, whenever, waituntil, stopif ou freezeif peuvent être complétés de contraintes temporelles, devenant des tests coulés (ou soft tests):
at (headSensor >0 ~ 2s)
echo "Quelquechose s'est posé sur ma tête ...";
Cela signifie que le test doit rester vrai pendant deux secondes pour qu'il devienne vrai aux yeux de la commande at. Vous pouvez spécifier la durée en s ou ms en employant le suffixe approprié et le tout doit être séparé du test par un tilde ~.
Les tests coulés sont utilisables dans toutes les commandes de capture d'événements et ils sont très utiles en robotique en tant que filtres pour capteurs.
La programmation événementielle est pratique et elle est une méthode à privilégier pour programmer un robot. L'idée générale de la programmation événementielle est que certaines commandes émettent des événements et d'autres les capturent et réagissent en conséquence.
Pour émettre un événement, il y a la commande emit en URBI et vous pouvez utiliser at ou whenever pour le capturer:
at (boom) echo "boom!"; emit boom; [139464:notag] *** boom!
L'événement boom est local à la connexion. Si vous souhaitez que l'événement soit visible par une autre connexion, ajoutez-y un préfixe, comme myprefix.boom.
Vous pouvez ajouter des paramètres à un événement, comme ceci:
emit monevenement(1, "salut");
Les paramètres peuvent être récupérés lors de la capture:
at (monevenement(x,y)) echo "capture deux: " + x + " " + y; at (monevenement(1,x)) echo "capture un: " + x;
Le second at est particulièrement intéressant car il réalise un filtrage sur les paramètres de l'événements en n'acceptant uniquement que les événements dont le premier paramètre est égal à 1:
emit monevenement(1, "salut"); [146711:notag] *** capture deux: 1.000000 salut [146711:notag] *** capture un: salut emit monevenement(2, 15); [148991:notag] *** capture deux: 2.000000 15.000000
Un événement possède normallement une durée nulle, il est juste un pic (fonction de Dirac du temps). Cependant, vous pouvez demander à un événement de durer un certain laps de temps, indiqué enre parenthèses:
emit(10s) boom; emit(15h12m) monevenement(1, "salut");
Cela fera une différence entre at et whenever par exemple: whenever bouclera pendant toute la durée de l'événement.
Vous pouvez imposer à une commande de s'exécuter à intervalle régulier en utilisant la commande every. L'exemple suivant affiche
salut
toutes les dix minutes:
every (10m) echo "salut";
Une utilisation classique de ceci est d'émettre régulièrement un évenement à intervalle régulier:
every (100ms) emit pulsation;
Pour arrêter l'émission, utilisez simplement stop sur la commande every avec l'étiquette appropriée:
monmetronome:every (100ms) emit pulsation; stop monmetronome;