ELECINF344/381

Partie interactive du site pédagogique ELECINF344/ELECINF381 de Télécom ParisTech (occurrence 2011).

Catégories

Communication challenge 2011

Cette année, le communication challenge repose sur la possibilité d’exécuter des commandes en tâche de fond et de stocker des commandes pour usage futur.

Communication avec le serveur

Le serveur communique en 802.15.4. Son identité est « CC » (0×43 0×43). Chaque client doit être configuré avec les initiales du participant sur deux caractères comme c’était le cas pour la mise en œuvre il y a deux semaines. Les messages envoyés en broadcast seront rejetés et pourront conduire à l’élimination de la personne fautive. Toute tentative, réussie ou non, de se faire passer pour le serveur, pour un autre client ou de perturber un autre participant sera sanctionnée.

Toutes les communications utilisent un protocole découpé en lignes, chaque ligne étant terminée par le caractère ‘\r’ (line feed). Aucune ligne, émise par le serveur ou par les cartes, ne peut contenir plus de 50 caractères (y compris le caractère de fin de ligne).

Lorsque des valeurs doivent être échangées entre le serveur et le client en hexadécimal ou en base 33, celles-ci utiliseront les chiffres de 0 à 9 puis les lettres majuscules, de ‘A’ jusqu’à, respectivement, ‘F’ ou ‘W’. Les valeurs transmises par le serveur contiendront systématiquement deux chiffres lorsqu’elles sont en hexadécimal ou un seul chiffre lorsqu’elles sont en base 33. Les valeurs transmises en hexadécimal par le client contiendront autant de chiffres que nécessaire (jusqu’à 3).

Les paquets envoyés par le serveur auront systématiquement la forme suivante :

SLOTID [CMD] EOL

où :

  1. SLOTID est un caractère en base 33. Il vaut soit ’0′, pour signifier une exécution immédiate, soit une valeur entre ’1′ et ‘W’ indiquant qu’il faut stocker les commandes dans le slot correspondant (il faut donc prévoir 32 slots) pour une exécution future (voir, plus bas, la commande ‘X’).
  2. [CMD] représente 0, 1 ou plusieurs commandes, concaténées sans séparateur intermédiaire.
  3. EOL représente le caractère de fin de ligne ‘\r’.

La réponse à la réception d’une commande doit être envoyée immédiatement (avant exécution éventuelle) sous la forme d’un paquet de deux caractères :

SLOTID EOL

Ensuite, si SLOTID vaut 0, la commande doit être exécutée (ce qui peut provoquer l’envoi de paquets supplémentaires comme indiqué dans la description individuelle des commandes.

Les exemples donnés le sont à titre d’illustration et ne sont pas contractuels (ils peuvent contenir des erreurs, même si un effort particulier a été fait pour qu’ils soient corrects). Le préfixe « > » représente une ligne envoyée par le serveur à la carte et le préfixe « < » un envoi d’une ligne de la carte vers le serveur.

Pour initier le dialogue avec le serveur, la carte doit, après avoir configuré son adresse correctement, envoyer une ligne « START », et le serveur enverra alors sa première commande. À tout moment, en cas de réponse incorrecte, le serveur peut arrêter d’envoyer des commandes à la carte, et ne recommencera que lorsqu’un nouveau « START » sera renvoyé. L’envoi de « START » par le client est permis à tout moment et redémarrera la séquence.

Commandes

Ping

La commande Ping est constituée d’un unique caractère ‘P’. L’effet de son exécution est l’envoi d’un paquet contenant le caractère ‘P’ suivi d’un caractère de fin de ligne (l’envoi de ce caractère de fin de ligne est valable pour toutes les commandes qui envoient quelque chose, son utilisation ne sera pas rappelée par la suite).

Exemple d’exécution de la commande Ping

> 0P
< 0
< P

Leds

La commande Leds est constituée du caractère ‘L’ suivi de trois valeurs hexadécimales comprises entre 00 et FF représentant, respectivement, l’éclairage des leds rouge, verte et bleue composant la led tricolore équipant la carte. Elle ne donne lieu à aucune réponse.

Exemple d’allumage de la LED tricolore à environ 50% de vert et 0% de rouge et bleu

> 0L007F00
< 0

Execute

La commande Execute est constituée du caractère ‘X’ suivi d’un numéro de slot en base 33 entre ’1′ et ‘W’. Elle ne donne lieu à aucune réponse directe, mais l’exécution des commandes stockées dans le slot correspondant peut donner lieu à l’envoi de paquets si ces commandes le prévoient.

Attention : l’exécution d’une commande dans un slot particulier peut contenir des ordres d’exécution d’autres commandes. Il est donc important que l’exécution de commandes imbriquées soit possible.

La carte ne doit pas traiter de nouvelles commandes entrantes tant que la commande en cours n’a pas terminé son exécution. Par exemple, le traitement de la commande « 0X1″ (exécuter immédiatement le contenu du slot 1) doit effectuer les commandes du slot 1 avant d’accepter une nouvelle commande entrante.

Exemple de stockage d’une commande (double ping) dans le slot 1 suivi de son exécution

> 1PP
< 1
> 0X1
< 0
< P
< P

Exemple de stockage et d’exécutions multiples

> 1X2X2
< 1
> 2PP
< 2
> 0PX1X2
< 0
< P
< P
< P
< P
< P
< P
< P

Upper LCD line

Cette commande permet d’afficher un message sur la ligne supérieure du LCD. Si le message contient 16 caractères ou moins, le message doit être simplement affiché en l’alignant à gauche. Si le message contient plus de 16 caractères, il doit défiler continuement en tâche de fond jusqu’à ce qu’un nouvel affichage sur cette ligne ait lieu lors de l’exécution d’une nouvelle commande du même type.

La commande est constituée du caractère ‘U’, de la longueur du message en hexadécimal puis des caractères individuels à afficher. L’exécution de cette commande ne renvoie rien.

Exemple d’affichage du mot « PING » sur la ligne supérieure et de la réponse à un Ping

> 0U04PINGP
< 0
< P

Lower LCD line

La commande ‘D’ est à traiter comme la commande ‘U’ à la différence qu’elle affiche le message sur la ligne inférieure de l’écran LCD.

Exemple d’affichage du message « Hello world » sur les deux lignes

> 0U05HelloD05world
< 0

Switch

La commande Switch est constituée de l’unique caractère ‘S’. Son exécution doit, dans l’ordre :

  1. attendre que les deux boutons soit relâchés ;
  2. envoyer, selon le bouton pressé, respectivement ‘L’ pour le bouton de gauche (left) ou ‘R’ pour le bouton de droite.

Exemple d’appui sur le bouton gauche puis le bouton droit

> 0U0EPresser gaucheD0Apuis droitSS
< 0
< L
< R

Analog sensor

La commande Analog est constituée de l’unique caractère ‘A’. Son exécution renvoie la valeur, en hexadécimal, du potentiomètre tel que lu sur 12 bits sur le convertisseur analogique-numérique. Cette valeur sera comprise entre 0 et FFF.

Afin de pallier les problèmes liés aux légères variations du convertisseur analogique-numérique dans les poids faibles de la valeur retournée, il est permis (et conseillé) de lisser la valeur retenue en procédant ainsi : si la valeur est éloignée de moins de 50 (décimal) de la valeur précédemment lue, cette valeur précédente peut être conservée. Par exemple, si la valeur « 7F8″ (hexadécimal) a été précédemment utilisée, elle peut être retournée tant que la valeur lue dans le convertisseur est comprise entre « 7C6″ (hexadécimal) et « 82A » (hexadécimal).

Exemple de lecture du capteur analogique positionné approximativement à mi-course

> 0A
< 0
< 7F8

Connect analog sensor to stored commands

Cette commande permet d’exécuter, en tâche de fond, la valeur lue sur le convertisseur analogique-numérique à des commandes préalablement stockée. La plage de sensibilité du capteur (entre « 0″ et « FFF ») doit être divisée en zones de taille égale et ordonnées, et la commande correspondante doit être exécutée.

La commande est constituée du caractère ‘C’ suivi d’une valeur hexadécimale indiquant le nombre de zones à utiliser, puis la liste ordonnée des slots correspondant à ces zones. Un nombre de zones égal à « 00″ désactive cette fonctionalité. La commande ne renvoie rien.

Cette commande doit alors s’exécuter en tâche de fond. Vous avez la garantie que le serveur n’enverra pas de commandes perturbant l’exécution de cette commande avant d’avoir stoppé son exécution.

Si vous avez opté pour la procédure de lissage conseillée pour l’implémentation de la commande ‘A’, vous devez également utiliser ce lissage pour l’implémentation de cette commande.

Exemples de séparation en trois zones (rouge, vert, bleu)

> RLFF0000
< R
> GL00FF00
< G
> BL0000FF
< B
> 0C03RGB
< 0

Rendu du code

Le code du challenge devra se trouver dans un répertoire appelé « challenge2011″ dans la branche « master » de votre dépôt personnel. Il ne doit y avoir qu’un seul répertoire portant ce nom, et il peut se trouver où vous le souhaitez dans l’arborescence de votre dépôt.

3 comments to Communication challenge 2011