DoubleCoilGun

Dependents:   Telliskivi2_2014

Fork of CoilGun by Reiko Randoja

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