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.
Fork of CoilGun by
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 }
Generated on Wed Jul 13 2022 02:22:10 by
1.7.2
