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

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