Update LiveWindow to provide continuous telemetry. (#771)

LiveWindow.updateValues() is now called from IterativeRobotBase on every
loop iteration.  Telemetry for all WPILib classes is enabled by default;
it can be disabled for specific classes using LiveWindow.disableTelemetry(),
or all telemetry can be disabled using LiveWindow.disableAllTelemetry().

This necessitated changing the hook methodology into other classes to
be more property-based rather than each class providing multiple functions.
This had the benefit of reducing boilerplate and increasing consistency.

- Remove NamedSendable, add name to Sendable.

- Provide SendableBase abstract class.

- Deprecate LiveWindow addSensor/addActuator interfaces.

- Add LiveWindow support to drive classes.

- Add addChild() helper functions to Subsystem.

- Fix inheritance hierarchy.  Now only sensors inherit from SensorBase.
  Other devices inherit from some combination of SendableBase, ErrorBase, or
  nothing.
This commit is contained in:
Peter Johnson
2017-12-04 23:28:33 -08:00
committed by GitHub
parent 3befc7015b
commit f9bece2ffb
213 changed files with 3704 additions and 3758 deletions

View File

@@ -10,7 +10,6 @@ package edu.wpi.first.wpilibj.examples.gearsbot;
import edu.wpi.first.wpilibj.IterativeRobot;
import edu.wpi.first.wpilibj.command.Command;
import edu.wpi.first.wpilibj.command.Scheduler;
import edu.wpi.first.wpilibj.livewindow.LiveWindow;
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
import edu.wpi.first.wpilibj.examples.gearsbot.commands.Autonomous;
@@ -96,7 +95,6 @@ public class Robot extends IterativeRobot {
*/
@Override
public void testPeriodic() {
LiveWindow.run();
}
/**

View File

@@ -8,10 +8,8 @@
package edu.wpi.first.wpilibj.examples.gearsbot.subsystems;
import edu.wpi.first.wpilibj.DigitalInput;
import edu.wpi.first.wpilibj.SpeedController;
import edu.wpi.first.wpilibj.Victor;
import edu.wpi.first.wpilibj.command.Subsystem;
import edu.wpi.first.wpilibj.livewindow.LiveWindow;
/**
* The claw subsystem is a simple system with a motor for opening and closing.
@@ -20,15 +18,15 @@ import edu.wpi.first.wpilibj.livewindow.LiveWindow;
*/
public class Claw extends Subsystem {
private SpeedController m_motor = new Victor(7);
private Victor m_motor = new Victor(7);
private DigitalInput m_contact = new DigitalInput(5);
public Claw() {
super();
// Let's show everything on the LiveWindow
LiveWindow.addActuator("Claw", "Motor", (Victor) m_motor);
LiveWindow.addActuator("Claw", "Limit Switch", m_contact);
// Let's name everything on the LiveWindow
addChild("Motor", m_motor);
addChild("Limit Switch", m_contact);
}
@Override

View File

@@ -18,7 +18,6 @@ import edu.wpi.first.wpilibj.command.Subsystem;
import edu.wpi.first.wpilibj.drive.DifferentialDrive;
import edu.wpi.first.wpilibj.examples.gearsbot.Robot;
import edu.wpi.first.wpilibj.examples.gearsbot.commands.TankDriveWithJoystick;
import edu.wpi.first.wpilibj.livewindow.LiveWindow;
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
/**
@@ -58,11 +57,12 @@ public class DriveTrain extends Subsystem {
m_rightEncoder.setDistancePerPulse((4.0 / 12.0 * Math.PI) / 360.0);
}
// Let's show the sensors on the LiveWindow
LiveWindow.addSensor("Drive Train", "Left Encoder", m_leftEncoder);
LiveWindow.addSensor("Drive Train", "Right Encoder", m_rightEncoder);
LiveWindow.addSensor("Drive Train", "Rangefinder", m_rangefinder);
LiveWindow.addSensor("Drive Train", "Gyro", m_gyro);
// Let's name the sensors on the LiveWindow
addChild("Drive", m_drive);
addChild("Left Encoder", m_leftEncoder);
addChild("Right Encoder", m_rightEncoder);
addChild("Rangefinder", m_rangefinder);
addChild("Gyro", m_gyro);
}
/**

View File

@@ -8,12 +8,9 @@
package edu.wpi.first.wpilibj.examples.gearsbot.subsystems;
import edu.wpi.first.wpilibj.AnalogPotentiometer;
import edu.wpi.first.wpilibj.SpeedController;
import edu.wpi.first.wpilibj.Victor;
import edu.wpi.first.wpilibj.command.PIDSubsystem;
import edu.wpi.first.wpilibj.examples.gearsbot.Robot;
import edu.wpi.first.wpilibj.interfaces.Potentiometer;
import edu.wpi.first.wpilibj.livewindow.LiveWindow;
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
/**
@@ -23,8 +20,8 @@ import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
*/
public class Elevator extends PIDSubsystem {
private SpeedController m_motor;
private Potentiometer m_pot;
private Victor m_motor;
private AnalogPotentiometer m_pot;
private static final double kP_real = 4;
private static final double kI_real = 0.07;
@@ -48,10 +45,9 @@ public class Elevator extends PIDSubsystem {
m_pot = new AnalogPotentiometer(2); // Defaults to meters
}
// Let's show everything on the LiveWindow
LiveWindow.addActuator("Elevator", "Motor", (Victor) m_motor);
LiveWindow.addSensor("Elevator", "Pot", (AnalogPotentiometer) m_pot);
LiveWindow.addActuator("Elevator", "PID", getPIDController());
// Let's name everything on the LiveWindow
addChild("Motor", m_motor);
addChild("Pot", m_pot);
}
@Override
@@ -62,7 +58,7 @@ public class Elevator extends PIDSubsystem {
* The log method puts interesting information to the SmartDashboard.
*/
public void log() {
SmartDashboard.putData("Wrist Pot", (AnalogPotentiometer) m_pot);
SmartDashboard.putData("Elevator Pot", (AnalogPotentiometer) m_pot);
}
/**

View File

@@ -8,12 +8,9 @@
package edu.wpi.first.wpilibj.examples.gearsbot.subsystems;
import edu.wpi.first.wpilibj.AnalogPotentiometer;
import edu.wpi.first.wpilibj.SpeedController;
import edu.wpi.first.wpilibj.Victor;
import edu.wpi.first.wpilibj.command.PIDSubsystem;
import edu.wpi.first.wpilibj.examples.gearsbot.Robot;
import edu.wpi.first.wpilibj.interfaces.Potentiometer;
import edu.wpi.first.wpilibj.livewindow.LiveWindow;
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
/**
@@ -22,8 +19,8 @@ import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
*/
public class Wrist extends PIDSubsystem {
private SpeedController m_motor;
private Potentiometer m_pot;
private Victor m_motor;
private AnalogPotentiometer m_pot;
private static final double kP_real = 1;
private static final double kP_simulation = 0.05;
@@ -45,10 +42,9 @@ public class Wrist extends PIDSubsystem {
m_pot = new AnalogPotentiometer(3); // Defaults to degrees
}
// Let's show everything on the LiveWindow
LiveWindow.addActuator("Wrist", "Motor", (Victor) m_motor);
LiveWindow.addSensor("Wrist", "Pot", (AnalogPotentiometer) m_pot);
LiveWindow.addActuator("Wrist", "PID", getPIDController());
// Let's name everything on the LiveWindow
addChild("Motor", m_motor);
addChild("Pot", m_pot);
}
@Override

View File

@@ -12,7 +12,6 @@ import edu.wpi.first.wpilibj.Joystick;
import edu.wpi.first.wpilibj.Spark;
import edu.wpi.first.wpilibj.Timer;
import edu.wpi.first.wpilibj.drive.DifferentialDrive;
import edu.wpi.first.wpilibj.livewindow.LiveWindow;
/**
* The VM is configured to automatically run this class, and to call the
@@ -78,6 +77,5 @@ public class Robot extends IterativeRobot {
*/
@Override
public void testPeriodic() {
LiveWindow.run();
}
}

View File

@@ -10,7 +10,6 @@ package edu.wpi.first.wpilibj.examples.pacgoat;
import edu.wpi.first.wpilibj.IterativeRobot;
import edu.wpi.first.wpilibj.command.Command;
import edu.wpi.first.wpilibj.command.Scheduler;
import edu.wpi.first.wpilibj.livewindow.LiveWindow;
import edu.wpi.first.wpilibj.smartdashboard.SendableChooser;
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
@@ -103,7 +102,6 @@ public class Robot extends IterativeRobot {
// This function called periodically during test mode
@Override
public void testPeriodic() {
LiveWindow.run();
}
@Override

View File

@@ -12,7 +12,6 @@ import edu.wpi.first.wpilibj.Solenoid;
import edu.wpi.first.wpilibj.SpeedController;
import edu.wpi.first.wpilibj.Victor;
import edu.wpi.first.wpilibj.command.Subsystem;
import edu.wpi.first.wpilibj.livewindow.LiveWindow;
/**
* The Collector subsystem has one motor for the rollers, a limit switch for
@@ -33,10 +32,10 @@ public class Collector extends Subsystem {
public Collector() {
// Put everything to the LiveWindow for testing.
LiveWindow.addActuator("Collector", "Roller Motor", (Victor) m_rollerMotor);
LiveWindow.addSensor("Collector", "Ball Detector", m_ballDetector);
LiveWindow.addSensor("Collector", "Claw Open Detector", m_openDetector);
LiveWindow.addActuator("Collector", "Piston", m_piston);
addChild("Roller Motor", (Victor) m_rollerMotor);
addChild("Ball Detector", m_ballDetector);
addChild("Claw Open Detector", m_openDetector);
addChild("Piston", m_piston);
}
/**

View File

@@ -17,7 +17,6 @@ import edu.wpi.first.wpilibj.SpeedController;
import edu.wpi.first.wpilibj.SpeedControllerGroup;
import edu.wpi.first.wpilibj.Victor;
import edu.wpi.first.wpilibj.command.Subsystem;
import edu.wpi.first.wpilibj.livewindow.LiveWindow;
import edu.wpi.first.wpilibj.examples.pacgoat.Robot;
import edu.wpi.first.wpilibj.examples.pacgoat.commands.DriveWithJoystick;
@@ -43,14 +42,10 @@ public class DriveTrain extends Subsystem {
public DriveTrain() {
// Configure drive motors
LiveWindow.addActuator("DriveTrain", "Front Left CIM",
(Victor) m_frontLeftCIM);
LiveWindow.addActuator("DriveTrain", "Front Right CIM",
(Victor) m_frontRightCIM);
LiveWindow.addActuator("DriveTrain", "Back Left CIM",
(Victor) m_rearLeftCIM);
LiveWindow.addActuator("DriveTrain", "Back Right CIM",
(Victor) m_rearRightCIM);
addChild("Front Left CIM", (Victor) m_frontLeftCIM);
addChild("Front Right CIM", (Victor) m_frontRightCIM);
addChild("Back Left CIM", (Victor) m_rearLeftCIM);
addChild("Back Right CIM", (Victor) m_rearRightCIM);
// Configure the DifferentialDrive to reflect the fact that all motors
// are wired backwards (right is inverted in DifferentialDrive).
@@ -75,14 +70,14 @@ public class DriveTrain extends Subsystem {
(4.0/* in */ * Math.PI) / (360.0 * 12.0/* in/ft */));
}
LiveWindow.addSensor("DriveTrain", "Right Encoder", m_rightEncoder);
LiveWindow.addSensor("DriveTrain", "Left Encoder", m_leftEncoder);
addChild("Right Encoder", m_rightEncoder);
addChild("Left Encoder", m_leftEncoder);
// Configure gyro
if (Robot.isReal()) {
m_gyro.setSensitivity(0.007); // TODO: Handle more gracefully?
}
LiveWindow.addSensor("DriveTrain", "Gyro", m_gyro);
addChild("Gyro", m_gyro);
}
/**

View File

@@ -13,7 +13,6 @@ import edu.wpi.first.wpilibj.SpeedController;
import edu.wpi.first.wpilibj.Victor;
import edu.wpi.first.wpilibj.command.PIDSubsystem;
import edu.wpi.first.wpilibj.interfaces.Potentiometer;
import edu.wpi.first.wpilibj.livewindow.LiveWindow;
import edu.wpi.first.wpilibj.examples.pacgoat.Robot;
@@ -49,12 +48,11 @@ public class Pivot extends PIDSubsystem {
}
// Put everything to the LiveWindow for testing.
LiveWindow.addSensor("Pivot", "Upper Limit Switch", m_upperLimitSwitch);
LiveWindow.addSensor("Pivot", "Lower Limit Switch", m_lowerLimitSwitch);
LiveWindow.addSensor("Pivot", "Pot", (AnalogPotentiometer) m_pot);
LiveWindow.addActuator("Pivot", "Motor", (Victor) m_motor);
LiveWindow.addActuator("Pivot", "PIDSubsystem Controller",
getPIDController());
addChild("Upper Limit Switch", m_upperLimitSwitch);
addChild("Lower Limit Switch", m_lowerLimitSwitch);
addChild("Pot", (AnalogPotentiometer) m_pot);
addChild("Motor", (Victor) m_motor);
addChild("PIDSubsystem Controller", getPIDController());
}
/**

View File

@@ -9,7 +9,6 @@ package edu.wpi.first.wpilibj.examples.pacgoat.subsystems;
import edu.wpi.first.wpilibj.AnalogInput;
import edu.wpi.first.wpilibj.command.Subsystem;
import edu.wpi.first.wpilibj.livewindow.LiveWindow;
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
import edu.wpi.first.wpilibj.examples.pacgoat.Robot;
@@ -26,7 +25,7 @@ public class Pneumatics extends Subsystem {
private static final double kMaxPressure = 2.55;
public Pneumatics() {
LiveWindow.addSensor("Pneumatics", "Pressure Sensor", m_pressureSensor);
addChild("Pressure Sensor", m_pressureSensor);
}
/**

View File

@@ -11,7 +11,6 @@ import edu.wpi.first.wpilibj.DigitalInput;
import edu.wpi.first.wpilibj.DoubleSolenoid;
import edu.wpi.first.wpilibj.Solenoid;
import edu.wpi.first.wpilibj.command.Subsystem;
import edu.wpi.first.wpilibj.livewindow.LiveWindow;
/**
* The Shooter subsystem handles shooting. The mechanism for shooting is
@@ -35,12 +34,10 @@ public class Shooter extends Subsystem {
public Shooter() {
// Put everything to the LiveWindow for testing.
LiveWindow.addSensor("Shooter", "Hot Goal Sensor", m_hotGoalSensor);
LiveWindow.addSensor("Shooter", "Piston1 Reed Switch Front ",
m_piston1ReedSwitchFront);
LiveWindow.addSensor("Shooter", "Piston1 Reed Switch Back ",
m_piston1ReedSwitchBack);
LiveWindow.addActuator("Shooter", "Latch Piston", m_latchPiston);
addChild("Hot Goal Sensor", m_hotGoalSensor);
addChild("Piston1 Reed Switch Front ", m_piston1ReedSwitchFront);
addChild("Piston1 Reed Switch Back ", m_piston1ReedSwitchBack);
addChild("Latch Piston", m_latchPiston);
}
/**

View File

@@ -10,7 +10,6 @@ package edu.wpi.first.wpilibj.templates.commandbased;
import edu.wpi.first.wpilibj.TimedRobot;
import edu.wpi.first.wpilibj.command.Command;
import edu.wpi.first.wpilibj.command.Scheduler;
import edu.wpi.first.wpilibj.livewindow.LiveWindow;
import edu.wpi.first.wpilibj.smartdashboard.SendableChooser;
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
import edu.wpi.first.wpilibj.templates.commandbased.commands.ExampleCommand;
@@ -119,6 +118,5 @@ public class Robot extends TimedRobot {
*/
@Override
public void testPeriodic() {
LiveWindow.run();
}
}