DoubleCoilGun

Dependents:   Telliskivi2_2014

Fork of CoilGun by Reiko Randoja

coilgun.cpp

Committer:
Reiko
Date:
2013-09-18
Revision:
6:4c75db8a43db
Parent:
5:0e061c4013a2
Child:
7:95d16e38d0d8

File content as of revision 6:4c75db8a43db:

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