Mark Peter Vargha / Joystick
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?

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