Escuchando el Cambio de Valores

Un caso de uso común para NetworkTables es cuando un programa en la Driver Station genera valores que deben ser enviados al robot. Por ejemplo, imagine que un código de procesamiento de imágenes que se ejecuta en la Driver Station calcula el rumbo y la distancia a un objetivo y envía esos valores al robot. En este caso, puede ser deseable que el programa del robot sea notificado cuando lleguen nuevos valores desde la Driver Station. NetworkTables proporciona facilidades para hacerlo.

Usar EntryListener de NetworkTable

Uno de los casos más comunes para NetworkTables es esperar que un valor cambie en el robot. Esto se llama un EntryListener porque notifica al programa del robot cuando una entrada de NetworkTables (valor individual) cambia. El siguiente código muestra cómo hacer esto.

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 datatable = inst.getTable("datatable");

      //get a reference to key in "datatable" called "Y"
      NetworkTableEntry yEntry = datatable.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
      datatable.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: " + event.getEntry().getValue());
      }, EntryListenerFlags.kNew | EntryListenerFlags.kUpdate);

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