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

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