A class to handle reading, scaling and filtering horizontal and vertical position, and rise/fall interrupts for the button.
Joystick.cpp@0:9c486d50434e, 2010-09-28 (annotated)
- Committer:
- alex89_2
- Date:
- Tue Sep 28 14:59:57 2010 +0000
- Revision:
- 0:9c486d50434e
- Child:
- 4:beeaa40d49fa
Release to public
Who changed what in which revision?
User | Revision | Line number | New 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 | 0:9c486d50434e | 19 | midmin = 0.51; |
alex89_2 | 0:9c486d50434e | 20 | midmax = 0.56; |
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 | } |