Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 }
Generated on Thu Jul 21 2022 02:05:47 by
1.7.2