CoilGun

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?

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 {
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 }