Les Buzzers

Spécification

  • Fichier de contrôle : /dev/hidrawX (X étant un chiffre … surement 2 ici)
  • Lecture: 8 octets (littleendian).
    • 36 - 63: inutilisé
    • 31 - 35: Joueur 4
    • 26 - 30: Joueur 3
    • 21 - 25: Joueur 2
    • 16 - 20: Joueur 1
    • 15 - 0 : inutilisé
  • Ecriture: 8 octets (littleendian)
    • 48 - 63 : 0
    • 40 - 47 : lampe joueur 4
    • 32 - 39 : lampe joueur 3
    • 24 - 31 : lampe joueur 2
    • 16 - 23 : lampe joueur 1
    • 15 - 0 : 0

Préparation

Récupérez l’archive buzzer.tar.gz et décompressez la … le tout en une seule ligne de commande (pour la comprendre : explainshell.com).

wget www.labri.fr/~fmoranda/dist/if-112/buzzer.tar.gz -O- | tar xvzf -

Remarque: le Makefile fournis est relativement simple mais efficace. En changent les premières lignes, il s’adaptera facilement à vos futurs besoins.

A partir de maintenant nous considérons que vous travaillez dans le répertoire de l’archive décompressé.

Testez vos buzzer

Cherchez le nom du fichier de contrôle sur votre machine. Essayez ls /dev/hidraw* ou lsusb (Il s’agit probablement du 2 mais sait on jamais)

cat /dev/hidraw2
## Ou mieux
hexdump /dev/hidraw2

TP proprement dit

Maintenant les choses sérieuses commencent … Le programme principal se nomme game. Nous vous proposons la structure de programme suivante :

game.c
Le programme principal.
buzzer.h buzzer.c
Les parties relatives a la gestion de buzzers (parties i/o)
bits.h bits.c
Manipulations de bits (e.g. une implémentation minimale d’un bitset)
fake.c
Fabrique un fichier qui ressemble à des buzzers

Note sur la méthodologie : On écrit du code pour tester le comportement du buzzer directement dans le main. Lorseque l’on est satisfait du resultat, on relit le code et on cherche à le remplacer par une fonction qui fait ce meme travail.

  • Ouvrir le périphérique / fermer le périphérique (on oublie pas de faire les vérifications d’usage).
  • Lire 8 caractères et afficher le nombre de caractères lu (on ne s’intéresse pas encore au contenu). Faire le tout dans la boucle proposée.
  • La partie relative à l’ouverture du périphérique (fopen + setbuf) mérite une fonction dédié (open_buzzer qui ira dans buzzer.c). Doit elle faire des vérifications particulière. Qui affiche l’avertissement et quitte le programme en cas de problème ?

    La fermeture du périphérique ne mérite pas une fonction (on ne peut pas vraiment faire mieux que juste fclose). Par contre comme nous sommes en présence d’un fichier de taille infini, nous disposons d’une boucle sans fin. Pourquoi la garde t on ? On rajoute une fonction pour tout fermer lors de l’intéruption du programme (CTRL+c).

  • A partir de maintenant, on s’intéresse aux données lues. Affichez chaque caractère en hexadécimal suivit d’un espace. Bien tester tous les boutons un par un (oui y’en a 20, c’est long … mais nécessaire). Que constate t on ? Remédiez y.
  • On veut remplacer la boucle de printf par un seul appel. On pourra stocker les 8 octets dans un nombre. Quel est son type ? L’afficher avec %llx (et print_bits si vous l’avez).
  • Écrire la fonction read_status(). Pour ce faire extrayiez le code relatif à seulement la lecture du nombre. Pourquoi cette fonction a cette signature ?
  • Sur le même principe, essayez de faire alumer une loupiotte … puis les 4.
  • Écrire la fonction write_status() en extrayant le code de votre main.
  • La tester : allumer toutes diodes, les éteindre, 3 fois avec une pause (sleep, usleep, nanosleep) … Réfléchir … Oh la belle fonction.
  • Écrire la fonction print_status(), en profiter pour faire celles qui retournent le bit set de ceux qui ont joués (le bit 2^0 a 1 si le premier joueur a joué, le bit2^1 pour le second, …).
  • Complètez les fonctions de bit.h
  • Faites vous votre propre méga-quizz

… fin provisoire