ESE519 blank Joystick class
Dependents: ESE519_Lab6_part1_skeleton
Fork of Joystick_skelleton by
Joystick.cpp
- Committer:
- csharer
- Date:
- 2016-10-20
- Revision:
- 1:c42a77267f7b
- Parent:
- 0:46523bf02e61
- Child:
- 2:893fd930d3fb
File content as of revision 1:c42a77267f7b:
//Joystick (FULL IMPLIMENTATION) //Author: Carter Sharer //Date: 10/18/16 #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) + DEAD_ZONE/2; // percent to max * max else val = (((raw_hc - avg) / range_neg) * _min) - DEAD_ZONE/2; //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) + DEAD_ZONE/2; else val = (((raw_vc - avg) / range_neg) * _min) - DEAD_ZONE/2; //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-1; //Add 1 for round off error _max = max+1; //Add 1 for round off error }