My ELEC2645 joystick project Tetris Game NAME: JIANWEI CHEN SID: 200879849
Dependencies: N5110 SDFileSystem mbed
Joystick.h@4:463abe5f5135, 2016-05-05 (annotated)
- Committer:
- cjw851102
- Date:
- Thu May 05 09:18:01 2016 +0000
- Revision:
- 4:463abe5f5135
Final version
Who changed what in which revision?
User | Revision | Line number | New 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 |