Two axis analog (2x potmeter) joystick driver.
Joystick.h@1:a768d268191b, 2017-02-09 (annotated)
- Committer:
- vargham
- Date:
- Thu Feb 09 19:32:17 2017 +0000
- Revision:
- 1:a768d268191b
- Parent:
- 0:f76f52dc57f7
- Child:
- 2:3fdaae41db20
Added example.
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 | 1:a768d268191b | 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 | 1:a768d268191b | 13 | * |
vargham | 1:a768d268191b | 14 | * void isrJoystick() |
vargham | 1:a768d268191b | 15 | * { |
vargham | 1:a768d268191b | 16 | * processJoystick = true; |
vargham | 1:a768d268191b | 17 | * } |
vargham | 1:a768d268191b | 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 | 1:a768d268191b | 23 | * while (!joystick.isCalibrated()) joystick.process(); |
vargham | 1:a768d268191b | 24 | * joysticTicker.attach(&isrJoystick, 0.1); |
vargham | 1:a768d268191b | 25 | * while (true) |
vargham | 1:a768d268191b | 26 | * { |
vargham | 1:a768d268191b | 27 | * if (processJoystick) |
vargham | 1:a768d268191b | 28 | * { |
vargham | 1:a768d268191b | 29 | * processJoystick = false; |
vargham | 1:a768d268191b | 30 | * joystick.process(); |
vargham | 1:a768d268191b | 31 | * printf("X=%d Y=%d\r\n", joystick.getX(), joystick.getY()); |
vargham | 1:a768d268191b | 32 | * } |
vargham | 1:a768d268191b | 33 | * } |
vargham | 1:a768d268191b | 34 | * } |
vargham | 1:a768d268191b | 35 | * |
vargham | 1:a768d268191b | 36 | */ |
vargham | 1:a768d268191b | 37 | |
vargham | 0:f76f52dc57f7 | 38 | #ifndef Joystick_h |
vargham | 0:f76f52dc57f7 | 39 | #define Joystick_h |
vargham | 0:f76f52dc57f7 | 40 | |
vargham | 0:f76f52dc57f7 | 41 | #include "mbed.h" |
vargham | 0:f76f52dc57f7 | 42 | |
vargham | 0:f76f52dc57f7 | 43 | #ifndef JOYSTICK_CALIBRATION_CYCLES |
vargham | 0:f76f52dc57f7 | 44 | #define JOYSTICK_CALIBRATION_CYCLES 25 |
vargham | 0:f76f52dc57f7 | 45 | #endif |
vargham | 0:f76f52dc57f7 | 46 | #ifndef JOYSTICK_ADC_MAX |
vargham | 0:f76f52dc57f7 | 47 | #define JOYSTICK_ADC_MAX 0xFFFF |
vargham | 0:f76f52dc57f7 | 48 | #endif |
vargham | 0:f76f52dc57f7 | 49 | #define JOYSTICK_CENTER_DEADZONE JOYSTICK_ADC_MAX / 50 |
vargham | 0:f76f52dc57f7 | 50 | |
vargham | 0:f76f52dc57f7 | 51 | struct JoystickValue |
vargham | 0:f76f52dc57f7 | 52 | { |
vargham | 0:f76f52dc57f7 | 53 | JoystickValue() |
vargham | 0:f76f52dc57f7 | 54 | : x(0) |
vargham | 0:f76f52dc57f7 | 55 | , y(0) |
vargham | 0:f76f52dc57f7 | 56 | {}; |
vargham | 0:f76f52dc57f7 | 57 | JoystickValue(int a) |
vargham | 0:f76f52dc57f7 | 58 | : x(a) |
vargham | 0:f76f52dc57f7 | 59 | , y(a) |
vargham | 0:f76f52dc57f7 | 60 | {}; |
vargham | 0:f76f52dc57f7 | 61 | JoystickValue(int ax, int ay) |
vargham | 0:f76f52dc57f7 | 62 | : x(ax) |
vargham | 0:f76f52dc57f7 | 63 | , y(ay) |
vargham | 0:f76f52dc57f7 | 64 | {}; |
vargham | 0:f76f52dc57f7 | 65 | int x; |
vargham | 0:f76f52dc57f7 | 66 | int y; |
vargham | 0:f76f52dc57f7 | 67 | }; |
vargham | 0:f76f52dc57f7 | 68 | |
vargham | 0:f76f52dc57f7 | 69 | class Joystick |
vargham | 0:f76f52dc57f7 | 70 | { |
vargham | 0:f76f52dc57f7 | 71 | public: |
vargham | 0:f76f52dc57f7 | 72 | Joystick(PinName pinX, PinName pinY, void(*onChange)(JoystickValue value, JoystickValue prevValue) = NULL) |
vargham | 0:f76f52dc57f7 | 73 | : _xIn(pinX) |
vargham | 0:f76f52dc57f7 | 74 | , _yIn(pinY) |
vargham | 0:f76f52dc57f7 | 75 | , _center(JOYSTICK_ADC_MAX / 2) |
vargham | 0:f76f52dc57f7 | 76 | , _joyValue(0) |
vargham | 0:f76f52dc57f7 | 77 | , _calibrated(false) |
vargham | 0:f76f52dc57f7 | 78 | , _calibrationCounter(0) |
vargham | 0:f76f52dc57f7 | 79 | , _range(JOYSTICK_ADC_MAX / 2) |
vargham | 0:f76f52dc57f7 | 80 | , _swapXY(false) |
vargham | 0:f76f52dc57f7 | 81 | , _flipX(false) |
vargham | 0:f76f52dc57f7 | 82 | , _flipY(false) |
vargham | 0:f76f52dc57f7 | 83 | , _delta(0) |
vargham | 0:f76f52dc57f7 | 84 | , _onChange(onChange) |
vargham | 0:f76f52dc57f7 | 85 | {}; |
vargham | 0:f76f52dc57f7 | 86 | void process(); |
vargham | 0:f76f52dc57f7 | 87 | void calibrate() |
vargham | 0:f76f52dc57f7 | 88 | { |
vargham | 0:f76f52dc57f7 | 89 | _center.x = JOYSTICK_ADC_MAX / 2; |
vargham | 0:f76f52dc57f7 | 90 | _center.y = JOYSTICK_ADC_MAX / 2; |
vargham | 0:f76f52dc57f7 | 91 | _calibrationCounter = 0; |
vargham | 0:f76f52dc57f7 | 92 | _calibrated = false; |
vargham | 0:f76f52dc57f7 | 93 | }; |
vargham | 0:f76f52dc57f7 | 94 | inline bool isCalibrated() const |
vargham | 0:f76f52dc57f7 | 95 | { |
vargham | 0:f76f52dc57f7 | 96 | return _calibrated; |
vargham | 0:f76f52dc57f7 | 97 | }; |
vargham | 0:f76f52dc57f7 | 98 | inline bool isSwapXY() const |
vargham | 0:f76f52dc57f7 | 99 | { |
vargham | 0:f76f52dc57f7 | 100 | return _swapXY; |
vargham | 0:f76f52dc57f7 | 101 | }; |
vargham | 0:f76f52dc57f7 | 102 | inline void setSwapXY(bool swapXY) |
vargham | 0:f76f52dc57f7 | 103 | { |
vargham | 0:f76f52dc57f7 | 104 | _swapXY = swapXY; |
vargham | 0:f76f52dc57f7 | 105 | }; |
vargham | 0:f76f52dc57f7 | 106 | inline bool isFlipX() const |
vargham | 0:f76f52dc57f7 | 107 | { |
vargham | 0:f76f52dc57f7 | 108 | return _flipX; |
vargham | 0:f76f52dc57f7 | 109 | }; |
vargham | 0:f76f52dc57f7 | 110 | inline void setFlipX(bool flipX) |
vargham | 0:f76f52dc57f7 | 111 | { |
vargham | 0:f76f52dc57f7 | 112 | _flipX = flipX; |
vargham | 0:f76f52dc57f7 | 113 | }; |
vargham | 0:f76f52dc57f7 | 114 | inline bool isFlipY() const |
vargham | 0:f76f52dc57f7 | 115 | { |
vargham | 0:f76f52dc57f7 | 116 | return _flipY; |
vargham | 0:f76f52dc57f7 | 117 | }; |
vargham | 0:f76f52dc57f7 | 118 | inline void setFlipY(bool flipY) |
vargham | 0:f76f52dc57f7 | 119 | { |
vargham | 0:f76f52dc57f7 | 120 | _flipY = flipY; |
vargham | 0:f76f52dc57f7 | 121 | }; |
vargham | 0:f76f52dc57f7 | 122 | inline int getRange() const |
vargham | 0:f76f52dc57f7 | 123 | { |
vargham | 0:f76f52dc57f7 | 124 | return _range; |
vargham | 0:f76f52dc57f7 | 125 | }; |
vargham | 0:f76f52dc57f7 | 126 | inline void setRange(int range) |
vargham | 0:f76f52dc57f7 | 127 | { |
vargham | 0:f76f52dc57f7 | 128 | _range = range; |
vargham | 0:f76f52dc57f7 | 129 | }; |
vargham | 0:f76f52dc57f7 | 130 | inline int getDelta() const |
vargham | 0:f76f52dc57f7 | 131 | { |
vargham | 0:f76f52dc57f7 | 132 | return _delta; |
vargham | 0:f76f52dc57f7 | 133 | }; |
vargham | 0:f76f52dc57f7 | 134 | inline void setDelta(int delta) |
vargham | 0:f76f52dc57f7 | 135 | { |
vargham | 0:f76f52dc57f7 | 136 | _delta = delta; |
vargham | 0:f76f52dc57f7 | 137 | }; |
vargham | 0:f76f52dc57f7 | 138 | inline int getX() const |
vargham | 0:f76f52dc57f7 | 139 | { |
vargham | 0:f76f52dc57f7 | 140 | return _joyValue.x; |
vargham | 0:f76f52dc57f7 | 141 | }; |
vargham | 0:f76f52dc57f7 | 142 | inline int getY() const |
vargham | 0:f76f52dc57f7 | 143 | { |
vargham | 0:f76f52dc57f7 | 144 | return _joyValue.y; |
vargham | 0:f76f52dc57f7 | 145 | }; |
vargham | 0:f76f52dc57f7 | 146 | inline JoystickValue getCurrentValue() const |
vargham | 0:f76f52dc57f7 | 147 | { |
vargham | 0:f76f52dc57f7 | 148 | return _joyValue; |
vargham | 0:f76f52dc57f7 | 149 | }; |
vargham | 0:f76f52dc57f7 | 150 | private: |
vargham | 0:f76f52dc57f7 | 151 | AnalogIn _xIn; |
vargham | 0:f76f52dc57f7 | 152 | AnalogIn _yIn; |
vargham | 0:f76f52dc57f7 | 153 | JoystickValue _center; |
vargham | 0:f76f52dc57f7 | 154 | JoystickValue _joyValue; |
vargham | 0:f76f52dc57f7 | 155 | bool _calibrated; |
vargham | 0:f76f52dc57f7 | 156 | uint16_t _calibrationCounter; |
vargham | 0:f76f52dc57f7 | 157 | int _range; |
vargham | 0:f76f52dc57f7 | 158 | bool _swapXY; |
vargham | 0:f76f52dc57f7 | 159 | bool _flipX; |
vargham | 0:f76f52dc57f7 | 160 | bool _flipY; |
vargham | 0:f76f52dc57f7 | 161 | int _delta; |
vargham | 0:f76f52dc57f7 | 162 | void(*_onChange)(JoystickValue value, JoystickValue prevValue); |
vargham | 0:f76f52dc57f7 | 163 | }; |
vargham | 0:f76f52dc57f7 | 164 | |
vargham | 0:f76f52dc57f7 | 165 | #endif //Joystick_h |
vargham | 0:f76f52dc57f7 | 166 |