Two axis analog (2x potmeter) joystick driver.

Committer:
vargham
Date:
Thu Mar 16 12:35:54 2017 +0000
Revision:
5:48ba213dfbb3
Parent:
4:f2f560cb71fe
Added adjustable center deadzone.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vargham 1:a768d268191b 1 /** Two axis analog joystick driver
vargham 1:a768d268191b 2 *
vargham 1:a768d268191b 3 * Example:
vargham 1:a768d268191b 4 * @code
vargham 1:a768d268191b 5 * // Print joystick values
vargham 1:a768d268191b 6 *
vargham 1:a768d268191b 7 * #include "mbed.h"
vargham 1:a768d268191b 8 * #include "Joystick.h"
vargham 3:cd36fdbb23f8 9 *
vargham 1:a768d268191b 10 * Ticker joysticTicker;
vargham 1:a768d268191b 11 * Joystick joystick(PA_1, PA_0); //Two analog in pins
vargham 1:a768d268191b 12 * volatile bool processJoystick = false;
vargham 3:cd36fdbb23f8 13 *
vargham 1:a768d268191b 14 * void isrJoystick()
vargham 1:a768d268191b 15 * {
vargham 1:a768d268191b 16 * processJoystick = true;
vargham 1:a768d268191b 17 * }
vargham 3:cd36fdbb23f8 18 *
vargham 1:a768d268191b 19 * int main()
vargham 1:a768d268191b 20 * {
vargham 1:a768d268191b 21 * joystick.setFlipX(true);
vargham 1:a768d268191b 22 * joystick.setRange(100);
vargham 2:3fdaae41db20 23 * while (!joystick.isCalibrated())
vargham 2:3fdaae41db20 24 * {
vargham 2:3fdaae41db20 25 * joystick.process();
vargham 2:3fdaae41db20 26 * wait(0.05);
vargham 2:3fdaae41db20 27 * }
vargham 1:a768d268191b 28 * joysticTicker.attach(&isrJoystick, 0.1);
vargham 1:a768d268191b 29 * while (true)
vargham 1:a768d268191b 30 * {
vargham 1:a768d268191b 31 * if (processJoystick)
vargham 1:a768d268191b 32 * {
vargham 1:a768d268191b 33 * processJoystick = false;
vargham 1:a768d268191b 34 * joystick.process();
vargham 1:a768d268191b 35 * printf("X=%d Y=%d\r\n", joystick.getX(), joystick.getY());
vargham 1:a768d268191b 36 * }
vargham 1:a768d268191b 37 * }
vargham 1:a768d268191b 38 * }
vargham 1:a768d268191b 39 *
vargham 1:a768d268191b 40 */
vargham 1:a768d268191b 41
vargham 0:f76f52dc57f7 42 #ifndef Joystick_h
vargham 0:f76f52dc57f7 43 #define Joystick_h
vargham 0:f76f52dc57f7 44
vargham 0:f76f52dc57f7 45 #include "mbed.h"
vargham 0:f76f52dc57f7 46
vargham 0:f76f52dc57f7 47 #ifndef JOYSTICK_CALIBRATION_CYCLES
vargham 0:f76f52dc57f7 48 #define JOYSTICK_CALIBRATION_CYCLES 25
vargham 0:f76f52dc57f7 49 #endif
vargham 0:f76f52dc57f7 50 #ifndef JOYSTICK_ADC_MAX
vargham 0:f76f52dc57f7 51 #define JOYSTICK_ADC_MAX 0xFFFF
vargham 0:f76f52dc57f7 52 #endif
vargham 5:48ba213dfbb3 53 #define JOYSTICK_CENTER_DEADZONE JOYSTICK_ADC_MAX * _centerDeadzone
vargham 0:f76f52dc57f7 54
vargham 0:f76f52dc57f7 55 struct JoystickValue
vargham 0:f76f52dc57f7 56 {
vargham 0:f76f52dc57f7 57 JoystickValue()
vargham 0:f76f52dc57f7 58 : x(0)
vargham 0:f76f52dc57f7 59 , y(0)
vargham 0:f76f52dc57f7 60 {};
vargham 0:f76f52dc57f7 61 JoystickValue(int a)
vargham 0:f76f52dc57f7 62 : x(a)
vargham 0:f76f52dc57f7 63 , y(a)
vargham 0:f76f52dc57f7 64 {};
vargham 0:f76f52dc57f7 65 JoystickValue(int ax, int ay)
vargham 0:f76f52dc57f7 66 : x(ax)
vargham 0:f76f52dc57f7 67 , y(ay)
vargham 0:f76f52dc57f7 68 {};
vargham 0:f76f52dc57f7 69 int x;
vargham 0:f76f52dc57f7 70 int y;
vargham 0:f76f52dc57f7 71 };
vargham 0:f76f52dc57f7 72
vargham 0:f76f52dc57f7 73 class Joystick
vargham 0:f76f52dc57f7 74 {
vargham 0:f76f52dc57f7 75 public:
vargham 5:48ba213dfbb3 76 Joystick(PinName pinX, PinName pinY, float processInterval = 0, float centerDeadzone = 0.03f, void(*onChange)(JoystickValue value, JoystickValue prevValue) = NULL)
vargham 0:f76f52dc57f7 77 : _xIn(pinX)
vargham 0:f76f52dc57f7 78 , _yIn(pinY)
vargham 0:f76f52dc57f7 79 , _center(JOYSTICK_ADC_MAX / 2)
vargham 0:f76f52dc57f7 80 , _joyValue(0)
vargham 0:f76f52dc57f7 81 , _calibrated(false)
vargham 0:f76f52dc57f7 82 , _calibrationCounter(0)
vargham 0:f76f52dc57f7 83 , _range(JOYSTICK_ADC_MAX / 2)
vargham 5:48ba213dfbb3 84 , _centerDeadzone(centerDeadzone)
vargham 0:f76f52dc57f7 85 , _swapXY(false)
vargham 0:f76f52dc57f7 86 , _flipX(false)
vargham 0:f76f52dc57f7 87 , _flipY(false)
vargham 0:f76f52dc57f7 88 , _delta(0)
vargham 3:cd36fdbb23f8 89 , _locked(false)
vargham 0:f76f52dc57f7 90 , _onChange(onChange)
vargham 4:f2f560cb71fe 91 {
vargham 4:f2f560cb71fe 92 setAutoProcessInterval(processInterval);
vargham 4:f2f560cb71fe 93 };
vargham 5:48ba213dfbb3 94
vargham 4:f2f560cb71fe 95 void process(void);
vargham 5:48ba213dfbb3 96
vargham 4:f2f560cb71fe 97 void setAutoProcessInterval(float processInterval)
vargham 4:f2f560cb71fe 98 {
vargham 4:f2f560cb71fe 99 _ticker.detach();
vargham 4:f2f560cb71fe 100 if (processInterval != 0) _ticker.attach(Callback<void()>(this, &Joystick::process), processInterval);
vargham 4:f2f560cb71fe 101 };
vargham 5:48ba213dfbb3 102
vargham 0:f76f52dc57f7 103 void calibrate()
vargham 0:f76f52dc57f7 104 {
vargham 0:f76f52dc57f7 105 _center.x = JOYSTICK_ADC_MAX / 2;
vargham 0:f76f52dc57f7 106 _center.y = JOYSTICK_ADC_MAX / 2;
vargham 0:f76f52dc57f7 107 _calibrationCounter = 0;
vargham 0:f76f52dc57f7 108 _calibrated = false;
vargham 0:f76f52dc57f7 109 };
vargham 5:48ba213dfbb3 110
vargham 5:48ba213dfbb3 111 inline float getCenterDeadzone() const
vargham 5:48ba213dfbb3 112 {
vargham 5:48ba213dfbb3 113 return _centerDeadzone;
vargham 5:48ba213dfbb3 114 };
vargham 5:48ba213dfbb3 115
vargham 5:48ba213dfbb3 116 inline void setCenterDeadzone(float centerDeadzone)
vargham 5:48ba213dfbb3 117 {
vargham 5:48ba213dfbb3 118 if (centerDeadzone < 0 || centerDeadzone > 1) return;
vargham 5:48ba213dfbb3 119 _centerDeadzone = centerDeadzone;
vargham 5:48ba213dfbb3 120 };
vargham 5:48ba213dfbb3 121
vargham 0:f76f52dc57f7 122 inline bool isCalibrated() const
vargham 0:f76f52dc57f7 123 {
vargham 0:f76f52dc57f7 124 return _calibrated;
vargham 0:f76f52dc57f7 125 };
vargham 5:48ba213dfbb3 126
vargham 3:cd36fdbb23f8 127 inline bool isLocked() const
vargham 3:cd36fdbb23f8 128 {
vargham 3:cd36fdbb23f8 129 return _locked;
vargham 3:cd36fdbb23f8 130 };
vargham 5:48ba213dfbb3 131
vargham 3:cd36fdbb23f8 132 inline void setLocked(bool locked)
vargham 3:cd36fdbb23f8 133 {
vargham 3:cd36fdbb23f8 134 _locked = locked;
vargham 3:cd36fdbb23f8 135 };
vargham 5:48ba213dfbb3 136
vargham 0:f76f52dc57f7 137 inline bool isSwapXY() const
vargham 0:f76f52dc57f7 138 {
vargham 0:f76f52dc57f7 139 return _swapXY;
vargham 0:f76f52dc57f7 140 };
vargham 5:48ba213dfbb3 141
vargham 0:f76f52dc57f7 142 inline void setSwapXY(bool swapXY)
vargham 0:f76f52dc57f7 143 {
vargham 0:f76f52dc57f7 144 _swapXY = swapXY;
vargham 0:f76f52dc57f7 145 };
vargham 5:48ba213dfbb3 146
vargham 0:f76f52dc57f7 147 inline bool isFlipX() const
vargham 0:f76f52dc57f7 148 {
vargham 0:f76f52dc57f7 149 return _flipX;
vargham 0:f76f52dc57f7 150 };
vargham 5:48ba213dfbb3 151
vargham 0:f76f52dc57f7 152 inline void setFlipX(bool flipX)
vargham 0:f76f52dc57f7 153 {
vargham 0:f76f52dc57f7 154 _flipX = flipX;
vargham 0:f76f52dc57f7 155 };
vargham 5:48ba213dfbb3 156
vargham 0:f76f52dc57f7 157 inline bool isFlipY() const
vargham 0:f76f52dc57f7 158 {
vargham 0:f76f52dc57f7 159 return _flipY;
vargham 0:f76f52dc57f7 160 };
vargham 5:48ba213dfbb3 161
vargham 0:f76f52dc57f7 162 inline void setFlipY(bool flipY)
vargham 0:f76f52dc57f7 163 {
vargham 0:f76f52dc57f7 164 _flipY = flipY;
vargham 0:f76f52dc57f7 165 };
vargham 5:48ba213dfbb3 166
vargham 0:f76f52dc57f7 167 inline int getRange() const
vargham 0:f76f52dc57f7 168 {
vargham 0:f76f52dc57f7 169 return _range;
vargham 0:f76f52dc57f7 170 };
vargham 5:48ba213dfbb3 171
vargham 0:f76f52dc57f7 172 inline void setRange(int range)
vargham 0:f76f52dc57f7 173 {
vargham 0:f76f52dc57f7 174 _range = range;
vargham 0:f76f52dc57f7 175 };
vargham 5:48ba213dfbb3 176
vargham 0:f76f52dc57f7 177 inline int getDelta() const
vargham 0:f76f52dc57f7 178 {
vargham 0:f76f52dc57f7 179 return _delta;
vargham 0:f76f52dc57f7 180 };
vargham 5:48ba213dfbb3 181
vargham 0:f76f52dc57f7 182 inline void setDelta(int delta)
vargham 0:f76f52dc57f7 183 {
vargham 0:f76f52dc57f7 184 _delta = delta;
vargham 0:f76f52dc57f7 185 };
vargham 5:48ba213dfbb3 186
vargham 0:f76f52dc57f7 187 inline int getX() const
vargham 0:f76f52dc57f7 188 {
vargham 0:f76f52dc57f7 189 return _joyValue.x;
vargham 0:f76f52dc57f7 190 };
vargham 5:48ba213dfbb3 191
vargham 0:f76f52dc57f7 192 inline int getY() const
vargham 0:f76f52dc57f7 193 {
vargham 0:f76f52dc57f7 194 return _joyValue.y;
vargham 0:f76f52dc57f7 195 };
vargham 5:48ba213dfbb3 196
vargham 0:f76f52dc57f7 197 inline JoystickValue getCurrentValue() const
vargham 0:f76f52dc57f7 198 {
vargham 0:f76f52dc57f7 199 return _joyValue;
vargham 0:f76f52dc57f7 200 };
vargham 5:48ba213dfbb3 201
vargham 0:f76f52dc57f7 202 private:
vargham 0:f76f52dc57f7 203 AnalogIn _xIn;
vargham 0:f76f52dc57f7 204 AnalogIn _yIn;
vargham 0:f76f52dc57f7 205 JoystickValue _center;
vargham 0:f76f52dc57f7 206 JoystickValue _joyValue;
vargham 0:f76f52dc57f7 207 bool _calibrated;
vargham 0:f76f52dc57f7 208 uint16_t _calibrationCounter;
vargham 0:f76f52dc57f7 209 int _range;
vargham 5:48ba213dfbb3 210 float _centerDeadzone;
vargham 0:f76f52dc57f7 211 bool _swapXY;
vargham 0:f76f52dc57f7 212 bool _flipX;
vargham 0:f76f52dc57f7 213 bool _flipY;
vargham 0:f76f52dc57f7 214 int _delta;
vargham 3:cd36fdbb23f8 215 bool _locked;
vargham 0:f76f52dc57f7 216 void(*_onChange)(JoystickValue value, JoystickValue prevValue);
vargham 4:f2f560cb71fe 217 Ticker _ticker;
vargham 0:f76f52dc57f7 218 };
vargham 0:f76f52dc57f7 219
vargham 0:f76f52dc57f7 220 #endif //Joystick_h
vargham 0:f76f52dc57f7 221