public void initTable(ITable table) {
   if (this.table != null) {
     this.table.removeTableListener(listener);
   }
   this.table = table;
   if (table != null) {
     table.putNumber("p", gains.getP());
     table.putNumber("i", gains.getI());
     table.putNumber("d", gains.getD());
     table.putNumber("f", gains.getF());
     table.putNumber("goal", goal);
     table.putNumber("source", source.get());
     table.putBoolean("enabled", isEnabled());
     table.addTableListener(listener, false);
   }
 }
 public void update() {
   lastSource = source.get();
   double out = 0;
   double error = goal - lastSource;
   double p = gains.getP() * error;
   if (Math.abs(error) < minIError) errorSum += error;
   double i = gains.getI() * errorSum;
   double dError = error - lastError;
   double d = gains.getD() * dError;
   lastError = error;
   double ff = gains.getF() * goal;
   if (enabled) {
     out = ff + p + i + d;
     output.set(out);
     lastOut = out;
   }
   lastDeltaError = dError;
   SmartDashboard.putData(this);
   System.out.println(enabled + " " + error + " " + out);
 }
 public void valueChanged(ITable table, String key, Object value, boolean isNew) {
   if (key.equals("p") || key.equals("i") || key.equals("d") || key.equals("f")) {
     if (gains.getP() != table.getNumber("p", 0.0)
         || gains.getI() != table.getNumber("i", 0.0)
         || gains.getD() != table.getNumber("d", 0.0)) {
       System.out.println("Got new PID gains!");
       gains.set(
           table.getNumber("p", 0.0), table.getNumber("i", 0.0), table.getNumber("d", 0.0));
     }
   } else if (key.equals("setpoint")) {
     if (goal != ((Double) value).doubleValue()) {
       setGoal(((Double) value).doubleValue());
     }
   } else if (key.equals("enabled")) {
     if (isEnabled() != ((Boolean) value).booleanValue()) {
       if (((Boolean) value).booleanValue()) {
         enable();
       } else {
         disable();
       }
     }
   }
 }