DoubleCoilGun
Fork of CoilGun by
Diff: coilgun.cpp
- Revision:
- 10:7518047a0375
- Parent:
- 9:b663ba6a53fe
- Child:
- 11:49959d33916f
--- a/coilgun.cpp Mon Nov 04 17:06:58 2013 +0000 +++ b/coilgun.cpp Tue Sep 02 15:22:41 2014 +0000 @@ -1,36 +1,98 @@ #include "coilgun.h" -Coilgun::Coilgun(PinName kickPinName ,PinName chargePinName, PinName donePinName): - kickPin(kickPinName),chargePin(chargePinName), donePin(donePinName) +Coilgun::Coilgun(PinName kickPinName, PinName chipPinName, PinName chargePinName, PinName donePinName): + kickPin(kickPinName), chipPin(chipPinName), chargePin(chargePinName), donePin(donePinName) { isCharged = false; state = idle; - kickPin = 1; + kickPin = 0; + chipPin = 0; chargePin = 0; //donePin.fall(this, &Coilgun::chargeEnd); - discharge(); // For safety reasons. + currentKickLength = 0; + currentKickDelay = 0; + currentChipLength = 0; + currentChipDelay = 0; + + kickActive = false; + chipActive = false; + + //discharge(); // For safety reasons. } -void Coilgun::kick(unsigned int length) { - kick(length,true); +void Coilgun::kick(unsigned int kickLength, unsigned int kickDelay, unsigned int chipLength, unsigned int chipDelay) { + kick(kickLength, kickDelay, chipLength, chipDelay, true); } -void Coilgun::kick(unsigned int length, bool change_state = true) { +void Coilgun::kick(unsigned int kickLength, unsigned int kickDelay, unsigned int chipLength, unsigned int chipDelay, bool change_state = true) { if (change_state) {//Used to keep state when discharging changeState(kicking); } + currentKickLength = kickLength; + currentKickDelay = kickDelay; + currentChipLength = chipLength; + currentChipDelay = chipDelay; + chargePin = 0; // Maybe not needed anymore? (still a safety?) - kickPin = 0; - kickTimeout.attach_us(this, &Coilgun::kickEnd, length); + + kickActive = true; + chipActive = true; + + if (currentKickDelay > 0) { + kickDelayTimeout.attach_us(this, &Coilgun::kickDelayEnd, currentKickDelay); + } else { + kickDelayEnd(); + } + + if (currentChipDelay > 0) { + chipDelayTimeout.attach_us(this, &Coilgun::chipDelayEnd, currentChipDelay); + } else { + chipDelayEnd(); + } + +} + +void Coilgun::kickDelayEnd(void) { + kickDelayTimeout.detach(); + + if (currentKickLength > 0) { + kickPin = 1; + kickTimeout.attach_us(this, &Coilgun::kickEnd, currentKickLength); + } else { + kickEnd(); + } } void Coilgun::kickEnd(void) { kickTimeout.detach(); - kickPin = 1; + kickPin = 0; + kickActive = false; + + if (!chipActive && state != discharging){ //Used when discharging + chargePin = 1; // Don't start charging again + state = idle; //(let state stay "discharging") + } +} - if (state != discharging){ //Used when discharging +void Coilgun::chipDelayEnd(void) { + chipDelayTimeout.detach(); + + if (currentChipLength > 0) { + chipPin = 1; + chipTimeout.attach_us(this, &Coilgun::chipEnd, currentChipLength); + } else { + chipEnd(); + } +} + +void Coilgun::chipEnd(void) { + chipTimeout.detach(); + chipPin = 0; + chipActive = false; + + if (!kickActive && state != discharging){ //Used when discharging chargePin = 1; // Don't start charging again state = idle; //(let state stay "discharging") } @@ -39,7 +101,12 @@ void Coilgun::charge() { changeState(charging); - kickPin = 1; + + kickPin = 0; + chipPin = 0; + kickActive = false; + chipActive = false; + chargePin = 1; isCharged = true; } @@ -52,7 +119,7 @@ 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 + discharger.attach_us(this, &Coilgun::dischargeKick, 10000); // calls short kick every 10ms isCharged = false; } @@ -62,7 +129,7 @@ } void Coilgun::dischargeKick(void) { - kick(500, false); + kick(100, 0, 0, 0, false); } void Coilgun::changeState(State new_state){ @@ -72,6 +139,7 @@ break; case kicking: kickEnd(); + chipEnd(); break; case charging: chargeEnd();