My ELEC2645 joystick project Tetris Game NAME: JIANWEI CHEN SID: 200879849

Dependencies:   N5110 SDFileSystem mbed

Committer:
cjw851102
Date:
Thu May 05 09:18:01 2016 +0000
Revision:
4:463abe5f5135
Final version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cjw851102 4:463abe5f5135 1 /**
cjw851102 4:463abe5f5135 2 @file Joystick.h
cjw851102 4:463abe5f5135 3 @brief Header file containing functions prototypes, defines and global variables for constructing joystick.
cjw851102 4:463abe5f5135 4 @brief Example code of how to read a joystick with slightly changed for the game
cjw851102 4:463abe5f5135 5 @https://www.sparkfun.com/products/9032
cjw851102 4:463abe5f5135 6 @author Craig A. Evans
cjw851102 4:463abe5f5135 7 @date 7 March 2015
cjw851102 4:463abe5f5135 8 */
cjw851102 4:463abe5f5135 9
cjw851102 4:463abe5f5135 10 #ifndef JOYSTICK_H
cjw851102 4:463abe5f5135 11 #define JOYSTICK_H
cjw851102 4:463abe5f5135 12
cjw851102 4:463abe5f5135 13 #define DIRECTION_TOLERANCE 0.25
cjw851102 4:463abe5f5135 14
cjw851102 4:463abe5f5135 15 /**
cjw851102 4:463abe5f5135 16 Joystick vertical direction
cjw851102 4:463abe5f5135 17 @brief Analog input for joystick to send vertical directions data
cjw851102 4:463abe5f5135 18 */
cjw851102 4:463abe5f5135 19 AnalogIn yPot(PTB2);
cjw851102 4:463abe5f5135 20 /**
cjw851102 4:463abe5f5135 21 Joystick horizontal direction
cjw851102 4:463abe5f5135 22 @brief Analog input for joystick to send horizontal direction data
cjw851102 4:463abe5f5135 23 */
cjw851102 4:463abe5f5135 24 AnalogIn xPot(PTB3);
cjw851102 4:463abe5f5135 25
cjw851102 4:463abe5f5135 26 //! create enumerated type (0,1,2,3 etc. for direction)
cjw851102 4:463abe5f5135 27 //! could be extended for diagonals etc.
cjw851102 4:463abe5f5135 28 enum DirectionName {
cjw851102 4:463abe5f5135 29 UP,
cjw851102 4:463abe5f5135 30 DOWN,
cjw851102 4:463abe5f5135 31 LEFT,
cjw851102 4:463abe5f5135 32 RIGHT,
cjw851102 4:463abe5f5135 33 CENTRE,
cjw851102 4:463abe5f5135 34 UNKNOWN
cjw851102 4:463abe5f5135 35 };
cjw851102 4:463abe5f5135 36 //! struct for Joystick
cjw851102 4:463abe5f5135 37 typedef struct JoyStick Joystick;
cjw851102 4:463abe5f5135 38 struct JoyStick {
cjw851102 4:463abe5f5135 39 double x; // current x value
cjw851102 4:463abe5f5135 40 double x0; // 'centred' x value
cjw851102 4:463abe5f5135 41 double y; // current y value
cjw851102 4:463abe5f5135 42 double y0; // 'centred' y value
cjw851102 4:463abe5f5135 43 int button; // button state (assume pull-down used, so 1 = pressed, 0 = unpressed)
cjw851102 4:463abe5f5135 44 DirectionName direction; // current direction
cjw851102 4:463abe5f5135 45 };
cjw851102 4:463abe5f5135 46 //! create struct variable
cjw851102 4:463abe5f5135 47 Joystick joystick;
cjw851102 4:463abe5f5135 48 /**
cjw851102 4:463abe5f5135 49 Read default positions of the joystick to calibrate later readings
cjw851102 4:463abe5f5135 50 */
cjw851102 4:463abe5f5135 51 void calibrateJoystick();
cjw851102 4:463abe5f5135 52 /**
cjw851102 4:463abe5f5135 53 Update the current position of joystick
cjw851102 4:463abe5f5135 54 */
cjw851102 4:463abe5f5135 55 void updateJoystick();
cjw851102 4:463abe5f5135 56
cjw851102 4:463abe5f5135 57 /////////////////////////////////////////////////
cjw851102 4:463abe5f5135 58 /// Function Definitions
cjw851102 4:463abe5f5135 59 /////////////////////////////////////////////////
cjw851102 4:463abe5f5135 60
cjw851102 4:463abe5f5135 61 // read default positions of the joystick to calibrate later readings
cjw851102 4:463abe5f5135 62 void calibrateJoystick()
cjw851102 4:463abe5f5135 63 {
cjw851102 4:463abe5f5135 64 // must not move during calibration
cjw851102 4:463abe5f5135 65 joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly)
cjw851102 4:463abe5f5135 66 joystick.y0 = yPot;
cjw851102 4:463abe5f5135 67 }
cjw851102 4:463abe5f5135 68
cjw851102 4:463abe5f5135 69 void updateJoystick()
cjw851102 4:463abe5f5135 70 {
cjw851102 4:463abe5f5135 71 // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
cjw851102 4:463abe5f5135 72 joystick.x = xPot - joystick.x0;
cjw851102 4:463abe5f5135 73 joystick.y = yPot - joystick.y0;
cjw851102 4:463abe5f5135 74
cjw851102 4:463abe5f5135 75 // calculate direction depending on x,y values
cjw851102 4:463abe5f5135 76 // tolerance allows a little lee-way in case joystick not exactly in the stated direction
cjw851102 4:463abe5f5135 77 if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
cjw851102 4:463abe5f5135 78 joystick.direction = CENTRE;
cjw851102 4:463abe5f5135 79 } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
cjw851102 4:463abe5f5135 80 joystick.direction = UP;
cjw851102 4:463abe5f5135 81 } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
cjw851102 4:463abe5f5135 82 joystick.direction = DOWN;
cjw851102 4:463abe5f5135 83 } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
cjw851102 4:463abe5f5135 84 joystick.direction = RIGHT;
cjw851102 4:463abe5f5135 85 } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
cjw851102 4:463abe5f5135 86 joystick.direction = LEFT;
cjw851102 4:463abe5f5135 87 } else {
cjw851102 4:463abe5f5135 88 joystick.direction = UNKNOWN;
cjw851102 4:463abe5f5135 89 }
cjw851102 4:463abe5f5135 90 }
cjw851102 4:463abe5f5135 91
cjw851102 4:463abe5f5135 92 #endif