CoilGun
coilgun.cpp@5:0e061c4013a2, 2013-09-18 (annotated)
- 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?
User | Revision | Line number | New 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 | } |