Reiko Randoja / CoilGun
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 chargePinName, PinName donePinName): 
00004     kickPin(kickPinName),chargePin(chargePinName), donePin(donePinName) 
00005 {
00006     isCharged = false;
00007     state = idle;
00008     kickPin = 1;
00009     chargePin = 0;
00010     //donePin.fall(this, &Coilgun::chargeEnd);
00011     
00012     discharge(); // For safety reasons.
00013 }
00014 
00015 void Coilgun::kick(unsigned int length) {
00016     kick(length,true);
00017 }
00018 
00019 void Coilgun::kick(unsigned int length, bool change_state = true) {
00020     if (change_state) {//Used to keep state when discharging
00021         changeState(kicking);
00022     }
00023     
00024     chargePin = 0; // Maybe not needed anymore? (still a safety?)
00025     kickPin = 0;
00026     kickTimeout.attach_us(this, &Coilgun::kickEnd, length);
00027 }
00028 
00029 void Coilgun::kickEnd(void) {
00030     kickTimeout.detach();
00031     kickPin = 1;
00032 
00033     if (state != discharging){ //Used when discharging 
00034         chargePin = 1; // Don't start charging again
00035         state = idle; //(let state stay "discharging")
00036     }
00037     
00038 }
00039 
00040 void Coilgun::charge() {
00041     changeState(charging);
00042     kickPin = 1;
00043     chargePin = 1; 
00044     isCharged = true;
00045 }
00046 
00047 void Coilgun::chargeEnd(){
00048     chargePin = 0;
00049     state = idle;
00050 }
00051 
00052 void Coilgun::discharge() {
00053     changeState(discharging);
00054     dischargeTimeout.attach(this, &Coilgun::dischargeEnd, 10.0); // End discharging after 10 seconds
00055     discharger.attach_us(this, &Coilgun::dischargeKick, 5000); // calls short kick every 5ms
00056     isCharged = false;
00057 }
00058 
00059 void Coilgun::dischargeEnd(void) {
00060     discharger.detach();
00061     state = idle;
00062 }
00063 
00064 void Coilgun::dischargeKick(void) {
00065     kick(500, false);
00066 }
00067 
00068 void Coilgun::changeState(State new_state){
00069     switch(state){
00070         case idle:
00071             //nothing to end.
00072             break;
00073         case kicking:
00074             kickEnd();
00075             break;
00076         case charging:
00077             chargeEnd();
00078             break;
00079         case discharging:
00080             dischargeEnd();
00081             break;
00082         default:
00083             //error - no such state
00084             break;
00085     }
00086     //set new state
00087     state = new_state;
00088 }