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