- FRC Game Manual
- FRC Game Q&A

# Retrieving data

Unlike `SmartDashboard.getNumber` and friends, retrieving data from Shuffleboard is also done through the NetworkTableEntries, which we covered in the previous article.

JAVA

    class DriveBase extends Subsystem {
       private ShuffleboardTab tab = Shuffleboard.getTab("Drive");
       private GenericEntry maxSpeed =
          tab.add("Max Speed", 1)
             .getEntry();
       private DifferentialDrive robotDrive = ...;
       public void drive(double left, double right) {
          // Retrieve the maximum speed from the dashboard
          double max = maxSpeed.getDouble(1.0);
          robotDrive.tankDrive(left * max, right * max);
       }
    }

PYTHON

    import commands2
    import wpilib.drive
    from wpilib.shuffleboard import Shuffleboard
    class DriveSubsystem(commands2.SubsystemBase):
       def __init__(self) -> None:
          super().__init__()
          tab = Shuffleboard.getTab("Drive")
          self.maxSpeed = tab.add("Max Speed", 1).getEntry()
          this.robotDrive = ...
       def drive(self, left: float, right: float):
          # Retrieve the maximum speed from the dashboard
          max = self.maxSpeed.getDouble(1.0)
          self.robotDrive.tankDrive(left * max, right * max)

This basic example has a glaring flaw: the maximum speed can be set on the dashboard to a value outside [0, 1] - which could cause the inputs to be saturated (always at maximum speed), or even reversed! Fortunately, there is a way to avoid this problem - covered in the next article.