wiki:ClasseGenerique

INTÉGRATION DES PÉRIPHÉRIQUES


Utilisation de la classe PeripheriqueInterface

Description

PeripheriqueInterface est une classe abstraite qui sert à faire le lien entre la bibliothèque, et plus particulièrement la classe Peripherique, et les drivers des périphériques passifs. Les périphériques passifs sont ceux qui ne fonctionnent pas avec des évènements, c'est-à-dire qu'il faut aller lire dans le périphériques lui-même pour pouvoir récupérer ses valeurs.

Diagramme UML du Peripheriqueinterface


Le TrackIR

La classe ProxyPeripherique

Cette classe hérite de la classe PeripheriqueInterface qui sert d'interface pour que la bibliothèque sache comment demander la lecture des différentes valeurs voulues. Elle implémente les méthodes readAxis() et readButton(). Cette classe est un client d'un socket qui se connecte à un serveur en connaissant un port et une adresse IP. Le client peut fonctionner sous linux comme sous Windows et il faut rajouter pour Linux -D__LINUX__ dans la ligne de compilation du configure :

CCFLAGS="`${ARCONFIG} --cflags --debug` -D__LINUX__  -I${INCDIR} -I. -I${AREVIINTERACTOR_INCDIR}  -I${TRACKIR_INCDIR}"

Elle effectue ses requêtes au serveur en utilisant les méthodes readAxis() et readButton(). Attention, quand on utilise une machine virtuelle le client croit qu'il se connecte toujours au serveur car on a remappé les ports, mais si le serveur n'est pas lancée rien ne nous le dit à part qu'il n'affiche rien.
On pourrai la réutiliser pour le Phantom Omni ou d'autres périphériques qui marchent sous Windows.

La classe TrackIRServeur

Cette classe est le serveur Windows du trackIR. Il initialise et démarre le trackIR puis lance le serveur de la socket qui va ecouter le port demander. Quand un client ce connecte,il l'accepte et lance la méthode read() qui écoute les requêtes du client puis lit les données demandées à l'aide de la methode readAxis() et enfin il revoie les valeurs au client. Le client et le serveur discute ainsi tant que le client ne quitte pas la socket en envoyant comme message "closesocket". Quand le client quitte la socket, le serveur se remet à écouter le port dans l'attente d'un nouveaux client. Pour arrêter le serveur et le trackIR, il faut lui envoyer un message "closeserveur". Voici un schéma résumant le fonctionnement du serveur :



La Wiimote

Diagramme UML de la représentation de la Wiimote

La classe Wiimote hérite de la classe PeripheriqueInterface, elle implémente donc les méthodes readAxis() et readButton(). Ces deux méthodes sont appelées par les Actuator d'un Peripherique dans la bibliothèque. Par exemple si l'Actuator est un Axis alors dans sa méthode update() il va appeler la méthode readAxis() du PeripheriqueInterface correspondant au Peripherique auquel il appartient.

Le paramètre _wiimote, qui est du type wiimote_t et qui correspond à la représentation de la Wiimote dans le driver. Lorsque l'une des méthodes readAxis() ou readButton() est appelée, il y a une mise à jour de _wiimote. Pour récupérer la valeur d'un axe et d'un bouton, on va dans _wiimote lire le paramètre recherché.

La Wiimote a plusieurs de mode de fonctionnement : le mode infrarouge et le mode accéléromètre. Par défaut ces deux modes sont activés, mais ils peuvent être changés grâce aux méthodes setIRMode() et setAccMode(). La Wiimote fonctionne aussi avec un Nunchuk, pour cela il suffit de brancher celui lorque la simulation est en marche. On peut le brancher/débrancher à notre guise pendant la simulation. Mais attention, celui-ci ne fonctionne pas s'il est branché avant que la simulation est débuté, il faut alors le débrancher puis le rebrancher pour le rendre fonctionnel.

Pour utiliser la Wiimote il nous faut la librairie libcwiimote, il faut donc l'ajouter dans vos configurations :

 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/Dev/trunk/AReViInteractor/ext/WiimoteDriver/lib

Le P5Glove

Diagramme UML de la représentation du P5Glove

La classe Wiimote hérite de la classe PeripheriqueInterface, elle implémente donc les méthodes readAxis() et readButton(). Ces deux méthodes sont appelées par les Actuator d'un Peripherique dans la bibliothèque. Par exemple si l'Actuator est un Axis alors dans sa méthode update() il va appeler la méthode readAxis() du PeripheriqueInterface correspondant au Peripherique auquel il appartient.

Le paramètre shm_data, qui est du type P5SharedMem* et qui correspond à la représentation d'un P5Glove dans le driver. shm_data contient un paramètre p, qui est du type P5Data, et qui contient toutes les valeurs des axes et boutons du P5Glove. Lorsque l'une des méthodes readAxis() ou readButton() est appelée, il y a une mise à jour de shm_data. Pour récupérer la valeur d'un axe et d'un bouton, on va dans shm_data, puis dans p lire le paramètre recherché.

Pour que le gant fonctionne il faut d'abord lancé le serveur, puisque l'application est le client. Ce serveur se lance grâce au script testP5.sh, qui vérifie que celui-ci n'est pas déjà lancé et si ce n'est pas le cas alors il le lance. Le fait de lancer plusieurs fois le serveur fait que celui-ci ne peut plus être arrêté et il faut alors redémarrer la machine.



Utilisation des évènements du peripherique

La Spacemouse

Diagramme UML de la représentation de la Spacemouse

La Spacemouse est un périphérique fonctionnant avec des évènements. En effet, lors du changement de valeur de l'un de ses paramètres, que ce soit un axe ou un bouton, elle crée un évènement.

Si nous avions utilisé la classe PeripheriqueInterface comme pour les autres périphériques, nous aurions dû créer une classe SpacemouseVirtuelle, qui aurait utilisé les évènements envoyés par la Spacemouse pour récupérer les valeurs des axes et boutons. Cette classe aurait ensuite été utilisé par la classe Peripherique de la bibliothèque afin de créer des évènements du type Event.

Nous avons donc décidé de faire au plus simple en n'utilisant pas la classe PeripheriqueInterface, mais en créant une classe Spacemouse héritant directement de la classe Peripherique de la bibliothèque. Cela nous a permis d'utiliser les évènement de ce périphérique pour créer directement les Event de la bibliothèque.


Retour au Wiki

Attachments