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@3:cd36fdbb23f8, 2017-02-13 (annotated)
- Committer:
- vargham
- Date:
- Mon Feb 13 07:10:23 2017 +0000
- Revision:
- 3:cd36fdbb23f8
- Parent:
- 2:3fdaae41db20
- Child:
- 4:f2f560cb71fe
Added option to lock readout.
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 | 0:f76f52dc57f7 | 76 | Joystick(PinName pinX, PinName pinY, 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 | 0:f76f52dc57f7 | 90 | {}; |
vargham | 0:f76f52dc57f7 | 91 | void process(); |
vargham | 0:f76f52dc57f7 | 92 | void calibrate() |
vargham | 0:f76f52dc57f7 | 93 | { |
vargham | 0:f76f52dc57f7 | 94 | _center.x = JOYSTICK_ADC_MAX / 2; |
vargham | 0:f76f52dc57f7 | 95 | _center.y = JOYSTICK_ADC_MAX / 2; |
vargham | 0:f76f52dc57f7 | 96 | _calibrationCounter = 0; |
vargham | 0:f76f52dc57f7 | 97 | _calibrated = false; |
vargham | 0:f76f52dc57f7 | 98 | }; |
vargham | 0:f76f52dc57f7 | 99 | inline bool isCalibrated() const |
vargham | 0:f76f52dc57f7 | 100 | { |
vargham | 0:f76f52dc57f7 | 101 | return _calibrated; |
vargham | 0:f76f52dc57f7 | 102 | }; |
vargham | 3:cd36fdbb23f8 | 103 | inline bool isLocked() const |
vargham | 3:cd36fdbb23f8 | 104 | { |
vargham | 3:cd36fdbb23f8 | 105 | return _locked; |
vargham | 3:cd36fdbb23f8 | 106 | }; |
vargham | 3:cd36fdbb23f8 | 107 | inline void setLocked(bool locked) |
vargham | 3:cd36fdbb23f8 | 108 | { |
vargham | 3:cd36fdbb23f8 | 109 | _locked = locked; |
vargham | 3:cd36fdbb23f8 | 110 | }; |
vargham | 0:f76f52dc57f7 | 111 | inline bool isSwapXY() const |
vargham | 0:f76f52dc57f7 | 112 | { |
vargham | 0:f76f52dc57f7 | 113 | return _swapXY; |
vargham | 0:f76f52dc57f7 | 114 | }; |
vargham | 0:f76f52dc57f7 | 115 | inline void setSwapXY(bool swapXY) |
vargham | 0:f76f52dc57f7 | 116 | { |
vargham | 0:f76f52dc57f7 | 117 | _swapXY = swapXY; |
vargham | 0:f76f52dc57f7 | 118 | }; |
vargham | 0:f76f52dc57f7 | 119 | inline bool isFlipX() const |
vargham | 0:f76f52dc57f7 | 120 | { |
vargham | 0:f76f52dc57f7 | 121 | return _flipX; |
vargham | 0:f76f52dc57f7 | 122 | }; |
vargham | 0:f76f52dc57f7 | 123 | inline void setFlipX(bool flipX) |
vargham | 0:f76f52dc57f7 | 124 | { |
vargham | 0:f76f52dc57f7 | 125 | _flipX = flipX; |
vargham | 0:f76f52dc57f7 | 126 | }; |
vargham | 0:f76f52dc57f7 | 127 | inline bool isFlipY() const |
vargham | 0:f76f52dc57f7 | 128 | { |
vargham | 0:f76f52dc57f7 | 129 | return _flipY; |
vargham | 0:f76f52dc57f7 | 130 | }; |
vargham | 0:f76f52dc57f7 | 131 | inline void setFlipY(bool flipY) |
vargham | 0:f76f52dc57f7 | 132 | { |
vargham | 0:f76f52dc57f7 | 133 | _flipY = flipY; |
vargham | 0:f76f52dc57f7 | 134 | }; |
vargham | 0:f76f52dc57f7 | 135 | inline int getRange() const |
vargham | 0:f76f52dc57f7 | 136 | { |
vargham | 0:f76f52dc57f7 | 137 | return _range; |
vargham | 0:f76f52dc57f7 | 138 | }; |
vargham | 0:f76f52dc57f7 | 139 | inline void setRange(int range) |
vargham | 0:f76f52dc57f7 | 140 | { |
vargham | 0:f76f52dc57f7 | 141 | _range = range; |
vargham | 0:f76f52dc57f7 | 142 | }; |
vargham | 0:f76f52dc57f7 | 143 | inline int getDelta() const |
vargham | 0:f76f52dc57f7 | 144 | { |
vargham | 0:f76f52dc57f7 | 145 | return _delta; |
vargham | 0:f76f52dc57f7 | 146 | }; |
vargham | 0:f76f52dc57f7 | 147 | inline void setDelta(int delta) |
vargham | 0:f76f52dc57f7 | 148 | { |
vargham | 0:f76f52dc57f7 | 149 | _delta = delta; |
vargham | 0:f76f52dc57f7 | 150 | }; |
vargham | 0:f76f52dc57f7 | 151 | inline int getX() const |
vargham | 0:f76f52dc57f7 | 152 | { |
vargham | 0:f76f52dc57f7 | 153 | return _joyValue.x; |
vargham | 0:f76f52dc57f7 | 154 | }; |
vargham | 0:f76f52dc57f7 | 155 | inline int getY() const |
vargham | 0:f76f52dc57f7 | 156 | { |
vargham | 0:f76f52dc57f7 | 157 | return _joyValue.y; |
vargham | 0:f76f52dc57f7 | 158 | }; |
vargham | 0:f76f52dc57f7 | 159 | inline JoystickValue getCurrentValue() const |
vargham | 0:f76f52dc57f7 | 160 | { |
vargham | 0:f76f52dc57f7 | 161 | return _joyValue; |
vargham | 0:f76f52dc57f7 | 162 | }; |
vargham | 0:f76f52dc57f7 | 163 | private: |
vargham | 0:f76f52dc57f7 | 164 | AnalogIn _xIn; |
vargham | 0:f76f52dc57f7 | 165 | AnalogIn _yIn; |
vargham | 0:f76f52dc57f7 | 166 | JoystickValue _center; |
vargham | 0:f76f52dc57f7 | 167 | JoystickValue _joyValue; |
vargham | 0:f76f52dc57f7 | 168 | bool _calibrated; |
vargham | 0:f76f52dc57f7 | 169 | uint16_t _calibrationCounter; |
vargham | 0:f76f52dc57f7 | 170 | int _range; |
vargham | 0:f76f52dc57f7 | 171 | bool _swapXY; |
vargham | 0:f76f52dc57f7 | 172 | bool _flipX; |
vargham | 0:f76f52dc57f7 | 173 | bool _flipY; |
vargham | 0:f76f52dc57f7 | 174 | int _delta; |
vargham | 3:cd36fdbb23f8 | 175 | bool _locked; |
vargham | 0:f76f52dc57f7 | 176 | void(*_onChange)(JoystickValue value, JoystickValue prevValue); |
vargham | 0:f76f52dc57f7 | 177 | }; |
vargham | 0:f76f52dc57f7 | 178 | |
vargham | 0:f76f52dc57f7 | 179 | #endif //Joystick_h |
vargham | 0:f76f52dc57f7 | 180 |