2016-02-09 16:23:45 -05:00
|
|
|
/*
|
|
|
|
* Shooter.h
|
|
|
|
*
|
|
|
|
* Created on: Feb 2, 2016
|
|
|
|
* Author: Jason
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef SRC_SHOOTER_H_
|
|
|
|
#define SRC_SHOOTER_H_
|
|
|
|
|
|
|
|
#define PICKUP_POWER 0.5
|
|
|
|
#define RAMP_LOWER_DURATION 2 //Rotations.
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* You can use the values assigned to each of these values as the number
|
|
|
|
* of rotations to run the motor down from the "Shoot" position.
|
|
|
|
*
|
|
|
|
* This might not be the best way to do it, and also requires that we
|
|
|
|
* figure out how to read the Hall Effect signal from the motor.
|
|
|
|
*/
|
|
|
|
enum RampState {
|
|
|
|
Shoot = 0, // 0 rotations
|
2016-02-09 17:27:58 -05:00
|
|
|
Half = (RAMP_LOWER_DURATION / 2), // 1 rotation?
|
|
|
|
Down = RAMP_LOWER_DURATION, // 2 rotations?
|
|
|
|
Uncalibrated = -1,
|
|
|
|
Transitioning = -2
|
2016-02-09 16:23:45 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
class Shooter {
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* Shooter talons and ramp talon.
|
|
|
|
* s2 is also for the pickup-mechanism and can be controlled independently.
|
|
|
|
*
|
|
|
|
*/
|
2016-02-10 13:39:48 -05:00
|
|
|
Shooter(CANTalon *s1, CANTalon *s2, CANTalon *r, Counter *h) {
|
2016-02-09 16:23:45 -05:00
|
|
|
shooterDrive = new RobotDrive(s1, s2);
|
|
|
|
pickup = s2;
|
|
|
|
ramp = r;
|
|
|
|
rampState = Uncalibrated;
|
2016-02-10 13:39:48 -05:00
|
|
|
rampHeight = h;
|
2016-02-09 16:23:45 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Call this method on TeleopInit so that the ramp is properly
|
|
|
|
* set at the beginning of the match.
|
|
|
|
*/
|
|
|
|
RampState CalibrateRamp() {
|
|
|
|
// TODO:
|
|
|
|
// Raise ramp until limit switch is triggered,
|
|
|
|
// then lower the ramp to its lower limit.
|
|
|
|
|
|
|
|
return Down;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual ~Shooter() {
|
|
|
|
delete shooterDrive;
|
|
|
|
delete pickup;
|
|
|
|
delete ramp;
|
2016-02-10 13:39:48 -05:00
|
|
|
delete rampHeight;
|
2016-02-09 16:23:45 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void PickUp(bool state = true) {
|
|
|
|
pickup->Set((float) (state * PICKUP_POWER));
|
|
|
|
}
|
|
|
|
|
|
|
|
void SetRamp(RampState state) {
|
|
|
|
// TODO:
|
|
|
|
// Move the Ramp to the set position.
|
2016-02-10 13:39:48 -05:00
|
|
|
switch (state)
|
|
|
|
{
|
|
|
|
case Shoot:
|
|
|
|
if (ramp->GetForwardLimitOK())
|
|
|
|
{
|
|
|
|
ramp->Set(1);
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
ramp->Set(0);
|
|
|
|
rampHeight->Reset();
|
|
|
|
}
|
|
|
|
}
|
2016-02-09 16:23:45 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Call this to run the pickup backwards if the ball gets jammed somehow...
|
|
|
|
*/
|
|
|
|
void Unjam()
|
|
|
|
{
|
|
|
|
pickup->Set(-1 * PICKUP_POWER);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SetPower(float power) {
|
|
|
|
shooterDrive->TankDrive(power, -power, false);
|
|
|
|
}
|
|
|
|
private:
|
|
|
|
|
|
|
|
RobotDrive *shooterDrive;
|
|
|
|
CANTalon *pickup;
|
|
|
|
CANTalon *ramp;
|
2016-02-10 13:39:48 -05:00
|
|
|
Counter *rampHeight;
|
2016-02-09 16:23:45 -05:00
|
|
|
|
|
|
|
RampState rampState;
|
2016-02-09 17:27:58 -05:00
|
|
|
RampState targetState;
|
|
|
|
RampState previousState;
|
2016-02-09 16:23:45 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* SRC_SHOOTER_H_ */
|