mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-19 00:41:43 +00:00
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:
@@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user