Communiquer avec le robot
=========================
Une des notions que nous n'avons pas encore abordée et la communication entre
le robot et l'ordinateur du pilote. Afficher des messages ou des valeurs
numériques peut en effet être très utile tant pour faire des tests qu'en
compétition.
Cout et Printf()
----------------
La première méthode à notre disposition est d'utiliser l'affichage console
classique du C++ (``cout`` et ``printf()``). Le flux de sortie du robot est
en effet redirigé sur le réseau. On peut le lire directement sur la Driver
Station.
.. image:: img/DsOutput.jpg
On peut aussi lire le flux de sortie du robot avec le RioLog. On peut lancer
le RioLog dans VS Code en entrant ``riolog`` dans la palette de commandes
(Ctrl + Shift + P) puis en sélectionnant ``WpiLib: Start RioLog``.
.. image:: img/RioLog.jpg
SmartDashboard
--------------
Afficher des informations avec ``cout`` pose un problème : si on affiche
régulièrement plusieurs messages, il peut devenir très compliqué de suivre
le défilement de ceux-ci. Pour cela, une alternative existe : c'est
`le SmartDashboard `__.
Pour l'ouvrir dans VS Code : Ctrl + Shift + P puis ``Start Tool`` et
sélectionner ``SmartDashboard``.
Pour utiliser le SmartDashboard, il n'y a pas besoin de déclarer une instance
de la classe `SmartDashboard `__.
On peut appeler les méthodes de celle-ci avec l'opérateur de résolution de
portée ``::``. Pour afficher des données sur le SmartDashboard, il faut
fournir 2 choses : une **key** qui identifie la donnée et sa **valeur**. Il
existe plusieurs fonctions selon le type de donnée à afficher (texte, nombre
ou booléen) :
.. code-block:: c++
#include
frc::SmartDashboard::PutString("2020 Game","WaterGame");
frc::SmartDashboard::PutNumber("Best Team", 5553);
frc::SmartDashboard::PutBoolean("148+254=5553", false);
La fonction ``PutNumber`` attend comme argument un ``double``. Ici, le int
``5553`` sera converti en un double.
Du côté du pilote, on peut lire les valeurs sur le SmartDashboard et on peut
aussi les modifier. On peut alors récupérer ces valeurs avec les fonctions
`GetString `__,
`GetNumber `__ et
`GetBoolean `__.
Il faut alors donner en argument la **key** de la donnée et une valeur qui
sera renvoyée si la donnée n'existe pas.
Le pilote peut aussi `modifier le widget `__
qui affiche une donnée et ses propriétés.
NetworkTables
-------------
Pour assurer la communication entre le robot et l'ordinateur, le
SmartDashboard utilise en fait un protocole de communication créé par WpiLib :
les `NetworkTables `__.
Pour le voir, il suffit d'ouvrir l'OutlineViewer : Ctrl + Shift + P puis
``Start Tool`` puis ``OutlineViewer``.
L'OutlineViewer permet de lire toutes les données transférées via les
NetworkTables. On voit ainsi apparaître un "dossier" (une Table) nommé
``/SmartDashboard`` dans lequel on retrouve toutes les données (key + valeur)
créées. Chaque Table est identifiable par une chaîne de caractères. Elle peut
posséder plusieurs données (key + valeur) qui peuvent être, comme pour le
SmartDashboard, des ``string``, des ``double`` ou des ``bool``.
Pour accéder à ces données, on peut passer par la classe
`NetworkTable `__.
Premièrement, il faut créer et récupérer une l'instance de la classe
NetworkTable grâce au nom de la Table :
.. code-block:: c++
#include
auto table = NetworkTable::GetTable("datatable");
.. note::
Le mot clé ``auto`` remplace la déclaration du type d'une variable ou d'un
objet. Le type est automatiquement déduit. Par exemple, ici, la variable
``x`` sera automatiquement un ``int`` :
.. code-block:: c++
int i = 5553;
auto x = i;
Ensuite, on peut utiliser la NetworkTable (son pointeur en fait) comme avec le
SmartDashboard :
.. code-block:: c++
table->PutNumber("PositionPivot", encodeur.GetDistance());
table->PutBoolean("Pince ouverte", isPinceOuverte);
table->PutString("Alliance", "Rouge");
Les Tables sont automatiquement synchronisées à intervalles réguliers. Mais
pour plus de performances, il existe une fonction qui synchronise immédiatement
tous les changements effectués sur les NetworkTables quand on l'appelle :
.. code-block:: c++
nt::NetworkTable::Flush();
ShuffleBoard
------------
Le Shuffleboard est une version améliorée du SmartDashboard et il fonctionne
de la même manière que ce dernier. Il possède une interface et des widgets
plus plaisant et peut avoir plusieurs fenêtres (ou tabs).
Sa principale utilité vis-à-vis du SmartDashboard est que l'on peut configurer
dans le code du robot la disposition des widgets et par example changer de
fenêtre avec le Joystick. Pour découvrir toutes ses fonctionnalités : voici
`la documentation `__.