class cFixedWaypoint
 float GetLeftSpeed();
 float GetRightSpeed();
 cPos GetPos();
 float GetTheta();
Des classes spécialisées peuvent hériter de cWaypoint, pour définir par exemple des Waypoint de recallage sur bordure, d'attrapage de balle ou encore de dépose de balle. Ceci permet d'ajuster plus précisément la position du robot : pour déposer une balle dans un trou, il faut aligner l'éjecteur de balle avec le trou (et non pas le centre du robot).
 class cEdgeFrontAdjustement : public cWaypoint; //(priorité : **)
 class cEdgeBackAdjustement : public cWaypoint; //(priorité : **)
 class cBallPickup : public cWaypoint; //(priorité : ***)
 class cBallPickupAgainstBorder : public cWaypoint; //(priorité : **)
 class cBallDropping : public cWaypoint; //(priorité : ***)
 class cBallAspiration : public cWaypoint; //(priorité : *)
 class cTotemTriggering : public cWaypoint; //(priorité : *)
Synthèse.
Cette couche permet de regrouper les informations par catégorie sans distinctions de leur source (Vidéo ou HAL). Par exemple, on peut contrôler et connaître l'état d'un capteur par la même interface même si l'état est connu par le biais de la vidéo et que le contrôle se fait par la HAL.
Positionnement.
Le module de positionnement synthétise toutes les informations relatives aux positions des éléments du jeu (balles, robots, totems, éléments du terrain), il peut aussi donner l'incertitude sur ces valeurs. L'intérêt est notamment de faire la synthèse des informations redondantes (particulièrement pour la position du robot : odométrie, caméra, balise).
 (priorité globale : ***)
 struct sBall
 enum color;
 pos; delta;
 trustyness;
 bool isInHole;
 struct sOppBot
 pos; delta;
 trustyness;
 struct sRobot
 pos; delta;
 angle; delta;
 vitesse;
 struct sTotem
 id;
 bool Triggered;
 enum side;
 pos;
 struct sHole
 id;
 enum side;
 pos;
 enum filled;
 vector<sBall> GetKnownWhiteBall(); //(priorité : ***)
 vector<sBall> GetKnownBlackBall(); //(priorité : *)
 vector<sTotem> GetKnownTotem(); //(priorité : *)
 sOppBot GetOpponentBot(); //(priorité : *)
 sRobot GetRobot(); //(priorité : ***)
 sHole[28] GetHole(); //(priorité : ***)
 //fonctions de retour d'infos IA -> Positionnement
 void SetTeamColor(enum); //(priorité : ***)
 void SetPosRobotX(); //(priorité : ***)
 void SetPosRobotY(); //(priorité : ***)
 void SetWhiteBallInHole(id); //(priorité : **)
 void SetBlackBallInHole(id); //(priorité : *)
 void SetTotemTriggered(id); //(priorité : *)
Automatisme.
Le module d'automatisme gère les différents actionneurs et capteurs (comme la tirette de démarrage). Il permet donc de connaître l'état des actionneurs et de les contrôler assez facilement. On peut par exemple savoir la couleur de la balle actuellement dans le système d'éjection (vidéo) et commander son éjection (HAL).
 (priorité globale : ***)
La définition des interfaces du driver HAL générique dépasse le cadre de ce document, voir la doc spécifique.
 void ActivateRoller(bool); 
 void ActivateFan(bool);
 void ActivateRollerDuring(int ms);
 void ActivateFanDuring(int ms);
 void EjectBall(enum); 
 void DropBall(enum); 
 enum GetBallColor(enum); 
 enum GetIHMTeamSwitch();
 int GetIHMStratSwitch();
 void StopAll();
 CommandeAsservBasNiveau...
 (Vitesse moteur + distance à parcourir) pour chaque roue.
 [IT] CollisionDetected();
 [IT] NewBallInEjector();
 [IT] ActivateIA();
 [IT] Starter();
Drivers (spécifiques et génériques).
La couche de drivers spécifiques dépend entièrement de la mécanique du robot utilisé et du règlement du jeu. Son interface explicite donc les noms des divers éléments. Cette couche est directement relié à la couche de drivers génériques, elle effectue une simple traduction. La couche générique est plus universelle et devrait pouvoir être réutilisée pour plusieurs règlement/application.
Vidéo et vidéo lib.
Le module de vidéo utilise la librairie vidéo afin de détecter les éléments du jeu. La librairie vidéo est quant à elle beaucoup plus générique et devrait pouvoir être réutilisée telle quelle d'année en année.
La définition des interfaces du driver vidéo générique dépasse le cadre de ce document, voir la doc spécifique.
 vector<sBall> GetExternalBall(); - Priorité : ***
 vector<sBall> GetInternalBall(); - Priorité : *
 sRobot GetRobotPos(); - Priorité : **
 vector<sTotem> GetTotem(); - Priorité : **
 enum GuessTeam(); - Priorité : ½*
HAL (Hardware Abstraction Layer) et Driver Elek.
De la même façon que la vidéo, l'HAL fournit une implémentation spécifique du driver elek. L'HAL fournit donc une interface explicitant le nom des actionneurs, tandis que le driver elek reste totalement générique et ne dépend que de l'électronique utilisée.
 (priorité globale : ***)
[A définir plus précisément avec la méca et l'asservissement]
 Pos GetOdometriePos(); 
 angle-time GetGonioTick();
 + Idem Automatisme
Simulateur.
Le simulateur permet de coder les modules haut niveau (au dessus de la couche de HAL) sans avoir implémenté les couches inférieures. Dans notre cas, le simulateur va nous aider à coder :
L'interface possède donc deux niveaux (mutuellement exclusive, on utilise qu'une des deux):
 sRobot GetRobot(); //infos diverses sur l'etat du robot (cf struct sRobot)
 cEvent Starter(); //tirette de demarrage
 //Commande Asserv
 PushCmd(v1,v2, d1,d2); //Envoie une commande a l'asservissement
 ClearCmd(); //Efface les commandes courantes de l'asservissement
 //+Eventuellement les fonctions de positionnement des autres objets:
 vector<sBall> GetKnownWhiteBall();
 vector<sBall> GetKnownBlackBall();
 vector<sTotem>GetKnownTotem();
 sOppBot GetOpponentBot();
 sHole[28] GetHole();
 //Vidéo :
 vector<sBall> GetExternalBall();
 sRobot GetRobotPos(); //camera
 //Elek :
 sRobot GetRobotPos(); //odometrie
 cEvent CollisionDetected();
À ces deux niveaux d'interfaces, vient se rajouter le module de constantes.
Le simulateur doit aussi être configurable, on doit pouvoir notamment régler les erreurs/incertitudes sur les capteurs, un decallage entre la commande et la mise en action (simulation de la latence de la transmission usb), ...