A class to handle reading, scaling and filtering horizontal and vertical position, and rise/fall interrupts for the button.

Committer:
alex89_2
Date:
Tue Sep 28 16:32:20 2010 +0000
Revision:
4:beeaa40d49fa
Parent:
0:9c486d50434e
Updated scale values - 0.51 midmin to 0.49, 0.55 midmax to 0.57

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alex89_2 0:9c486d50434e 1 #include "Joystick.h"
alex89_2 0:9c486d50434e 2
alex89_2 0:9c486d50434e 3 AnalogIn hin(p19);
alex89_2 0:9c486d50434e 4 AnalogIn vin(p18);
alex89_2 0:9c486d50434e 5
alex89_2 0:9c486d50434e 6 joyhv last = {0.5,0.5};
alex89_2 0:9c486d50434e 7
alex89_2 0:9c486d50434e 8 double scaleb(double min, double max, double bmin, double bmax, double num){
alex89_2 0:9c486d50434e 9 double shifted = num + (bmin - min); //shifted bmin down to min
alex89_2 0:9c486d50434e 10 return (shifted - min) * (bmax-bmin)/(max-min) + min; //scaled bmax to max
alex89_2 0:9c486d50434e 11 }
alex89_2 0:9c486d50434e 12
alex89_2 0:9c486d50434e 13 double doscale(double pos){
alex89_2 0:9c486d50434e 14 double min, max, midmin, midmax, scaled;
alex89_2 0:9c486d50434e 15
alex89_2 0:9c486d50434e 16 min = 0.087;
alex89_2 0:9c486d50434e 17 max = 0.98;
alex89_2 0:9c486d50434e 18
alex89_2 4:beeaa40d49fa 19 midmin = 0.49;
alex89_2 4:beeaa40d49fa 20 midmax = 0.57;
alex89_2 0:9c486d50434e 21
alex89_2 0:9c486d50434e 22
alex89_2 0:9c486d50434e 23 if(pos < midmin){ // lower than 0.5 tolerance - backwards
alex89_2 0:9c486d50434e 24 scaled = scaleb(min, midmin, 0, 0.5, pos);
alex89_2 0:9c486d50434e 25 } else if (pos > midmax){ //greater than 0.5 tolerance - forwards
alex89_2 0:9c486d50434e 26 scaled = scaleb(midmax, max, 0.5, 1, pos);
alex89_2 0:9c486d50434e 27 } else {
alex89_2 0:9c486d50434e 28 scaled = 0.5;
alex89_2 0:9c486d50434e 29 }
alex89_2 0:9c486d50434e 30
alex89_2 0:9c486d50434e 31 //check if out of bounds [0,1]
alex89_2 0:9c486d50434e 32
alex89_2 0:9c486d50434e 33 if(scaled < 0)
alex89_2 0:9c486d50434e 34 scaled = 0;
alex89_2 0:9c486d50434e 35
alex89_2 0:9c486d50434e 36 if(scaled > 1)
alex89_2 0:9c486d50434e 37 scaled = 1;
alex89_2 0:9c486d50434e 38
alex89_2 0:9c486d50434e 39 return scaled;
alex89_2 0:9c486d50434e 40 }
alex89_2 0:9c486d50434e 41
alex89_2 0:9c486d50434e 42
alex89_2 0:9c486d50434e 43 double dofilter(double last, double num, double factor){
alex89_2 0:9c486d50434e 44
alex89_2 0:9c486d50434e 45 return last*factor + num*(1-factor);
alex89_2 0:9c486d50434e 46
alex89_2 0:9c486d50434e 47 }
alex89_2 0:9c486d50434e 48
alex89_2 0:9c486d50434e 49 Joystick::Joystick(PinName b, PinName h, PinName v) : _b(b), _h(h), _v(v) {
alex89_2 0:9c486d50434e 50 }
alex89_2 0:9c486d50434e 51
alex89_2 0:9c486d50434e 52 Joystick::operator joyhv (){
alex89_2 0:9c486d50434e 53 joyhv data;
alex89_2 0:9c486d50434e 54 data.v = _v.read();
alex89_2 0:9c486d50434e 55 data.h = _h.read();
alex89_2 0:9c486d50434e 56 return data;
alex89_2 0:9c486d50434e 57 }
alex89_2 0:9c486d50434e 58
alex89_2 0:9c486d50434e 59 double Joystick::getV (){
alex89_2 0:9c486d50434e 60 return _v.read();
alex89_2 0:9c486d50434e 61 }
alex89_2 0:9c486d50434e 62
alex89_2 0:9c486d50434e 63 double Joystick::getH (){
alex89_2 0:9c486d50434e 64 return _h.read();
alex89_2 0:9c486d50434e 65 }
alex89_2 0:9c486d50434e 66
alex89_2 0:9c486d50434e 67 void Joystick::rise (void (*fptr)(void)){
alex89_2 0:9c486d50434e 68 _b.rise(fptr);
alex89_2 0:9c486d50434e 69 }
alex89_2 0:9c486d50434e 70
alex89_2 0:9c486d50434e 71 void Joystick::fall (void (*fptr)(void)){
alex89_2 0:9c486d50434e 72 _b.fall(fptr);
alex89_2 0:9c486d50434e 73 }
alex89_2 0:9c486d50434e 74
alex89_2 0:9c486d50434e 75 //simple filtering
alex89_2 0:9c486d50434e 76 joyhv Joystick::filter(joyhv read, double factor){
alex89_2 0:9c486d50434e 77
alex89_2 0:9c486d50434e 78 joyhv filtered = {0.5,0.5};
alex89_2 0:9c486d50434e 79
alex89_2 0:9c486d50434e 80 filtered.v = dofilter(last.v, read.v, factor);
alex89_2 0:9c486d50434e 81 filtered.h = dofilter(last.h, read.h, factor);
alex89_2 0:9c486d50434e 82
alex89_2 0:9c486d50434e 83 last.v = filtered.v;
alex89_2 0:9c486d50434e 84 last.h = filtered.h;
alex89_2 0:9c486d50434e 85
alex89_2 0:9c486d50434e 86 return filtered;
alex89_2 0:9c486d50434e 87 }
alex89_2 0:9c486d50434e 88
alex89_2 0:9c486d50434e 89 joyhv Joystick::scale(joyhv read){
alex89_2 0:9c486d50434e 90
alex89_2 0:9c486d50434e 91 joyhv scaled = {0.5,0.5};
alex89_2 0:9c486d50434e 92
alex89_2 0:9c486d50434e 93 scaled.v = doscale(read.v);
alex89_2 0:9c486d50434e 94 scaled.h = doscale(read.h);
alex89_2 0:9c486d50434e 95
alex89_2 0:9c486d50434e 96 return scaled;
alex89_2 0:9c486d50434e 97
alex89_2 0:9c486d50434e 98 }