CoilGun
coilgun.cpp@7:95d16e38d0d8, 2013-09-19 (annotated)
- Committer:
- Reiko
- Date:
- Thu Sep 19 13:11:48 2013 +0000
- Revision:
- 7:95d16e38d0d8
- Parent:
- 6:4c75db8a43db
- Child:
- 8:eee78d8bfdb9
Formatted some code
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 | 7:95d16e38d0d8 | 17 | if (change_state) {//Used to keep state when discharging |
Reiko | 6:4c75db8a43db | 18 | changeState(kicking); |
Reiko | 7:95d16e38d0d8 | 19 | } |
Reiko | 5:0e061c4013a2 | 20 | |
Reiko | 6:4c75db8a43db | 21 | chargePin = 0; // Maybe not needed anymore? (still a safety?) |
Reiko | 6:4c75db8a43db | 22 | kickPin = 0; |
Reiko | 6:4c75db8a43db | 23 | kickTimeout.attach_us(this, &Coilgun::kickEnd, length); |
Reiko | 6:4c75db8a43db | 24 | } |
Reiko | 0:2d5820be7f51 | 25 | |
Reiko | 6:4c75db8a43db | 26 | void Coilgun::kickEnd(void) { |
Reiko | 6:4c75db8a43db | 27 | kickTimeout.detach(); |
Reiko | 6:4c75db8a43db | 28 | kickPin = 1; |
Reiko | 6:4c75db8a43db | 29 | |
Reiko | 7:95d16e38d0d8 | 30 | if (state != discharging){ //Used when discharging |
Reiko | 6:4c75db8a43db | 31 | chargePin = 1; // Don't start charging again |
Reiko | 6:4c75db8a43db | 32 | state = idle; //(let state stay "discharging") |
Reiko | 5:0e061c4013a2 | 33 | } |
Reiko | 5:0e061c4013a2 | 34 | |
Reiko | 6:4c75db8a43db | 35 | } |
Reiko | 6:4c75db8a43db | 36 | |
Reiko | 6:4c75db8a43db | 37 | void Coilgun::charge() { |
Reiko | 6:4c75db8a43db | 38 | changeState(charging); |
Reiko | 6:4c75db8a43db | 39 | kickPin = 1; |
Reiko | 6:4c75db8a43db | 40 | chargePin = 1; |
Reiko | 6:4c75db8a43db | 41 | } |
Reiko | 6:4c75db8a43db | 42 | |
Reiko | 6:4c75db8a43db | 43 | void Coilgun::chargeEnd(){ |
Reiko | 6:4c75db8a43db | 44 | chargePin = 0; |
Reiko | 6:4c75db8a43db | 45 | state = idle; |
Reiko | 6:4c75db8a43db | 46 | } |
Reiko | 0:2d5820be7f51 | 47 | |
Reiko | 6:4c75db8a43db | 48 | void Coilgun::discharge() { |
Reiko | 6:4c75db8a43db | 49 | changeState(discharging); |
Reiko | 6:4c75db8a43db | 50 | dischargeTimeout.attach(this, &Coilgun::dischargeEnd, 10.0); // End discharging after 10 seconds |
Reiko | 6:4c75db8a43db | 51 | discharger.attach_us(this, &Coilgun::dischargeKick, 5000); // calls short kick every 5ms |
Reiko | 6:4c75db8a43db | 52 | } |
Reiko | 7:95d16e38d0d8 | 53 | |
Reiko | 6:4c75db8a43db | 54 | void Coilgun::dischargeEnd(void) { |
Reiko | 6:4c75db8a43db | 55 | discharger.detach(); |
Reiko | 6:4c75db8a43db | 56 | state = idle; |
Reiko | 6:4c75db8a43db | 57 | } |
Reiko | 7:95d16e38d0d8 | 58 | |
Reiko | 6:4c75db8a43db | 59 | void Coilgun::dischargeKick(void) { |
Reiko | 6:4c75db8a43db | 60 | kick(500, false); |
Reiko | 6:4c75db8a43db | 61 | } |
Reiko | 6:4c75db8a43db | 62 | |
Reiko | 6:4c75db8a43db | 63 | void Coilgun::changeState(State new_state){ |
Reiko | 6:4c75db8a43db | 64 | switch(state){ |
Reiko | 6:4c75db8a43db | 65 | case idle: |
Reiko | 7:95d16e38d0d8 | 66 | //nothing to end. |
Reiko | 7:95d16e38d0d8 | 67 | break; |
Reiko | 6:4c75db8a43db | 68 | case kicking: |
Reiko | 7:95d16e38d0d8 | 69 | kickEnd(); |
Reiko | 7:95d16e38d0d8 | 70 | break; |
Reiko | 6:4c75db8a43db | 71 | case charging: |
Reiko | 7:95d16e38d0d8 | 72 | chargeEnd(); |
Reiko | 7:95d16e38d0d8 | 73 | break; |
Reiko | 6:4c75db8a43db | 74 | case discharging: |
Reiko | 7:95d16e38d0d8 | 75 | dischargeEnd(); |
Reiko | 7:95d16e38d0d8 | 76 | break; |
Reiko | 6:4c75db8a43db | 77 | default: |
Reiko | 7:95d16e38d0d8 | 78 | //error - no such state |
Reiko | 7:95d16e38d0d8 | 79 | break; |
Reiko | 5:0e061c4013a2 | 80 | } |
Reiko | 6:4c75db8a43db | 81 | //set new state |
Reiko | 6:4c75db8a43db | 82 | state = new_state; |
Reiko | 6:4c75db8a43db | 83 | } |