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
- 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;
}
