CoilGun
Diff: coilgun.cpp
- Revision:
- 5:0e061c4013a2
- Parent:
- 4:0e2bdd3d52bc
- Child:
- 6:4c75db8a43db
--- a/coilgun.cpp Sat Sep 14 22:57:17 2013 +0000 +++ b/coilgun.cpp Wed Sep 18 10:50:22 2013 +0000 @@ -1,55 +1,80 @@ -#include "coilgun.h" - -CoilGun::CoilGun(PinName chargePinName, PinName kickPinName, PinName donePinName) - : chargePin(chargePinName), kickPin(kickPinName), donePin(donePinName) { - kicking = false; - discharging = false; - kickPin = 1; - chargePin = 0; - donePin.fall(this, &CoilGun::doneCallback); -} - -void CoilGun::kick(unsigned int length) { - if (!kicking){ + #include "coilgun.h" + + Coilgun::Coilgun(PinName kickPinName ,PinName chargePinName, PinName donePinName): + kickPin(kickPinName),chargePin(chargePinName), donePin(donePinName) + { + state = idle; + kickPin = 1; chargePin = 0; - kicking = true; - kickPin = 0; - kickTimeout.attach_us(this, &CoilGun::kickEnd, length); + donePin.fall(this, &Coilgun::chargeEnd); + } + + void Coilgun::kick(unsigned int length) { + kick(length,true); } -} - -void CoilGun::kickEnd(void) { - kickTimeout.detach(); - kickPin = 1; - chargePin = 1; - kicking = false; -} + + void Coilgun::kick(unsigned int length, bool change_state = true) { + if(change_state) //Used to keep state when discharging + changeState(kicking); + + chargePin = 0; // Maybe not needed anymore? (still a safety?) + kickPin = 0; + kickTimeout.attach_us(this, &Coilgun::kickEnd, length); + } + + void Coilgun::kickEnd(void) { + kickTimeout.detach(); + kickPin = 1; -void CoilGun::setCharge(bool chargeState) { - if (chargeState) { - if (discharging) - dischargeEnd(); + if(state != discharging){ //Used when discharging + chargePin = 1; // Don't start charging again + state = idle; //(let state stay "discharging") + } + + } + + void Coilgun::charge() { + changeState(charging); kickPin = 1; - chargePin = 1; - } else { - chargePin = 0; - } -} + chargePin = 1; + } -void CoilGun::discharge() { - setCharge(false); - discharging = true; - dischargeTimeout.attach(this, &CoilGun::dischargeEnd, 5.0); // End discharging after 5 seconds - discharger.attach_us(this, &CoilGun::dischargeKick, 5000); // calls short kick every 5ms -} -void CoilGun::dischargeKick(void) { - kick(1000); -} -void CoilGun::dischargeEnd(void) { - discharger.detach(); - discharging = false; -} - -void CoilGun::doneCallback(void) { - chargePin = 0; -} \ No newline at end of file + void Coilgun::chargeEnd(){ + chargePin = 0; + state = idle; + } + + void Coilgun::discharge() { + changeState(discharging); + dischargeTimeout.attach(this, &Coilgun::dischargeEnd, 10.0); // End discharging after 10 seconds + discharger.attach_us(this, &Coilgun::dischargeKick, 5000); // calls short kick every 5ms + } + void Coilgun::dischargeEnd(void) { + discharger.detach(); + state = idle; + } + void Coilgun::dischargeKick(void) { + kick(500, false); + } + + void Coilgun::changeState(State new_state){ + switch(state){ + case idle: + //nothing to end. + break; + case kicking: + kickEnd(); + break; + case charging: + chargeEnd(); + break; + case discharging: + dischargeEnd(); + break; + default: + //error - no such state + break; + } + //set new state + state = new_state; + } \ No newline at end of file