ESE519 blank Joystick class
Dependents: ESE519_Lab6_part1_skeleton
Fork of Joystick_skelleton by
Joystick.cpp@0:46523bf02e61, 2016-10-18 (annotated)
- Committer:
- csharer
- Date:
- Tue Oct 18 20:26:41 2016 +0000
- Revision:
- 0:46523bf02e61
- Child:
- 1:c42a77267f7b
commented
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
csharer | 0:46523bf02e61 | 1 | #include "Joystick.h" |
csharer | 0:46523bf02e61 | 2 | #include "mbed.h" |
csharer | 0:46523bf02e61 | 3 | |
csharer | 0:46523bf02e61 | 4 | //Member function definitions including constructor |
csharer | 0:46523bf02e61 | 5 | Joystick::Joystick(PinName pinA, PinName pinB) : horiz(pinA), vert(pinB) { |
csharer | 0:46523bf02e61 | 6 | //Wait 1 second for voltage to settle |
csharer | 0:46523bf02e61 | 7 | wait(1); |
csharer | 0:46523bf02e61 | 8 | |
csharer | 0:46523bf02e61 | 9 | //Set Raw Center Values, this is where the joystick sits naturaly |
csharer | 0:46523bf02e61 | 10 | raw_hc = (horiz.read() + horiz.read() + horiz.read() + horiz.read() + horiz.read()) / 5.0; |
csharer | 0:46523bf02e61 | 11 | raw_vc = (vert.read() + vert.read() + vert.read() + vert.read() + vert.read()) / 5.0; |
csharer | 0:46523bf02e61 | 12 | |
csharer | 0:46523bf02e61 | 13 | //Initalize the Rax Max to some value less then then real max value. |
csharer | 0:46523bf02e61 | 14 | //We dont know what the max value will be until we read it. |
csharer | 0:46523bf02e61 | 15 | //But we can assume it will be greater then 0.8 (center + 0.3) |
csharer | 0:46523bf02e61 | 16 | //Now do the same for the the Raw Min |
csharer | 0:46523bf02e61 | 17 | float delta = 0.3; |
csharer | 0:46523bf02e61 | 18 | rawMinH = raw_hc - delta; rawMaxH = raw_hc + delta; |
csharer | 0:46523bf02e61 | 19 | rawMinV = raw_hc - delta; rawMaxV = raw_hc + delta; |
csharer | 0:46523bf02e61 | 20 | } |
csharer | 0:46523bf02e61 | 21 | |
csharer | 0:46523bf02e61 | 22 | //Returns the scaled vertial value of joystick |
csharer | 0:46523bf02e61 | 23 | float Joystick::horizontal(void) { |
csharer | 0:46523bf02e61 | 24 | //Get average val (5 samples) |
csharer | 0:46523bf02e61 | 25 | float avg = (horiz.read() + horiz.read() + horiz.read() + horiz.read() + horiz.read()) / 5.0; |
csharer | 0:46523bf02e61 | 26 | |
csharer | 0:46523bf02e61 | 27 | //Watch for Max and Min Values if we see a new max/min update Raw Max/Min |
csharer | 0:46523bf02e61 | 28 | if(avg > rawMaxH) |
csharer | 0:46523bf02e61 | 29 | rawMaxH = avg; |
csharer | 0:46523bf02e61 | 30 | if(avg < rawMinH) |
csharer | 0:46523bf02e61 | 31 | rawMinH = avg; |
csharer | 0:46523bf02e61 | 32 | |
csharer | 0:46523bf02e61 | 33 | |
csharer | 0:46523bf02e61 | 34 | //Here we will calculate the total range (Travel) of the joystick |
csharer | 0:46523bf02e61 | 35 | //using the rawMax/rawMin values we have seen thus far |
csharer | 0:46523bf02e61 | 36 | //Calculate the range from [center, max] and [center, min] |
csharer | 0:46523bf02e61 | 37 | float range_pos = rawMaxH - raw_hc; |
csharer | 0:46523bf02e61 | 38 | float range_neg = raw_hc - rawMinH; |
csharer | 0:46523bf02e61 | 39 | |
csharer | 0:46523bf02e61 | 40 | //Here we will calculate how much our current reading is in one |
csharer | 0:46523bf02e61 | 41 | //of the ranges to get a percentage |
csharer | 0:46523bf02e61 | 42 | //Then we can scale this by multiplying it by our scale (_max/_min) |
csharer | 0:46523bf02e61 | 43 | float val; |
csharer | 0:46523bf02e61 | 44 | if(avg >= raw_hc) |
csharer | 0:46523bf02e61 | 45 | val = ((avg - raw_hc) / range_pos) * _max; // percent to max * max |
csharer | 0:46523bf02e61 | 46 | else |
csharer | 0:46523bf02e61 | 47 | val = ((raw_hc - avg) / range_neg) * _min; //percent to min * min |
csharer | 0:46523bf02e61 | 48 | |
csharer | 0:46523bf02e61 | 49 | |
csharer | 0:46523bf02e61 | 50 | //Here we will apply a dead zone |
csharer | 0:46523bf02e61 | 51 | if((val <= DEAD_ZONE/2) && (val >= -DEAD_ZONE/2)) { |
csharer | 0:46523bf02e61 | 52 | return 0; |
csharer | 0:46523bf02e61 | 53 | } |
csharer | 0:46523bf02e61 | 54 | else if(val > DEAD_ZONE/2) {//posotive vals |
csharer | 0:46523bf02e61 | 55 | return val - DEAD_ZONE/2; |
csharer | 0:46523bf02e61 | 56 | } |
csharer | 0:46523bf02e61 | 57 | else { //negative vals |
csharer | 0:46523bf02e61 | 58 | return val + DEAD_ZONE/2; |
csharer | 0:46523bf02e61 | 59 | } |
csharer | 0:46523bf02e61 | 60 | } |
csharer | 0:46523bf02e61 | 61 | |
csharer | 0:46523bf02e61 | 62 | //Returns the scaled horizontal value of joystick |
csharer | 0:46523bf02e61 | 63 | float Joystick::vertical(void) { |
csharer | 0:46523bf02e61 | 64 | //Get average value |
csharer | 0:46523bf02e61 | 65 | float avg = (vert.read() + vert.read() + vert.read() + vert.read() + vert.read()) / 5.0; |
csharer | 0:46523bf02e61 | 66 | |
csharer | 0:46523bf02e61 | 67 | //Watch for Max and Min Values |
csharer | 0:46523bf02e61 | 68 | if(avg > rawMaxV) |
csharer | 0:46523bf02e61 | 69 | rawMaxV = avg; |
csharer | 0:46523bf02e61 | 70 | if(avg < rawMinV) |
csharer | 0:46523bf02e61 | 71 | rawMinV = avg; |
csharer | 0:46523bf02e61 | 72 | |
csharer | 0:46523bf02e61 | 73 | //Calculate Range (Total Travel of joystick) |
csharer | 0:46523bf02e61 | 74 | float range_pos = rawMaxV - raw_vc; |
csharer | 0:46523bf02e61 | 75 | float range_neg = raw_vc - rawMinV; |
csharer | 0:46523bf02e61 | 76 | |
csharer | 0:46523bf02e61 | 77 | float val; |
csharer | 0:46523bf02e61 | 78 | if(avg >= raw_vc) //find scaled pot value |
csharer | 0:46523bf02e61 | 79 | val = (((avg - raw_vc) / range_pos) * _max); |
csharer | 0:46523bf02e61 | 80 | else |
csharer | 0:46523bf02e61 | 81 | val = (((raw_vc - avg) / range_neg) * _min); |
csharer | 0:46523bf02e61 | 82 | |
csharer | 0:46523bf02e61 | 83 | //If val is in dead zone range return 0 |
csharer | 0:46523bf02e61 | 84 | if((val <= DEAD_ZONE/2) && (val >= -DEAD_ZONE/2)) { |
csharer | 0:46523bf02e61 | 85 | return 0; |
csharer | 0:46523bf02e61 | 86 | } |
csharer | 0:46523bf02e61 | 87 | //Else return val minus dead zone / 2 |
csharer | 0:46523bf02e61 | 88 | else if(val > DEAD_ZONE/2) {//posotive vals |
csharer | 0:46523bf02e61 | 89 | return val - DEAD_ZONE/2; |
csharer | 0:46523bf02e61 | 90 | } |
csharer | 0:46523bf02e61 | 91 | else { //negative vals |
csharer | 0:46523bf02e61 | 92 | return val + DEAD_ZONE/2; |
csharer | 0:46523bf02e61 | 93 | } |
csharer | 0:46523bf02e61 | 94 | } |
csharer | 0:46523bf02e61 | 95 | |
csharer | 0:46523bf02e61 | 96 | //Set the Min and Max Values of joystick ex: -100, +100 |
csharer | 0:46523bf02e61 | 97 | void Joystick::setScale(float min, float max) { |
csharer | 0:46523bf02e61 | 98 | _min = min; |
csharer | 0:46523bf02e61 | 99 | _max = max; |
csharer | 0:46523bf02e61 | 100 | } |