À l’écoute des changements de valeur

Un cas d’utilisation courant pour les NetworkTables est lorsqu’un programme sur la Driver Station génère des valeurs qui doivent être envoyées au robot. Par exemple, imaginez qu’un code de traitement d’image exécuté sur la station de conduite calcule le cap et la distance jusqu’à un objectif et envoie ces valeurs au robot. Dans ce cas, il peut être souhaitable que le programme du robot soit averti lorsque de nouvelles valeurs arrivent de la station pilote. NetworkTables fournit des installations pour cela.

Utilisation d’un NetworkTable EntryListener

L’un des cas les plus courants de NetworkTables est l’attente d’une valeur à changer sur le robot. C’est ce qu’on appelle un EntryListener car il notifie le programme du robot lorsqu’une entrée NetworkTables (valeur unique) change. Le code suivant montre comment procéder.

package networktablesdesktopclient;

import edu.wpi.first.networktables.EntryListenerFlags;
import edu.wpi.first.networktables.NetworkTable;
import edu.wpi.first.networktables.NetworkTableEntry;
import edu.wpi.first.networktables.NetworkTableInstance;

public class TableEntryListenerExample {

   public static void main(String[] args) {
      new TableEntryListenerExample().run();
   }

   public void run() {
      //get the default instance of NetworkTables
      NetworkTableInstance inst = NetworkTableInstance.getDefault();

      //get a reference to the subtable called "datatable"
      NetworkTable table = inst.getTable("datatable");

      //get a reference to key in "datatable" called "Y"
      NetworkTableEntry yEntry = table.getEntry("Y");
      inst.startClientTeam(190);

      //add an entry listener for changed values of "X", the lambda ("->" operator)
      //defines the code that should run when "X" changes
      table.addEntryListener("X", (table, key, entry, value, flags) -> {
         System.out.println("X changed value: " + value.getValue());
      }, EntryListenerFlags.kNew | EntryListenerFlags.kUpdate);

      //add an entry listener for changed values of "Y", the lambda ("->" operator)
      //defines the code that should run when "Y" changes
      yEntry.addListener(event -> {
         System.out.println("Y changed value: " + value.getValue());
      }, EntryListenerFlags.kNew | EntryListenerFlags.kUpdate);

      try {
         Thread.sleep(10000);
      } catch (InterruptedException ex) {
         System.out.println("Interrupted");
         Thread.currentThread().interrupt();
         return;
      }
   }
}