CoilGun

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?

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