Two axis analog (2x potmeter) joystick driver.
Joystick.h@5:48ba213dfbb3, 2017-03-16 (annotated)
- 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?
User | Revision | Line number | New 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 |