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