Menu

Entrées / sorties


Introduction

Le robot utilise une ceinture de contacteurs , un inter pour l'arret d'urgence, un autre pour savoir si le robot a redémarré en match et un jack pour le départ qui sont connectés sur la carte E/S du PC104 (aussi appelée Dridaq). Les autres capteurs et actionneurs sont interfacés avec des microcontrolleurs Atmels qui communiquent avec le PC par liaison série.


IoManager

La classe IoManager supervise l'ensemble de ces capteurs et en particulier leur initialisation.
Elle crée un UartManager qui gère les cartes sur port série, une instance de DridaqDirect qui gère les boutons et interrupteurs. Enfin la classe crée un thread qui est en attente de message sur une liste de file descriptors enregistré par des application tiers. Quand un octet est disponible, le callback enregistré en même temps que le file descriptor, est appelé. En fait ce sont les composants qui utilisent un UartBuffer, c'est à dire les cartes qui communiquent sur liaison série sans attendre de question du PC, qui s'enregistrent sur ce thread. Ainsi un de leur callback (UartBuffer::fileDescriptorTask) est appelé par le thread dès qu'un octet est disponible sur leur port UART.


DridaqDirect

Pour gérer les capteurs sur la carte E/S, la classe DridaqDirect enregistre une tache périodique sur le thread de RobotTimer. Ainsi régulièrement la tache périodique compare la nouvelle valeur des entrées aux précédentes et si certains bits ont changés, ceux correspondant à des boutons qui se sont enregistrés sur la classe, les callback des boutons correspondant sont appelés.
Le risque est de manquer un changement d'état, mais vu le type de boutons qui sont connectés (les capteurs restent au moins 0.5s dans un état), ce système permet surtout de filtrer du bruit et des rebonds de capteurs.

Uart / UartBuffer

Les classes Uart et UartBuffer servent à communiquer sur un port série.
La classe Uart sert pour les cartes qui ne font que répondre à des requettes du PC. L'écriture et la lecture se font directement sur la carte.
La classe UartBuffer sert pour la communication avec des cartes qui peuvent parler "toutes seules". A chaque octet recu, un callback enregistré sur uartBuffer (UartBuffer::registerFilterFunction) est appelé pour savoir si l'octet doit être renvoyé par uartBuffer::read ou si il a déjà été traité. La lecture sur cette uart se fait donc de manière indirecte en lisant dans un buffer ou certains octect ont été filtré. En général les octects correspondant à une requète du PC ne sont pas filtré et ceux correspondant à un octet envoyé pour prévenir le PC d'un évènement sont filtré. Le plus souvent, on filtre les octets en regardant leur bit de poids fort (1=réponse à une requète du PC, 0=octet filtré). Voir src/io/catapult/catapult_04.cpp.


UartManager

Au moment de sa création il crée des instances de Uart et UartBuffer correspondant à chaque carte possible (UartId).
Puis il scanne les ports pour trouver quels sont les cartes connectées (les cartes peuvent être connectées dans n'importe quel ordre). Pour les 8 ports de la carte Uart et les 2 ports série classiques, il ouvre une Uart classique, envoie la requète de Ping (0xAA), attend une réponse (correspondant à l'ID de la carte) pendant 30ms et ferme la connection.
Enfin il alloue les instance des controleurs des cartes qui ont été trouvées (Odometer_04, Lcd_04,...) et des instances simulées des cartes non trouvées.