library to interface a joystick (with interrupts). It accepts callbacks (new mbed >5.9) to call when a Joystick::Right is Joystick::Press'ed.
joystick.hpp@4:9cc470b7a18a, 2019-10-14 (annotated)
- 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?
User | Revision | Line number | New 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 |