CoilGun

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) {