Analog joystick library

Dependents:   GameProject_Prototype Joystick lcd205 Joystick205 ... more

Joystick.h

Committer:
eencae
Date:
2017-02-07
Revision:
0:649b59b2fb26

File content as of revision 0:649b59b2fb26:

#ifndef JOYSTICK_H
#define JOYSTICK_H

#include "mbed.h"

// this value can be tuned to alter tolerance of joystick movement
#define TOL 0.1f
#define RAD2DEG 57.2957795131f

enum Direction {
    CENTRE,  // 0
    N,       // 1
    NE,      // 2
    E,       // 3
    SE,      // 4
    S,       // 5
    SW,      // 6
    W,       // 7
    NW      // 8
};

struct Vector2D {
  float x;
  float y;  
};

struct Polar {
    float mag;
    float angle;
};

/** Joystick Class
@author Dr Craig A. Evans, University of Leeds
@brief  Library for interfacing with analogue joystick

Example:

@code

#include "mbed.h"
#include "Joystick.h"

//                  y     x     button
Joystick joystick(PTB10,PTB11,PTC16);

int main() {
    
    joystick.init();
    
    while(1) {
    
        Vector2D coord = joystick.get_coord();
        printf("Coord = %f,%f\n",coord.x,coord.y);
        
        Vector2D mapped_coord = joystick.get_mapped_coord(); 
        printf("Mapped coord = %f,%f\n",mapped_coord.x,mapped_coord.y); 
        
        float mag = joystick.get_mag();
        float angle = joystick.get_angle();
        printf("Mag = %f Angle = %f\n",mag,angle);
        
        Direction d = joystick.get_direction();
        printf("Direction = %i\n",d);
        
        if (joystick.button_pressed() ) {
            printf("Button Pressed\n");  
        }
          
        wait(0.5);
    }
    
    
}

* @endcode
*/
class Joystick
{
public:
    
    //              y-pot              x-pot            button
    Joystick(PinName vertPin,PinName horizPin,PinName clickPin);
    
    void init();  // needs to be called at start with joystick centred
    float get_mag();              // polar
    float get_angle();            // polar
    Vector2D get_coord();         // cartesian co-ordinates x,y
    Vector2D get_mapped_coord();  // x,y mapped to circle
    Direction get_direction();    // N,NE,E,SE etc.
    Polar get_polar();            // mag and angle in struct form
    bool button_pressed();        // read button flag set in ISR when button pressed
    
private:

    AnalogIn *vert;
    AnalogIn *horiz;
    InterruptIn *click;
    
    int _click_flag;    // flag set in ISR
    void click_isr();   // ISR on button press
       
    // centred x,y values    
    float _x0;
    float _y0;
    
};

#endif