CoilGun

coilgun.cpp

Committer:
mlaane
Date:
2013-09-14
Revision:
4:0e2bdd3d52bc
Parent:
3:7273ba733560
Child:
5:0e061c4013a2

File content as of revision 4:0e2bdd3d52bc:

#include "coilgun.h"

CoilGun::CoilGun(PinName chargePinName, PinName kickPinName, PinName donePinName)
    : chargePin(chargePinName), kickPin(kickPinName), donePin(donePinName) {
    kicking = false;
    discharging = false;
    kickPin = 1;
    chargePin = 0;
    donePin.fall(this, &CoilGun::doneCallback);
}

void CoilGun::kick(unsigned int length) {
    if (!kicking){
        chargePin = 0;
        kicking = true; 
        kickPin = 0;
        kickTimeout.attach_us(this, &CoilGun::kickEnd, length);
    }
}

void CoilGun::kickEnd(void) {
    kickTimeout.detach();
    kickPin = 1;
    chargePin = 1;
    kicking = false;
}

void CoilGun::setCharge(bool chargeState) {
    if (chargeState) {
        if (discharging)
            dischargeEnd();
        kickPin = 1;
        chargePin = 1;
    } else {
        chargePin = 0;
    }    
}

void CoilGun::discharge() {
    setCharge(false);
    discharging = true;
    dischargeTimeout.attach(this, &CoilGun::dischargeEnd, 5.0); // End discharging after 5 seconds
    discharger.attach_us(this, &CoilGun::dischargeKick, 5000); // calls short kick every 5ms
}
void CoilGun::dischargeKick(void) {
    kick(1000);
}
void CoilGun::dischargeEnd(void) {
    discharger.detach();
    discharging = false;
}

void CoilGun::doneCallback(void) {
    chargePin = 0;
}