Reiko Randoja / DoubleCoilGun

Dependents:   Telliskivi2_2014

Fork of CoilGun by Reiko Randoja

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers coilgun.cpp Source File

coilgun.cpp

00001 #include "coilgun.h"
00002  
00003 Coilgun::Coilgun(PinName kickPinName, PinName chipPinName, PinName chargePinName, PinName donePinName): 
00004     kickPin(kickPinName), chipPin(chipPinName), chargePin(chargePinName), donePin(donePinName) 
00005 {
00006     isCharged = false;
00007     state = idle;
00008     kickPin = 0;
00009     chipPin = 0;
00010     chargePin = 0;
00011     donePin.fall(this, &Coilgun::chargeEnd);
00012     
00013     currentKickLength = 0;
00014     currentKickDelay = 0;
00015     currentChipLength = 0;
00016     currentChipDelay = 0;
00017     
00018     kickActive = false;
00019     chipActive = false;
00020     
00021     //discharge(); // For safety reasons.
00022 }
00023 
00024 void Coilgun::kick(unsigned int kickLength, unsigned int kickDelay, unsigned int chipLength, unsigned int chipDelay) {    
00025     kick(kickLength, kickDelay, chipLength, chipDelay, true);
00026 }
00027 
00028 void Coilgun::kick(unsigned int kickLength, unsigned int kickDelay, unsigned int chipLength, unsigned int chipDelay, bool change_state = true) {
00029     if (change_state) {//Used to keep state when discharging
00030         changeState(kicking);
00031     }
00032     
00033     currentKickLength = kickLength;
00034     currentKickDelay = kickDelay;
00035     currentChipLength = chipLength;
00036     currentChipDelay = chipDelay;
00037     
00038     chargePin = 0; // Maybe not needed anymore? (still a safety?)
00039     
00040     kickActive = true;
00041     chipActive = true;
00042     
00043     if (currentKickDelay > 0) {
00044         kickDelayTimeout.attach_us(this, &Coilgun::kickDelayEnd, currentKickDelay);
00045     } else {
00046         kickDelayEnd();
00047     }
00048     
00049     if (currentChipDelay > 0) {
00050         chipDelayTimeout.attach_us(this, &Coilgun::chipDelayEnd, currentChipDelay);
00051     } else {
00052         chipDelayEnd();
00053     }
00054     
00055 }
00056 
00057 void Coilgun::kickDelayEnd(void) {
00058     kickDelayTimeout.detach();
00059 
00060     if (currentKickLength > 0) {
00061         kickPin = 1;
00062         kickTimeout.attach_us(this, &Coilgun::kickEnd, currentKickLength);
00063     } else {
00064         kickEnd();    
00065     }    
00066 }
00067 
00068 void Coilgun::kickEnd(void) {
00069     kickTimeout.detach();
00070     kickPin = 0;
00071     kickActive = false;
00072 
00073     if (!chipActive && state != discharging){ //Used when discharging 
00074         chargePin = 1; // autocharge
00075         state = idle; //(let state stay "discharging")
00076     }
00077 }
00078 
00079 void Coilgun::chipDelayEnd(void) {
00080     chipDelayTimeout.detach();
00081     
00082     if (currentChipLength > 0) {
00083         chipPin = 1;
00084         chipTimeout.attach_us(this, &Coilgun::chipEnd, currentChipLength);
00085     } else {
00086         chipEnd();    
00087     }  
00088 }
00089 
00090 void Coilgun::chipEnd(void) {
00091     chipTimeout.detach();
00092     chipPin = 0;
00093     chipActive = false;
00094 
00095     if (!kickActive && state != discharging){ //Used when discharging 
00096         chargePin = 1; // autocharge
00097         state = idle; //(let state stay "discharging")
00098     }
00099     
00100 }
00101 
00102 void Coilgun::charge() {
00103     changeState(charging);
00104     
00105     kickPin = 0;
00106     chipPin = 0;
00107     kickActive = false;
00108     chipActive = false;
00109     
00110     chargePin = 1; 
00111     isCharged = true;
00112 }
00113 
00114 void Coilgun::chargeEnd(){
00115     chargePin = 0;
00116     state = idle;
00117 }
00118 
00119 void Coilgun::discharge() {
00120     changeState(discharging);
00121     dischargeTimeout.attach(this, &Coilgun::dischargeEnd, 10.0); // End discharging after 10 seconds
00122     discharger.attach_us(this, &Coilgun::dischargeKick, 50000); // calls short kick every 50ms
00123     isCharged = false;
00124 }
00125 
00126 void Coilgun::dischargeEnd(void) {
00127     discharger.detach();
00128     state = idle;
00129 }
00130 
00131 void Coilgun::dischargeKick(void) {
00132     kick(200, 0, 0, 0, false);
00133 }
00134 
00135 void Coilgun::changeState(State new_state){
00136     switch(state){
00137         case idle:
00138             //nothing to end.
00139             break;
00140         case kicking:
00141             kickEnd();
00142             chipEnd();
00143             break;
00144         case charging:
00145             chargeEnd();
00146             break;
00147         case discharging:
00148             dischargeEnd();
00149             break;
00150         default:
00151             //error - no such state
00152             break;
00153     }
00154     //set new state
00155     state = new_state;
00156 }