CoilGun

Committer:
Reiko
Date:
Wed Sep 18 10:50:22 2013 +0000
Revision:
5:0e061c4013a2
Parent:
4:0e2bdd3d52bc
Child:
6:4c75db8a43db
Included pull request changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Reiko 5:0e061c4013a2 1 #include "coilgun.h"
Reiko 5:0e061c4013a2 2
Reiko 5:0e061c4013a2 3 Coilgun::Coilgun(PinName kickPinName ,PinName chargePinName, PinName donePinName):
Reiko 5:0e061c4013a2 4 kickPin(kickPinName),chargePin(chargePinName), donePin(donePinName)
Reiko 5:0e061c4013a2 5 {
Reiko 5:0e061c4013a2 6 state = idle;
Reiko 5:0e061c4013a2 7 kickPin = 1;
mlaane 3:7273ba733560 8 chargePin = 0;
Reiko 5:0e061c4013a2 9 donePin.fall(this, &Coilgun::chargeEnd);
Reiko 5:0e061c4013a2 10 }
Reiko 5:0e061c4013a2 11
Reiko 5:0e061c4013a2 12 void Coilgun::kick(unsigned int length) {
Reiko 5:0e061c4013a2 13 kick(length,true);
mlaane 3:7273ba733560 14 }
Reiko 5:0e061c4013a2 15
Reiko 5:0e061c4013a2 16 void Coilgun::kick(unsigned int length, bool change_state = true) {
Reiko 5:0e061c4013a2 17 if(change_state) //Used to keep state when discharging
Reiko 5:0e061c4013a2 18 changeState(kicking);
Reiko 5:0e061c4013a2 19
Reiko 5:0e061c4013a2 20 chargePin = 0; // Maybe not needed anymore? (still a safety?)
Reiko 5:0e061c4013a2 21 kickPin = 0;
Reiko 5:0e061c4013a2 22 kickTimeout.attach_us(this, &Coilgun::kickEnd, length);
Reiko 5:0e061c4013a2 23 }
Reiko 5:0e061c4013a2 24
Reiko 5:0e061c4013a2 25 void Coilgun::kickEnd(void) {
Reiko 5:0e061c4013a2 26 kickTimeout.detach();
Reiko 5:0e061c4013a2 27 kickPin = 1;
Reiko 0:2d5820be7f51 28
Reiko 5:0e061c4013a2 29 if(state != discharging){ //Used when discharging
Reiko 5:0e061c4013a2 30 chargePin = 1; // Don't start charging again
Reiko 5:0e061c4013a2 31 state = idle; //(let state stay "discharging")
Reiko 5:0e061c4013a2 32 }
Reiko 5:0e061c4013a2 33
Reiko 5:0e061c4013a2 34 }
Reiko 5:0e061c4013a2 35
Reiko 5:0e061c4013a2 36 void Coilgun::charge() {
Reiko 5:0e061c4013a2 37 changeState(charging);
mlaane 3:7273ba733560 38 kickPin = 1;
Reiko 5:0e061c4013a2 39 chargePin = 1;
Reiko 5:0e061c4013a2 40 }
Reiko 0:2d5820be7f51 41
Reiko 5:0e061c4013a2 42 void Coilgun::chargeEnd(){
Reiko 5:0e061c4013a2 43 chargePin = 0;
Reiko 5:0e061c4013a2 44 state = idle;
Reiko 5:0e061c4013a2 45 }
Reiko 5:0e061c4013a2 46
Reiko 5:0e061c4013a2 47 void Coilgun::discharge() {
Reiko 5:0e061c4013a2 48 changeState(discharging);
Reiko 5:0e061c4013a2 49 dischargeTimeout.attach(this, &Coilgun::dischargeEnd, 10.0); // End discharging after 10 seconds
Reiko 5:0e061c4013a2 50 discharger.attach_us(this, &Coilgun::dischargeKick, 5000); // calls short kick every 5ms
Reiko 5:0e061c4013a2 51 }
Reiko 5:0e061c4013a2 52 void Coilgun::dischargeEnd(void) {
Reiko 5:0e061c4013a2 53 discharger.detach();
Reiko 5:0e061c4013a2 54 state = idle;
Reiko 5:0e061c4013a2 55 }
Reiko 5:0e061c4013a2 56 void Coilgun::dischargeKick(void) {
Reiko 5:0e061c4013a2 57 kick(500, false);
Reiko 5:0e061c4013a2 58 }
Reiko 5:0e061c4013a2 59
Reiko 5:0e061c4013a2 60 void Coilgun::changeState(State new_state){
Reiko 5:0e061c4013a2 61 switch(state){
Reiko 5:0e061c4013a2 62 case idle:
Reiko 5:0e061c4013a2 63 //nothing to end.
Reiko 5:0e061c4013a2 64 break;
Reiko 5:0e061c4013a2 65 case kicking:
Reiko 5:0e061c4013a2 66 kickEnd();
Reiko 5:0e061c4013a2 67 break;
Reiko 5:0e061c4013a2 68 case charging:
Reiko 5:0e061c4013a2 69 chargeEnd();
Reiko 5:0e061c4013a2 70 break;
Reiko 5:0e061c4013a2 71 case discharging:
Reiko 5:0e061c4013a2 72 dischargeEnd();
Reiko 5:0e061c4013a2 73 break;
Reiko 5:0e061c4013a2 74 default:
Reiko 5:0e061c4013a2 75 //error - no such state
Reiko 5:0e061c4013a2 76 break;
Reiko 5:0e061c4013a2 77 }
Reiko 5:0e061c4013a2 78 //set new state
Reiko 5:0e061c4013a2 79 state = new_state;
Reiko 5:0e061c4013a2 80 }