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

Committer:
Mateusz Grzywacz
Date:
2019-10-14
Revision:
4:9cc470b7a18a
Parent:
2:5460a009e96a

File content as of revision 4:9cc470b7a18a:

#ifndef JOYSTICK_H
#define JOYSTICK_H

#include <mbed.h>

class Joystick{
	private:
		class Button {
		    protected:		    
		        Callback<void()> _callback_rise;
		        Callback<void()> _callback_fall;
		    public:
	    	    InterruptIn     _irqpin;

		        enum Edge { RisingEdge = 0, FallingEdge };
		        
		        Button(PinName p, PinMode mode = PullUp) : _irqpin(p, mode) {
		            _irqpin.rise(callback(this, &Button::call_rise));
		            _irqpin.fall(callback(this, &Button::call_fall));
		        }
		        
		        void attach(Edge edge, Callback<void()> cb) { 
		            if (edge == RisingEdge) _callback_rise = cb ; 
		            else {                  _callback_fall = cb ; }
		        }
		 		 
		        void call_rise(void) { if (_callback_rise) _callback_rise.call(); }
		        void call_fall(void) { if (_callback_fall) _callback_fall.call(); }
		};

		Button _key_up;
		Button _key_down;
		Button _key_left;
		Button _key_right;
		Button _key_select;
	public:
		enum Action { Press = 0, Release };
		enum Direction { Up, Down, Left, Right, Select };
		
		Joystick(PinName key_up = PI_8,    \
				 PinName key_down = PI_10,  \
				 PinName key_left = PI_9,    \
				 PinName key_right = PF_11,   \
				 PinName key_select = PC_13) : \
		_key_up(key_up, PullDown), \
		_key_down(key_down, PullDown),\
		_key_left(key_left, PullDown),\
		_key_right(key_right, PullDown),\
		_key_select(key_select, PullDown)
		{
		}

        void attach(Direction direction, Action action, Callback<void()> cb) { 
        	Button * button;
        	switch(direction){
        		case Up:
        		button = &_key_up;
        		break;
        		case Down:
        		button = &_key_down;
        		break;
        		case Left:
        		button = &_key_left;
        		break;
        		case Right:
        		button = &_key_right;
        		break;
        		case Select:
        		button = &_key_select;
        		break;
        	}       	
            if (action == Press)    button->attach( Button::RisingEdge,  cb ); 
            else                    button->attach( Button::FallingEdge, cb ); 
        }
};

#endif