# Writing the Code for a PIDSubsystem

The skeleton of the PIDSubsystem is generated by the RobotBuilder and we have to fill in the rest of the code to provide the potentiometer value and drive the motor with the output of the embedded PIDController.


Make sure the Elevator PID subsystem has been created in the RobotBuilder. Once it's all set, generate Java/C++ code for the project using the Export menu or the Java/C++ toolbar menu.

RobotBuilder generates the PIDSubsystem methods such that no additional code is needed for basic operation.

## Setting the PID Constants

The height constants and PID constants are automatically generated.

.. tab-set-code::

   ```java
   public class Elevator extends PIDSubsystem {

       // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTANTS
   public static final double Bottom = 4.6;
   public static final double Stow = 1.65;
   public static final double Table_Height = 1.58;
       // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTANTS

       // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DECLARATIONS
   private AnalogPotentiometer pot;private PWMVictorSPX motor;
       //P I D Variables
       private static final double kP = 6.0;
       private static final double kI = 0.0;
       private static final double kD = 0.0;
       private static final double kF = 0.0;
       // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DECLARATIONS
   ```

   ```c++
          // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTANTS
      static constexpr const double Bottom = 4.6;
      static constexpr const double Stow = 1.65;
      static constexpr const double Table_Height = 1.58;
          static constexpr const double kP = 6.0;
          static constexpr const double kI = 0.0;
          static constexpr const double kD = 0.0;
          static constexpr const double kF = 0.0;
          // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTANTS
   ```

## Get Potentiometer Measurement

.. tab-set-code::

   ```java
   @Override
   public double getMeasurement() {
       // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=SOURCE
       return pot.get();

       // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=SOURCE
   }
   ```

   ```c++
   double Elevator::GetMeasurement() {
       // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=SOURCE
       return m_pot.Get();

       // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=SOURCE
   }
   ```

The ``getMeasurement()`` method is used to set the value of the sensor that is providing the feedback for the PID controller. In this case, the code is automatically generated and returns the potentiometer voltage as returned by the ``get()`` method.

## Calculate PID Output

.. tab-set-code::

   ```java
        @Override
        public void useOutput(double output, double setpoint) {
            output += setpoint*kF;
            // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=OUTPUT
    motor.set(output);

            // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=OUTPUT
        }
   ```

   ```c++
   void Elevator::UseOutput(double output, double setpoint) {
       output += setpoint*kF;
       // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=OUTPUT
   m_motor.Set(output);

       // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=OUTPUT
   }
   ```

The ``useOutput`` method writes the calculated PID output directly to the motor.

That's all that is required to create the Elevator PIDSubsystem.
