package com.team254.frc2015.subsystems.controllers;
import com.team254.frc2015.Constants;
import com.team254.frc2015.subsystems.Drive;
import com.team254.lib.util.DriveSignal;
import com.team254.lib.util.Pose;
import com.team254.lib.util.SynchronousPID;
public class DriveFinishLineController implements Drive.DriveController {
BangBangFinishLineController m_controller;
Pose m_setpoint = new Pose(0, 0, 0, 0, 0, 0);
double m_heading = 0;
private SynchronousPID mTurnPid;
public DriveSignal m_cached_drive = new DriveSignal(0, 0);
public DriveFinishLineController(double distance, double heading, double tolerance) {
m_controller = new BangBangFinishLineController(tolerance);
m_controller.setGoal(distance);
m_heading = heading;
mTurnPid = new SynchronousPID();
mTurnPid.setPID(
Constants.kDriveStraightKp,
Constants.kDriveStraightKi,
Constants.kDriveStraightKd);
mTurnPid.setSetpoint(heading);
}
@Override
public DriveSignal update(Pose pose) {
m_setpoint = pose;
double position = (pose.getLeftDistance() + pose.getRightDistance()) / 2.0;
double throttle = m_controller.update(position);
double turn = mTurnPid.calculate(pose.getHeading());
m_cached_drive.leftMotor = throttle + turn;
m_cached_drive.rightMotor = throttle - turn;
return m_cached_drive;
}
@Override
public Pose getCurrentSetpoint() {
return m_setpoint;
}
@Override
public boolean onTarget() {
return m_controller.isOnTarget();
}
}