library to interface a joystick (with interrupts). It accepts callbacks (new mbed >5.9) to call when a Joystick::Right is Joystick::Press'ed.

Committer:
Mateusz Grzywacz
Date:
Mon Oct 14 13:15:36 2019 +0200
Revision:
4:9cc470b7a18a
Parent:
2:5460a009e96a
fixed JSON (for platformio)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Mateusz Grzywacz 0:67aaad6ac95a 1 #ifndef JOYSTICK_H
Mateusz Grzywacz 0:67aaad6ac95a 2 #define JOYSTICK_H
Mateusz Grzywacz 0:67aaad6ac95a 3
Mateusz Grzywacz 0:67aaad6ac95a 4 #include <mbed.h>
Mateusz Grzywacz 0:67aaad6ac95a 5
Mateusz Grzywacz 0:67aaad6ac95a 6 class Joystick{
Mateusz Grzywacz 0:67aaad6ac95a 7 private:
Mateusz Grzywacz 0:67aaad6ac95a 8 class Button {
Mateusz Grzywacz 2:5460a009e96a 9 protected:
Mateusz Grzywacz 0:67aaad6ac95a 10 Callback<void()> _callback_rise;
Mateusz Grzywacz 0:67aaad6ac95a 11 Callback<void()> _callback_fall;
Mateusz Grzywacz 0:67aaad6ac95a 12 public:
Mateusz Grzywacz 0:67aaad6ac95a 13 InterruptIn _irqpin;
Mateusz Grzywacz 0:67aaad6ac95a 14
Mateusz Grzywacz 0:67aaad6ac95a 15 enum Edge { RisingEdge = 0, FallingEdge };
Mateusz Grzywacz 0:67aaad6ac95a 16
Mateusz Grzywacz 0:67aaad6ac95a 17 Button(PinName p, PinMode mode = PullUp) : _irqpin(p, mode) {
Mateusz Grzywacz 0:67aaad6ac95a 18 _irqpin.rise(callback(this, &Button::call_rise));
Mateusz Grzywacz 0:67aaad6ac95a 19 _irqpin.fall(callback(this, &Button::call_fall));
Mateusz Grzywacz 0:67aaad6ac95a 20 }
Mateusz Grzywacz 0:67aaad6ac95a 21
Mateusz Grzywacz 0:67aaad6ac95a 22 void attach(Edge edge, Callback<void()> cb) {
Mateusz Grzywacz 0:67aaad6ac95a 23 if (edge == RisingEdge) _callback_rise = cb ;
Mateusz Grzywacz 0:67aaad6ac95a 24 else { _callback_fall = cb ; }
Mateusz Grzywacz 0:67aaad6ac95a 25 }
Mateusz Grzywacz 2:5460a009e96a 26
Mateusz Grzywacz 0:67aaad6ac95a 27 void call_rise(void) { if (_callback_rise) _callback_rise.call(); }
Mateusz Grzywacz 0:67aaad6ac95a 28 void call_fall(void) { if (_callback_fall) _callback_fall.call(); }
Mateusz Grzywacz 0:67aaad6ac95a 29 };
Mateusz Grzywacz 0:67aaad6ac95a 30
Mateusz Grzywacz 0:67aaad6ac95a 31 Button _key_up;
Mateusz Grzywacz 0:67aaad6ac95a 32 Button _key_down;
Mateusz Grzywacz 0:67aaad6ac95a 33 Button _key_left;
Mateusz Grzywacz 0:67aaad6ac95a 34 Button _key_right;
Mateusz Grzywacz 0:67aaad6ac95a 35 Button _key_select;
Mateusz Grzywacz 0:67aaad6ac95a 36 public:
Mateusz Grzywacz 0:67aaad6ac95a 37 enum Action { Press = 0, Release };
Mateusz Grzywacz 0:67aaad6ac95a 38 enum Direction { Up, Down, Left, Right, Select };
Mateusz Grzywacz 0:67aaad6ac95a 39
Mateusz Grzywacz 0:67aaad6ac95a 40 Joystick(PinName key_up = PI_8, \
Mateusz Grzywacz 0:67aaad6ac95a 41 PinName key_down = PI_10, \
Mateusz Grzywacz 0:67aaad6ac95a 42 PinName key_left = PI_9, \
Mateusz Grzywacz 0:67aaad6ac95a 43 PinName key_right = PF_11, \
Mateusz Grzywacz 0:67aaad6ac95a 44 PinName key_select = PC_13) : \
Mateusz Grzywacz 0:67aaad6ac95a 45 _key_up(key_up, PullDown), \
Mateusz Grzywacz 0:67aaad6ac95a 46 _key_down(key_down, PullDown),\
Mateusz Grzywacz 0:67aaad6ac95a 47 _key_left(key_left, PullDown),\
Mateusz Grzywacz 0:67aaad6ac95a 48 _key_right(key_right, PullDown),\
Mateusz Grzywacz 0:67aaad6ac95a 49 _key_select(key_select, PullDown)
Mateusz Grzywacz 0:67aaad6ac95a 50 {
Mateusz Grzywacz 0:67aaad6ac95a 51 }
Mateusz Grzywacz 0:67aaad6ac95a 52
Mateusz Grzywacz 0:67aaad6ac95a 53 void attach(Direction direction, Action action, Callback<void()> cb) {
Mateusz Grzywacz 0:67aaad6ac95a 54 Button * button;
Mateusz Grzywacz 0:67aaad6ac95a 55 switch(direction){
Mateusz Grzywacz 0:67aaad6ac95a 56 case Up:
Mateusz Grzywacz 0:67aaad6ac95a 57 button = &_key_up;
Mateusz Grzywacz 0:67aaad6ac95a 58 break;
Mateusz Grzywacz 0:67aaad6ac95a 59 case Down:
Mateusz Grzywacz 0:67aaad6ac95a 60 button = &_key_down;
Mateusz Grzywacz 0:67aaad6ac95a 61 break;
Mateusz Grzywacz 0:67aaad6ac95a 62 case Left:
Mateusz Grzywacz 0:67aaad6ac95a 63 button = &_key_left;
Mateusz Grzywacz 0:67aaad6ac95a 64 break;
Mateusz Grzywacz 0:67aaad6ac95a 65 case Right:
Mateusz Grzywacz 0:67aaad6ac95a 66 button = &_key_right;
Mateusz Grzywacz 0:67aaad6ac95a 67 break;
Mateusz Grzywacz 0:67aaad6ac95a 68 case Select:
Mateusz Grzywacz 0:67aaad6ac95a 69 button = &_key_select;
Mateusz Grzywacz 0:67aaad6ac95a 70 break;
Mateusz Grzywacz 2:5460a009e96a 71 }
Mateusz Grzywacz 0:67aaad6ac95a 72 if (action == Press) button->attach( Button::RisingEdge, cb );
Mateusz Grzywacz 0:67aaad6ac95a 73 else button->attach( Button::FallingEdge, cb );
Mateusz Grzywacz 0:67aaad6ac95a 74 }
Mateusz Grzywacz 0:67aaad6ac95a 75 };
Mateusz Grzywacz 0:67aaad6ac95a 76
Mateusz Grzywacz 0:67aaad6ac95a 77 #endif