DoubleCoilGun
Fork of CoilGun by
Diff: coilgun.cpp
- Revision:
- 3:7273ba733560
- Parent:
- 2:781ea1999ad3
- Child:
- 4:0e2bdd3d52bc
--- a/coilgun.cpp Sat Sep 14 17:30:54 2013 +0000 +++ b/coilgun.cpp Sat Sep 14 22:31:22 2013 +0000 @@ -2,24 +2,34 @@ CoilGun::CoilGun(PinName chargePinName, PinName kickPinName, PinName donePin) : chargePin(chargePinName), kickPin(kickPinName), done(donePin) { + kicking = false; + discharging = false; + kickPin = 1; + chargePin = 0; done.fall(this, &CoilGun::doneCallback); } void CoilGun::kick(unsigned int length) { - chargePin = 0; - kickPin = 0; - Timeout kickFinish; - kickFinish.attach_us(this, &CoilGun::kickEnd, length); + if (!kicking){ + chargePin = 0; + kicking = true; + kickPin = 0; + kickTimeout.attach_us(this, &CoilGun::kickEnd, length); + } } void CoilGun::kickEnd(void) { - chargePin = 1; + kickTimeout.detach(); kickPin = 1; + chargePin = 1; + kicking = false; } void CoilGun::setCharge(bool chargeState) { - kickPin = 1; if (chargeState) { + if (discharging) + dischargeEnd(); + kickPin = 1; chargePin = 1; } else { chargePin = 0; @@ -27,8 +37,17 @@ } void CoilGun::discharge() { - chargePin = 0; - kickPin = 0; + 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) {