Two axis analog (2x potmeter) joystick driver.

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?

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 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