mirror of
https://github.com/team2059/Zaphod
synced 2024-12-18 20:12:28 -05:00
103 lines
2.5 KiB
C++
103 lines
2.5 KiB
C++
#include "Shooter.h"
|
|
|
|
ZaphodShooter::ZaphodShooter()
|
|
{
|
|
shooterLeft1 = new Jaguar(SHOOTER_LEFT_SIDECAR, SHOOTER_LEFT_MOTOR_ONE);
|
|
shooterLeft2 = new Jaguar(SHOOTER_LEFT_SIDECAR, SHOOTER_LEFT_MOTOR_TWO);
|
|
shooterRight1 = new Jaguar(SHOOTER_RIGHT_SIDECAR, SHOOTER_RIGHT_MOTOR_ONE);
|
|
shooterRight2 = new Jaguar(SHOOTER_RIGHT_SIDECAR, SHOOTER_RIGHT_MOTOR_TWO);
|
|
|
|
shooterAngle = new AnalogChannel(SHOOTER_ANGLE_POT);
|
|
e_ShooterState = IDLE_PRESHOT;
|
|
}
|
|
|
|
void ZaphodShooter::startShootingSequence(float throttle)
|
|
{
|
|
//Changes the enum to tell the shooter to be firing
|
|
e_ShooterState = FIRING;
|
|
shootingPower = throttle;
|
|
}
|
|
|
|
//First step in shooting process
|
|
void ZaphodShooter::shootForAngle(float power, float desiredAngle)
|
|
{
|
|
if(getAngle() <= desiredAngle)
|
|
{
|
|
shootRaw(power);
|
|
e_ShooterState = FIRING;
|
|
}
|
|
else
|
|
{
|
|
e_ShooterState = IDLE_POSTSHOT;
|
|
}
|
|
}
|
|
|
|
//Second step in shooting process
|
|
//Probably wont need to be used without shootForAngle
|
|
void ZaphodShooter::lower(float desiredAngle)
|
|
{
|
|
if(getAngle() >= desiredAngle)
|
|
{
|
|
shootRaw(-0.1f);
|
|
e_ShooterState = LOWERING;
|
|
}
|
|
else
|
|
{
|
|
shootRaw(0.0f);
|
|
e_ShooterState = IDLE_PRESHOT;
|
|
}
|
|
}
|
|
|
|
//Not needed anywhere other than after/before the shooting process
|
|
void ZaphodShooter::stopShooter()
|
|
{
|
|
if(e_ShooterState == IDLE_PRESHOT)
|
|
{
|
|
shootRaw(0.0f);
|
|
}
|
|
}
|
|
|
|
//Shouldn't be used in any other class but this one
|
|
void ZaphodShooter::shootRaw(float power)
|
|
{
|
|
shooterLeft1->SetRaw(int(floatToPWM(power)));
|
|
shooterLeft2->SetRaw(int(floatToPWM(power)));
|
|
shooterRight1->SetRaw(int(floatToPWM(-power)));
|
|
shooterRight2->SetRaw(int(floatToPWM(-power)));
|
|
}
|
|
|
|
void ZaphodShooter::updateShooterPosition()
|
|
{
|
|
if(e_ShooterState == IDLE_PRESHOT)
|
|
{
|
|
isShooting = false;
|
|
stopShooter();
|
|
}
|
|
if(e_ShooterState == FIRING)
|
|
{
|
|
isShooting = true;
|
|
shootForAngle(shootingPower,110);
|
|
}
|
|
if(e_ShooterState == IDLE_POSTSHOT)
|
|
{
|
|
isShooting = false;
|
|
lower(40);
|
|
}
|
|
}
|
|
|
|
float ZaphodShooter::floatToPWM(float input)
|
|
{
|
|
return input * 127.0 + 128;
|
|
}
|
|
|
|
//Returns angle measure in degrees
|
|
float ZaphodShooter::getAngle()
|
|
{
|
|
float max = -.0003948;
|
|
float min = 5.0245547;
|
|
float b = shooterAngle->GetAverageVoltage() - max;
|
|
min = min - max; // ~5.0027
|
|
max = max - max; //=0
|
|
return 300 - ((b + max) * (300 / min));
|
|
}
|