CoilGun
coilgun.cpp
- Committer:
- Reiko
- Date:
- 2013-09-18
- Revision:
- 5:0e061c4013a2
- Parent:
- 4:0e2bdd3d52bc
- Child:
- 6:4c75db8a43db
File content as of revision 5:0e061c4013a2:
#include "coilgun.h" Coilgun::Coilgun(PinName kickPinName ,PinName chargePinName, PinName donePinName): kickPin(kickPinName),chargePin(chargePinName), donePin(donePinName) { state = idle; kickPin = 1; chargePin = 0; donePin.fall(this, &Coilgun::chargeEnd); } void Coilgun::kick(unsigned int length) { kick(length,true); } void Coilgun::kick(unsigned int length, bool change_state = true) { if(change_state) //Used to keep state when discharging changeState(kicking); chargePin = 0; // Maybe not needed anymore? (still a safety?) kickPin = 0; kickTimeout.attach_us(this, &Coilgun::kickEnd, length); } void Coilgun::kickEnd(void) { kickTimeout.detach(); kickPin = 1; if(state != discharging){ //Used when discharging chargePin = 1; // Don't start charging again state = idle; //(let state stay "discharging") } } void Coilgun::charge() { changeState(charging); kickPin = 1; chargePin = 1; } void Coilgun::chargeEnd(){ chargePin = 0; state = idle; } void Coilgun::discharge() { changeState(discharging); dischargeTimeout.attach(this, &Coilgun::dischargeEnd, 10.0); // End discharging after 10 seconds discharger.attach_us(this, &Coilgun::dischargeKick, 5000); // calls short kick every 5ms } void Coilgun::dischargeEnd(void) { discharger.detach(); state = idle; } void Coilgun::dischargeKick(void) { kick(500, false); } void Coilgun::changeState(State new_state){ switch(state){ case idle: //nothing to end. break; case kicking: kickEnd(); break; case charging: chargeEnd(); break; case discharging: dischargeEnd(); break; default: //error - no such state break; } //set new state state = new_state; }