DoubleCoilGun

Dependents:   Telliskivi2_2014

Fork of CoilGun by Reiko Randoja

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();