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@0:67aaad6ac95a, 2019-10-04 (annotated)
- Committer:
- Mateusz Grzywacz
- Date:
- Fri Oct 04 14:47:38 2019 +0200
- Revision:
- 0:67aaad6ac95a
- Child:
- 2:5460a009e96a
works. updated for mbed >5.9
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 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 9 | class Button { |
Mateusz Grzywacz | 0:67aaad6ac95a | 10 | protected: |
Mateusz Grzywacz | 0:67aaad6ac95a | 11 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 12 | Callback<void()> _callback_rise; |
Mateusz Grzywacz | 0:67aaad6ac95a | 13 | Callback<void()> _callback_fall; |
Mateusz Grzywacz | 0:67aaad6ac95a | 14 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 15 | public: |
Mateusz Grzywacz | 0:67aaad6ac95a | 16 | InterruptIn _irqpin; |
Mateusz Grzywacz | 0:67aaad6ac95a | 17 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 18 | enum Edge { RisingEdge = 0, FallingEdge }; |
Mateusz Grzywacz | 0:67aaad6ac95a | 19 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 20 | Button(PinName p, PinMode mode = PullUp) : _irqpin(p, mode) { |
Mateusz Grzywacz | 0:67aaad6ac95a | 21 | _irqpin.rise(callback(this, &Button::call_rise)); |
Mateusz Grzywacz | 0:67aaad6ac95a | 22 | _irqpin.fall(callback(this, &Button::call_fall)); |
Mateusz Grzywacz | 0:67aaad6ac95a | 23 | } |
Mateusz Grzywacz | 0:67aaad6ac95a | 24 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 25 | void attach(Edge edge, Callback<void()> cb) { |
Mateusz Grzywacz | 0:67aaad6ac95a | 26 | if (edge == RisingEdge) _callback_rise = cb ; |
Mateusz Grzywacz | 0:67aaad6ac95a | 27 | else { _callback_fall = cb ; } |
Mateusz Grzywacz | 0:67aaad6ac95a | 28 | } |
Mateusz Grzywacz | 0:67aaad6ac95a | 29 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 30 | // template<typename T> |
Mateusz Grzywacz | 0:67aaad6ac95a | 31 | // void attach(Edge edge, T *object, void (T::*member)(void)) { |
Mateusz Grzywacz | 0:67aaad6ac95a | 32 | // if (edge == RisingEdge) _callback_rise = func; |
Mateusz Grzywacz | 0:67aaad6ac95a | 33 | // else _callback_fall = func; |
Mateusz Grzywacz | 0:67aaad6ac95a | 34 | // } |
Mateusz Grzywacz | 0:67aaad6ac95a | 35 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 36 | void call_rise(void) { if (_callback_rise) _callback_rise.call(); } |
Mateusz Grzywacz | 0:67aaad6ac95a | 37 | void call_fall(void) { if (_callback_fall) _callback_fall.call(); } |
Mateusz Grzywacz | 0:67aaad6ac95a | 38 | }; |
Mateusz Grzywacz | 0:67aaad6ac95a | 39 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 40 | Button _key_up; |
Mateusz Grzywacz | 0:67aaad6ac95a | 41 | Button _key_down; |
Mateusz Grzywacz | 0:67aaad6ac95a | 42 | Button _key_left; |
Mateusz Grzywacz | 0:67aaad6ac95a | 43 | Button _key_right; |
Mateusz Grzywacz | 0:67aaad6ac95a | 44 | Button _key_select; |
Mateusz Grzywacz | 0:67aaad6ac95a | 45 | public: |
Mateusz Grzywacz | 0:67aaad6ac95a | 46 | enum Action { Press = 0, Release }; |
Mateusz Grzywacz | 0:67aaad6ac95a | 47 | enum Direction { Up, Down, Left, Right, Select }; |
Mateusz Grzywacz | 0:67aaad6ac95a | 48 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 49 | Joystick(PinName key_up = PI_8, \ |
Mateusz Grzywacz | 0:67aaad6ac95a | 50 | PinName key_down = PI_10, \ |
Mateusz Grzywacz | 0:67aaad6ac95a | 51 | PinName key_left = PI_9, \ |
Mateusz Grzywacz | 0:67aaad6ac95a | 52 | PinName key_right = PF_11, \ |
Mateusz Grzywacz | 0:67aaad6ac95a | 53 | PinName key_select = PC_13) : \ |
Mateusz Grzywacz | 0:67aaad6ac95a | 54 | _key_up(key_up, PullDown), \ |
Mateusz Grzywacz | 0:67aaad6ac95a | 55 | _key_down(key_down, PullDown),\ |
Mateusz Grzywacz | 0:67aaad6ac95a | 56 | _key_left(key_left, PullDown),\ |
Mateusz Grzywacz | 0:67aaad6ac95a | 57 | _key_right(key_right, PullDown),\ |
Mateusz Grzywacz | 0:67aaad6ac95a | 58 | _key_select(key_select, PullDown) |
Mateusz Grzywacz | 0:67aaad6ac95a | 59 | { |
Mateusz Grzywacz | 0:67aaad6ac95a | 60 | } |
Mateusz Grzywacz | 0:67aaad6ac95a | 61 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 62 | void print(){ |
Mateusz Grzywacz | 0:67aaad6ac95a | 63 | printf("loloza\n"); |
Mateusz Grzywacz | 0:67aaad6ac95a | 64 | } |
Mateusz Grzywacz | 0:67aaad6ac95a | 65 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 66 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 67 | void attach(Direction direction, Action action, Callback<void()> cb) { |
Mateusz Grzywacz | 0:67aaad6ac95a | 68 | Button * button; |
Mateusz Grzywacz | 0:67aaad6ac95a | 69 | switch(direction){ |
Mateusz Grzywacz | 0:67aaad6ac95a | 70 | case Up: |
Mateusz Grzywacz | 0:67aaad6ac95a | 71 | button = &_key_up; |
Mateusz Grzywacz | 0:67aaad6ac95a | 72 | break; |
Mateusz Grzywacz | 0:67aaad6ac95a | 73 | case Down: |
Mateusz Grzywacz | 0:67aaad6ac95a | 74 | button = &_key_down; |
Mateusz Grzywacz | 0:67aaad6ac95a | 75 | break; |
Mateusz Grzywacz | 0:67aaad6ac95a | 76 | case Left: |
Mateusz Grzywacz | 0:67aaad6ac95a | 77 | button = &_key_left; |
Mateusz Grzywacz | 0:67aaad6ac95a | 78 | break; |
Mateusz Grzywacz | 0:67aaad6ac95a | 79 | case Right: |
Mateusz Grzywacz | 0:67aaad6ac95a | 80 | button = &_key_right; |
Mateusz Grzywacz | 0:67aaad6ac95a | 81 | break; |
Mateusz Grzywacz | 0:67aaad6ac95a | 82 | case Select: |
Mateusz Grzywacz | 0:67aaad6ac95a | 83 | button = &_key_select; |
Mateusz Grzywacz | 0:67aaad6ac95a | 84 | break; |
Mateusz Grzywacz | 0:67aaad6ac95a | 85 | } |
Mateusz Grzywacz | 0:67aaad6ac95a | 86 | printf("button: %lld %lld: %c\n",button, &_key_down, (button->_irqpin.read() ? 'x' : 'o') ); |
Mateusz Grzywacz | 0:67aaad6ac95a | 87 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 88 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 89 | if (action == Press) button->attach( Button::RisingEdge, cb ); |
Mateusz Grzywacz | 0:67aaad6ac95a | 90 | else button->attach( Button::FallingEdge, cb ); |
Mateusz Grzywacz | 0:67aaad6ac95a | 91 | } |
Mateusz Grzywacz | 0:67aaad6ac95a | 92 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 93 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 94 | }; |
Mateusz Grzywacz | 0:67aaad6ac95a | 95 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 96 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 97 | |
Mateusz Grzywacz | 0:67aaad6ac95a | 98 | #endif |