Reiko Randoja / DoubleCoilGun

Dependents:   Telliskivi2_2014

Fork of CoilGun by Reiko Randoja

Files at this revision

API Documentation at this revision

Comitter:
mlaane
Date:
Sat Sep 14 22:31:22 2013 +0000
Parent:
2:781ea1999ad3
Child:
4:0e2bdd3d52bc
Commit message:
Implemented discharging; Problems with Timeout

Changed in this revision

coilgun.cpp Show annotated file Show diff for this revision Revisions of this file
coilgun.h Show annotated file Show diff for this revision Revisions of this file
--- 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) {
--- a/coilgun.h	Sat Sep 14 17:30:54 2013 +0000
+++ b/coilgun.h	Sat Sep 14 22:31:22 2013 +0000
@@ -8,7 +8,7 @@
     CoilGun(PinName chargePin, PinName kickPinName, PinName donePinName);
     
     void kick(unsigned int length);
-    void discharge();
+    void discharge(void); //Method that starts discharging
     void setCharge(bool chargeState);
  
 private:
@@ -16,7 +16,16 @@
     DigitalOut kickPin;
     InterruptIn done;
     void doneCallback(void);
+    
+    bool kicking; //True while kick is in progress
+    Timeout kickTimeout; // This will end kicking
     void kickEnd(void);
+    
+    bool discharging; //True as long discharging is in progress
+    Timeout dischargeTimeout; // This will end discharging
+    Ticker discharger; // Calls short kicks during discharge
+    void dischargeKick(void); //Short kick for discharging
+    void dischargeEnd(void); //Method that ends discharging (dischargeTimeout calls this)
 };
 
 #endif
\ No newline at end of file