519_La
Fork of Joystick_skeleton by
Diff: Joystick.cpp
- Revision:
- 0:46523bf02e61
- Child:
- 1:c42a77267f7b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Joystick.cpp Tue Oct 18 20:26:41 2016 +0000 @@ -0,0 +1,100 @@ +#include "Joystick.h" +#include "mbed.h" + +//Member function definitions including constructor +Joystick::Joystick(PinName pinA, PinName pinB) : horiz(pinA), vert(pinB) { + //Wait 1 second for voltage to settle + wait(1); + + //Set Raw Center Values, this is where the joystick sits naturaly + raw_hc = (horiz.read() + horiz.read() + horiz.read() + horiz.read() + horiz.read()) / 5.0; + raw_vc = (vert.read() + vert.read() + vert.read() + vert.read() + vert.read()) / 5.0; + + //Initalize the Rax Max to some value less then then real max value. + //We dont know what the max value will be until we read it. + //But we can assume it will be greater then 0.8 (center + 0.3) + //Now do the same for the the Raw Min + float delta = 0.3; + rawMinH = raw_hc - delta; rawMaxH = raw_hc + delta; + rawMinV = raw_hc - delta; rawMaxV = raw_hc + delta; +} + +//Returns the scaled vertial value of joystick +float Joystick::horizontal(void) { + //Get average val (5 samples) + float avg = (horiz.read() + horiz.read() + horiz.read() + horiz.read() + horiz.read()) / 5.0; + + //Watch for Max and Min Values if we see a new max/min update Raw Max/Min + if(avg > rawMaxH) + rawMaxH = avg; + if(avg < rawMinH) + rawMinH = avg; + + + //Here we will calculate the total range (Travel) of the joystick + //using the rawMax/rawMin values we have seen thus far + //Calculate the range from [center, max] and [center, min] + float range_pos = rawMaxH - raw_hc; + float range_neg = raw_hc - rawMinH; + + //Here we will calculate how much our current reading is in one + //of the ranges to get a percentage + //Then we can scale this by multiplying it by our scale (_max/_min) + float val; + if(avg >= raw_hc) + val = ((avg - raw_hc) / range_pos) * _max; // percent to max * max + else + val = ((raw_hc - avg) / range_neg) * _min; //percent to min * min + + + //Here we will apply a dead zone + if((val <= DEAD_ZONE/2) && (val >= -DEAD_ZONE/2)) { + return 0; + } + else if(val > DEAD_ZONE/2) {//posotive vals + return val - DEAD_ZONE/2; + } + else { //negative vals + return val + DEAD_ZONE/2; + } +} + +//Returns the scaled horizontal value of joystick +float Joystick::vertical(void) { + //Get average value + float avg = (vert.read() + vert.read() + vert.read() + vert.read() + vert.read()) / 5.0; + + //Watch for Max and Min Values + if(avg > rawMaxV) + rawMaxV = avg; + if(avg < rawMinV) + rawMinV = avg; + + //Calculate Range (Total Travel of joystick) + float range_pos = rawMaxV - raw_vc; + float range_neg = raw_vc - rawMinV; + + float val; + if(avg >= raw_vc) //find scaled pot value + val = (((avg - raw_vc) / range_pos) * _max); + else + val = (((raw_vc - avg) / range_neg) * _min); + + //If val is in dead zone range return 0 + if((val <= DEAD_ZONE/2) && (val >= -DEAD_ZONE/2)) { + return 0; + } + //Else return val minus dead zone / 2 + else if(val > DEAD_ZONE/2) {//posotive vals + return val - DEAD_ZONE/2; + } + else { //negative vals + return val + DEAD_ZONE/2; + } +} + +//Set the Min and Max Values of joystick ex: -100, +100 +void Joystick::setScale(float min, float max) { + _min = min; + _max = max; +} \ No newline at end of file