Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Joystick.h@4:f2f560cb71fe, 2017-02-14 (annotated)
- Committer:
- vargham
- Date:
- Tue Feb 14 06:49:11 2017 +0000
- Revision:
- 4:f2f560cb71fe
- Parent:
- 3:cd36fdbb23f8
- Child:
- 5:48ba213dfbb3
Added auto process ticker option.
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 | 0:f76f52dc57f7 | 53 | #define JOYSTICK_CENTER_DEADZONE JOYSTICK_ADC_MAX / 50 |
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 | 4:f2f560cb71fe | 76 | Joystick(PinName pinX, PinName pinY, float processInterval = 0, 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 | 0:f76f52dc57f7 | 84 | , _swapXY(false) |
vargham | 0:f76f52dc57f7 | 85 | , _flipX(false) |
vargham | 0:f76f52dc57f7 | 86 | , _flipY(false) |
vargham | 0:f76f52dc57f7 | 87 | , _delta(0) |
vargham | 3:cd36fdbb23f8 | 88 | , _locked(false) |
vargham | 0:f76f52dc57f7 | 89 | , _onChange(onChange) |
vargham | 4:f2f560cb71fe | 90 | { |
vargham | 4:f2f560cb71fe | 91 | setAutoProcessInterval(processInterval); |
vargham | 4:f2f560cb71fe | 92 | }; |
vargham | 4:f2f560cb71fe | 93 | void process(void); |
vargham | 4:f2f560cb71fe | 94 | void setAutoProcessInterval(float processInterval) |
vargham | 4:f2f560cb71fe | 95 | { |
vargham | 4:f2f560cb71fe | 96 | _ticker.detach(); |
vargham | 4:f2f560cb71fe | 97 | if (processInterval != 0) _ticker.attach(Callback<void()>(this, &Joystick::process), processInterval); |
vargham | 4:f2f560cb71fe | 98 | }; |
vargham | 0:f76f52dc57f7 | 99 | void calibrate() |
vargham | 0:f76f52dc57f7 | 100 | { |
vargham | 0:f76f52dc57f7 | 101 | _center.x = JOYSTICK_ADC_MAX / 2; |
vargham | 0:f76f52dc57f7 | 102 | _center.y = JOYSTICK_ADC_MAX / 2; |
vargham | 0:f76f52dc57f7 | 103 | _calibrationCounter = 0; |
vargham | 0:f76f52dc57f7 | 104 | _calibrated = false; |
vargham | 0:f76f52dc57f7 | 105 | }; |
vargham | 0:f76f52dc57f7 | 106 | inline bool isCalibrated() const |
vargham | 0:f76f52dc57f7 | 107 | { |
vargham | 0:f76f52dc57f7 | 108 | return _calibrated; |
vargham | 0:f76f52dc57f7 | 109 | }; |
vargham | 3:cd36fdbb23f8 | 110 | inline bool isLocked() const |
vargham | 3:cd36fdbb23f8 | 111 | { |
vargham | 3:cd36fdbb23f8 | 112 | return _locked; |
vargham | 3:cd36fdbb23f8 | 113 | }; |
vargham | 3:cd36fdbb23f8 | 114 | inline void setLocked(bool locked) |
vargham | 3:cd36fdbb23f8 | 115 | { |
vargham | 3:cd36fdbb23f8 | 116 | _locked = locked; |
vargham | 3:cd36fdbb23f8 | 117 | }; |
vargham | 0:f76f52dc57f7 | 118 | inline bool isSwapXY() const |
vargham | 0:f76f52dc57f7 | 119 | { |
vargham | 0:f76f52dc57f7 | 120 | return _swapXY; |
vargham | 0:f76f52dc57f7 | 121 | }; |
vargham | 0:f76f52dc57f7 | 122 | inline void setSwapXY(bool swapXY) |
vargham | 0:f76f52dc57f7 | 123 | { |
vargham | 0:f76f52dc57f7 | 124 | _swapXY = swapXY; |
vargham | 0:f76f52dc57f7 | 125 | }; |
vargham | 0:f76f52dc57f7 | 126 | inline bool isFlipX() const |
vargham | 0:f76f52dc57f7 | 127 | { |
vargham | 0:f76f52dc57f7 | 128 | return _flipX; |
vargham | 0:f76f52dc57f7 | 129 | }; |
vargham | 0:f76f52dc57f7 | 130 | inline void setFlipX(bool flipX) |
vargham | 0:f76f52dc57f7 | 131 | { |
vargham | 0:f76f52dc57f7 | 132 | _flipX = flipX; |
vargham | 0:f76f52dc57f7 | 133 | }; |
vargham | 0:f76f52dc57f7 | 134 | inline bool isFlipY() const |
vargham | 0:f76f52dc57f7 | 135 | { |
vargham | 0:f76f52dc57f7 | 136 | return _flipY; |
vargham | 0:f76f52dc57f7 | 137 | }; |
vargham | 0:f76f52dc57f7 | 138 | inline void setFlipY(bool flipY) |
vargham | 0:f76f52dc57f7 | 139 | { |
vargham | 0:f76f52dc57f7 | 140 | _flipY = flipY; |
vargham | 0:f76f52dc57f7 | 141 | }; |
vargham | 0:f76f52dc57f7 | 142 | inline int getRange() const |
vargham | 0:f76f52dc57f7 | 143 | { |
vargham | 0:f76f52dc57f7 | 144 | return _range; |
vargham | 0:f76f52dc57f7 | 145 | }; |
vargham | 0:f76f52dc57f7 | 146 | inline void setRange(int range) |
vargham | 0:f76f52dc57f7 | 147 | { |
vargham | 0:f76f52dc57f7 | 148 | _range = range; |
vargham | 0:f76f52dc57f7 | 149 | }; |
vargham | 0:f76f52dc57f7 | 150 | inline int getDelta() const |
vargham | 0:f76f52dc57f7 | 151 | { |
vargham | 0:f76f52dc57f7 | 152 | return _delta; |
vargham | 0:f76f52dc57f7 | 153 | }; |
vargham | 0:f76f52dc57f7 | 154 | inline void setDelta(int delta) |
vargham | 0:f76f52dc57f7 | 155 | { |
vargham | 0:f76f52dc57f7 | 156 | _delta = delta; |
vargham | 0:f76f52dc57f7 | 157 | }; |
vargham | 0:f76f52dc57f7 | 158 | inline int getX() const |
vargham | 0:f76f52dc57f7 | 159 | { |
vargham | 0:f76f52dc57f7 | 160 | return _joyValue.x; |
vargham | 0:f76f52dc57f7 | 161 | }; |
vargham | 0:f76f52dc57f7 | 162 | inline int getY() const |
vargham | 0:f76f52dc57f7 | 163 | { |
vargham | 0:f76f52dc57f7 | 164 | return _joyValue.y; |
vargham | 0:f76f52dc57f7 | 165 | }; |
vargham | 0:f76f52dc57f7 | 166 | inline JoystickValue getCurrentValue() const |
vargham | 0:f76f52dc57f7 | 167 | { |
vargham | 0:f76f52dc57f7 | 168 | return _joyValue; |
vargham | 0:f76f52dc57f7 | 169 | }; |
vargham | 0:f76f52dc57f7 | 170 | private: |
vargham | 0:f76f52dc57f7 | 171 | AnalogIn _xIn; |
vargham | 0:f76f52dc57f7 | 172 | AnalogIn _yIn; |
vargham | 0:f76f52dc57f7 | 173 | JoystickValue _center; |
vargham | 0:f76f52dc57f7 | 174 | JoystickValue _joyValue; |
vargham | 0:f76f52dc57f7 | 175 | bool _calibrated; |
vargham | 0:f76f52dc57f7 | 176 | uint16_t _calibrationCounter; |
vargham | 0:f76f52dc57f7 | 177 | int _range; |
vargham | 0:f76f52dc57f7 | 178 | bool _swapXY; |
vargham | 0:f76f52dc57f7 | 179 | bool _flipX; |
vargham | 0:f76f52dc57f7 | 180 | bool _flipY; |
vargham | 0:f76f52dc57f7 | 181 | int _delta; |
vargham | 3:cd36fdbb23f8 | 182 | bool _locked; |
vargham | 0:f76f52dc57f7 | 183 | void(*_onChange)(JoystickValue value, JoystickValue prevValue); |
vargham | 4:f2f560cb71fe | 184 | Ticker _ticker; |
vargham | 0:f76f52dc57f7 | 185 | }; |
vargham | 0:f76f52dc57f7 | 186 | |
vargham | 0:f76f52dc57f7 | 187 | #endif //Joystick_h |
vargham | 0:f76f52dc57f7 | 188 |