/dev/hidrawX
(X étant un chiffre … surement 2 ici)littleendian
).
littleendian
)
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é.
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
Maintenant les choses sérieuses commencent …
Le programme principal se nomme game
.
Nous vous proposons la structure de programme suivante :
game.c
buzzer.h
buzzer.c
bits.h
bits.c
fake.c
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.
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
).
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).read_status()
. Pour ce faire extrayiez le code relatif
à seulement la lecture du nombre. Pourquoi cette fonction a cette signature ?write_status()
en extrayant le code de votre main.sleep
, usleep
, nanosleep
) … Réfléchir … Oh la belle 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, …).bit.h
… fin provisoire