/*
 * PURPOSE: (DifferentialDriveController class)
 */
#ifndef DIFFERENTIAL_DRIVE_CONTROLER_HH
#define DIFFERENTIAL_DRIVE_CONTROLER_HH

#include "Motor/include/motorSpeedController.hh"
#include "Control/include/PIDController.hh"

class DifferentialDriveController {

    public:
        DifferentialDriveController( double distanceBetweenWheels,
                                     double wheelRadius,
                                     double wheelSpeedLimit,
                                     double headingRateLimit,
                                     double slowDownDistance,
                                     MotorSpeedController& rightMotorController,
                                     MotorSpeedController& leftMotorController
                                   );

        int update( double distance_err,
                    double heading_err);
        void stop();

    private:

        // Do not allow the default constructor to be used.
        DifferentialDriveController();

        double distanceBetweenWheels;
        double wheelRadius;
        double wheelSpeedLimit;
        double headingRateLimit;
        double slowDownDistance;

        MotorSpeedController& rightMotorController;
        MotorSpeedController& leftMotorController;

        double rightMotorSpeedCommand;
        double leftMotorSpeedCommand;
        double desiredHeadingRate;
        double desiredRangeRate;

        // PID Controller
        PIDController headingctrl;
        PIDController wheelspeedctrl;
};
#endif
