CoilGun

Committer:
Reiko
Date:
Mon Nov 04 17:06:58 2013 +0000
Revision:
9:b663ba6a53fe
Parent:
8:eee78d8bfdb9
Removed done interrupt handling

Who changed what in which revision?

UserRevisionLine numberNew 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 }