This repository has been archived on 2020-09-21. You can view files and clone it, but cannot push or open issues or pull requests.
FRC2016/src/Shooter.h

167 lines
2.6 KiB
C
Raw Normal View History

/*
* Shooter.h
*
* Created on: Feb 2, 2016
* Author: Jason
*/
#ifndef SRC_SHOOTER_H_
#define SRC_SHOOTER_H_
2016-02-13 11:26:07 -05:00
#define PICKUP_POWER 0.5
#define LAUNCH_POWER 1
#define SPINUP_TIME 1.5 // seconds.
#define LAUNCH_TIME 0.5
class Shooter
{
public:
/**
2016-02-11 16:51:13 -05:00
* Shooter talons and launch-spinny talon.
* s2 is also for the pickup-mechanism and can be controlled independently.
*
*/
enum ShooterState
{
READY,
ON_FIRE,
SPINNINGUP,
LAUNCH,
LAUNCHING,
RESETTING
};
Shooter(CANTalon *s1, CANTalon *s2, CANTalon *r)
{
2016-02-10 15:23:07 -05:00
// shooterDrive = new RobotDrive(s1, s2);
launcher = s1;
pickup = s2;
2016-02-20 15:14:51 -05:00
ramp = r;
ready = true;
state = READY;
}
/**
* Call this method on TeleopInit so that the ramp is properly
* set at the beginning of the match.
*/
virtual ~Shooter()
{
2016-02-10 15:23:07 -05:00
delete launcher;
delete pickup;
2016-02-20 15:14:51 -05:00
delete ramp;
}
void StopShooter()
{
ready = true;
2016-02-20 15:14:51 -05:00
ramp->Set(0);
2016-02-12 19:37:36 -05:00
launcher->Set(0);
pickup->Set(0);
}
void LowerRamp()
{
2016-02-20 16:53:38 -05:00
ramp->Set(-.5);
2016-02-12 19:37:36 -05:00
}
void RaiseRamp()
{
2016-02-20 16:53:38 -05:00
ramp->Set(0.5);
}
void StopRamp()
{
2016-02-20 15:14:51 -05:00
ramp->Set(0);
2016-02-12 19:37:36 -05:00
}
void Shoot()
{
// TODO: Shooter Logic should go as follows:
/*
Assuming a ball is held in the shooter. When the trigger is pulled,
the launch-spinny should be STOPPED. Start a Timer object counting
When... too hard to write.. I emailed you a flow chart.
*/
switch (state)
{
case READY:
{
state = SPINNINGUP;
2016-02-20 15:14:51 -05:00
ramp->Set(-1);
launcher->Set(PICKUP_POWER);
pickup->Set(PICKUP_POWER);
shotClock.Reset();
shotClock.Start();
break;
}
case SPINNINGUP:
{
if (shotClock.Get() > SPINUP_TIME)
{
state = LAUNCH;
shotClock.Reset();
shotClock.Start();
} else
{
std::cout << "*Goku noises*\n";
}
break;
}
case LAUNCH:
{
2016-02-20 15:14:51 -05:00
ramp->Set(1);
state = LAUNCHING;
break;
}
case LAUNCHING:
{
if (shotClock.Get() > LAUNCH_TIME)
{
state = RESETTING;
}
break;
}
}
}
void PickUp(bool state = true)
{
pickup->Set((float) (state * PICKUP_POWER));
2016-02-13 11:26:07 -05:00
launcher->Set((float) (state * PICKUP_POWER * -1));
2016-02-20 15:14:51 -05:00
//ramp->Set(-1.0*PICKUP_POWER);
2016-02-13 12:09:08 -05:00
//std::cout << "picking up!\n";
}
/**
* Call this to run the pickup backwards if the ball gets jammed somehow...
*/
void Unjam()
{
pickup->Set(-1 * PICKUP_POWER);
}
void SetPower(float power)
{
2016-02-10 15:23:07 -05:00
pickup->Set(power);
launcher->Set(power);
2016-02-13 12:09:08 -05:00
//std::cout << "setting shooter power" << std::endl;
}
private:
//RobotDrive *shooterDrive;
2016-02-10 15:23:07 -05:00
CANTalon *launcher;
CANTalon *pickup;
2016-02-20 15:14:51 -05:00
CANTalon *ramp;
ShooterState state;
Timer shotClock;
bool ready;
};
#endif /* SRC_SHOOTER_H_ */