package com.team254.frc2015.subsystems.controllers; import com.team254.lib.util.Controller; import edu.wpi.first.wpilibj.Timer; public class TimedOpenLoopController extends Controller { double m_t0 = 0; // Time of control loop init double m_t1 = 0; // Time to start deceling double m_t2 = 0; // Time to end decel double m_start_power = 0; double m_end_power = 0; public TimedOpenLoopController(double start_power, double time_full_on, double end_power, double time_to_decel) { m_t0 = Timer.getFPGATimestamp(); m_t1 = m_t0 + time_full_on; m_t2 = m_t1 + time_to_decel; m_start_power = start_power; m_end_power = end_power; } public boolean expired() { return Timer.getFPGATimestamp() > m_t2; } public double update() { double cur = Timer.getFPGATimestamp(); if (cur <= m_t1) { return m_start_power; } else if (cur > m_t1 && cur <= m_t2) { // decel double rel_t = cur - m_t1; double slope = (m_end_power - m_start_power) / (m_t2 - m_t1); return (m_start_power + (slope * rel_t)); } else { return m_end_power; } } @Override public void reset() { m_t0 = m_t1 = m_t2 = m_end_power = m_start_power = 0; } @Override public boolean isOnTarget() { return expired(); } }