Game codes for Pokemon Academy Yiu Fai Kwok - 201198802 I have read the University Regulations on Plagiarism and state that the work covered by this declaration is my own and does not contain any unacknowledged work from other sources.

Dependencies:   mbed FXOS8700CQ mbed-rtos

Committer:
yfkwok
Date:
Mon Mar 11 19:48:14 2019 +0000
Revision:
0:1da4db5de653
Child:
6:9104692d6c8c
Child:
12:71683453f66a
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yfkwok 0:1da4db5de653 1 #ifndef GAMEPAD_H
yfkwok 0:1da4db5de653 2 #define GAMEPAD_H
yfkwok 0:1da4db5de653 3
yfkwok 0:1da4db5de653 4 #include <bitset>
yfkwok 0:1da4db5de653 5
yfkwok 0:1da4db5de653 6 // Forward declaration of the classes that we use from the mbed library
yfkwok 0:1da4db5de653 7 // This avoids the need for us to include the huge mbed.h header inside our
yfkwok 0:1da4db5de653 8 // own library API
yfkwok 0:1da4db5de653 9 namespace mbed
yfkwok 0:1da4db5de653 10 {
yfkwok 0:1da4db5de653 11 class AnalogIn;
yfkwok 0:1da4db5de653 12 class InterruptIn;
yfkwok 0:1da4db5de653 13 class PwmOut;
yfkwok 0:1da4db5de653 14 class Timeout;
yfkwok 0:1da4db5de653 15 }
yfkwok 0:1da4db5de653 16
yfkwok 0:1da4db5de653 17 #define TOL 0.1f
yfkwok 0:1da4db5de653 18 #define RAD2DEG 57.2957795131f
yfkwok 0:1da4db5de653 19
yfkwok 0:1da4db5de653 20 /** Enum for direction */
yfkwok 0:1da4db5de653 21 enum Direction {
yfkwok 0:1da4db5de653 22 CENTRE, /**< joystick centred */
yfkwok 0:1da4db5de653 23 N, /**< pushed North (0)*/
yfkwok 0:1da4db5de653 24 NE, /**< pushed North-East (45) */
yfkwok 0:1da4db5de653 25 E, /**< pushed East (90) */
yfkwok 0:1da4db5de653 26 SE, /**< pushed South-East (135) */
yfkwok 0:1da4db5de653 27 S, /**< pushed South (180) */
yfkwok 0:1da4db5de653 28 SW, /**< pushed South-West (225) */
yfkwok 0:1da4db5de653 29 W, /**< pushed West (270) */
yfkwok 0:1da4db5de653 30 NW /**< pushed North-West (315) */
yfkwok 0:1da4db5de653 31 };
yfkwok 0:1da4db5de653 32
yfkwok 0:1da4db5de653 33 /** Vector 2D struct */
yfkwok 0:1da4db5de653 34 struct Vector2D {
yfkwok 0:1da4db5de653 35 float x; /**< float for x value */
yfkwok 0:1da4db5de653 36 float y; /**< float for y value */
yfkwok 0:1da4db5de653 37 };
yfkwok 0:1da4db5de653 38
yfkwok 0:1da4db5de653 39 /** Polar coordinate struct */
yfkwok 0:1da4db5de653 40 struct Polar {
yfkwok 0:1da4db5de653 41 float mag; /**< float for magnitude */
yfkwok 0:1da4db5de653 42 float angle; /**< float for angle (in degrees) */
yfkwok 0:1da4db5de653 43 };
yfkwok 0:1da4db5de653 44
yfkwok 0:1da4db5de653 45 /** Gamepad Class
yfkwok 0:1da4db5de653 46 * @brief Library for interfacing with ELEC2645 Gamepad PCB, University of Leeds
yfkwok 0:1da4db5de653 47 * @author Dr Craig A. Evans
yfkwok 0:1da4db5de653 48 * @author Dr Alex Valavanis
yfkwok 0:1da4db5de653 49 */
yfkwok 0:1da4db5de653 50 class Gamepad
yfkwok 0:1da4db5de653 51 {
yfkwok 0:1da4db5de653 52 public:
yfkwok 0:1da4db5de653 53 /** Gamepad events
yfkwok 0:1da4db5de653 54 * @brief List of events that can be registered on the gamepad
yfkwok 0:1da4db5de653 55 */
yfkwok 0:1da4db5de653 56 enum GamepadEvent {
yfkwok 0:1da4db5de653 57 A_PRESSED, ///< Button A has been pressed
yfkwok 0:1da4db5de653 58 B_PRESSED, ///< Button B has been pressed
yfkwok 0:1da4db5de653 59 X_PRESSED, ///< Button X has been pressed
yfkwok 0:1da4db5de653 60 Y_PRESSED, ///< Button Y has been pressed
yfkwok 0:1da4db5de653 61 L_PRESSED, ///< Button L has been pressed
yfkwok 0:1da4db5de653 62 R_PRESSED, ///< Button R has been pressed
yfkwok 0:1da4db5de653 63 BACK_PRESSED, ///< Button "Back" has been pressed
yfkwok 0:1da4db5de653 64 START_PRESSED, ///< Button "Start" has been pressed
yfkwok 0:1da4db5de653 65 JOY_PRESSED, ///< Joystick button has been pressed
yfkwok 0:1da4db5de653 66 N_EVENTS ///< A dummy flag that marks the end of the list
yfkwok 0:1da4db5de653 67 };
yfkwok 0:1da4db5de653 68
yfkwok 0:1da4db5de653 69 private:
yfkwok 0:1da4db5de653 70 mbed::PwmOut *_led1;
yfkwok 0:1da4db5de653 71 mbed::PwmOut *_led2;
yfkwok 0:1da4db5de653 72 mbed::PwmOut *_led3;
yfkwok 0:1da4db5de653 73 mbed::PwmOut *_led4;
yfkwok 0:1da4db5de653 74 mbed::PwmOut *_led5;
yfkwok 0:1da4db5de653 75 mbed::PwmOut *_led6;
yfkwok 0:1da4db5de653 76
yfkwok 0:1da4db5de653 77 mbed::InterruptIn *_button_A;
yfkwok 0:1da4db5de653 78 mbed::InterruptIn *_button_B;
yfkwok 0:1da4db5de653 79 mbed::InterruptIn *_button_X;
yfkwok 0:1da4db5de653 80 mbed::InterruptIn *_button_Y;
yfkwok 0:1da4db5de653 81 mbed::InterruptIn *_button_L;
yfkwok 0:1da4db5de653 82 mbed::InterruptIn *_button_R;
yfkwok 0:1da4db5de653 83 mbed::InterruptIn *_button_back;
yfkwok 0:1da4db5de653 84 mbed::InterruptIn *_button_start;
yfkwok 0:1da4db5de653 85 mbed::InterruptIn *_button_joystick;
yfkwok 0:1da4db5de653 86
yfkwok 0:1da4db5de653 87 mbed::AnalogIn *_vert;
yfkwok 0:1da4db5de653 88 mbed::AnalogIn *_horiz;
yfkwok 0:1da4db5de653 89
yfkwok 0:1da4db5de653 90 mbed::PwmOut *_buzzer;
yfkwok 0:1da4db5de653 91 mbed::AnalogIn *_pot;
yfkwok 0:1da4db5de653 92
yfkwok 0:1da4db5de653 93 mbed::Timeout *_timeout;
yfkwok 0:1da4db5de653 94
yfkwok 0:1da4db5de653 95 std::bitset<N_EVENTS> _event_state; ///< A binary list of buttons that has been pressed
yfkwok 0:1da4db5de653 96
yfkwok 0:1da4db5de653 97 // centred x,y values
yfkwok 0:1da4db5de653 98 float _x0;
yfkwok 0:1da4db5de653 99 float _y0;
yfkwok 0:1da4db5de653 100
yfkwok 0:1da4db5de653 101 public:
yfkwok 0:1da4db5de653 102 /** Constructor */
yfkwok 0:1da4db5de653 103 Gamepad();
yfkwok 0:1da4db5de653 104
yfkwok 0:1da4db5de653 105 /** Destructor */
yfkwok 0:1da4db5de653 106 ~Gamepad();
yfkwok 0:1da4db5de653 107
yfkwok 0:1da4db5de653 108 /** Initialise all peripherals and configure interrupts */
yfkwok 0:1da4db5de653 109 void init();
yfkwok 0:1da4db5de653 110
yfkwok 0:1da4db5de653 111 /** Turn all LEDs on */
yfkwok 0:1da4db5de653 112 void leds_on();
yfkwok 0:1da4db5de653 113
yfkwok 0:1da4db5de653 114 /** Turn all LEDs off */
yfkwok 0:1da4db5de653 115 void leds_off();
yfkwok 0:1da4db5de653 116
yfkwok 0:1da4db5de653 117 /** Set all LEDs to duty-cycle
yfkwok 0:1da4db5de653 118 *@param value in range 0.0 to 1.0
yfkwok 0:1da4db5de653 119 */
yfkwok 0:1da4db5de653 120 void leds(float val) const;
yfkwok 0:1da4db5de653 121
yfkwok 0:1da4db5de653 122 /** Set LED to duty-cycle
yfkwok 0:1da4db5de653 123 *@param led number (0 to 5)
yfkwok 0:1da4db5de653 124 *@param value in range 0.0 to 1.0
yfkwok 0:1da4db5de653 125 */
yfkwok 0:1da4db5de653 126 void led(int n,float val) const;
yfkwok 0:1da4db5de653 127
yfkwok 0:1da4db5de653 128 /** Read potentiometer
yfkwok 0:1da4db5de653 129 *@returns potentiometer value in range 0.0 to 1.0
yfkwok 0:1da4db5de653 130 */
yfkwok 0:1da4db5de653 131 float read_pot() const;
yfkwok 0:1da4db5de653 132
yfkwok 0:1da4db5de653 133 /** Play tone on piezo
yfkwok 0:1da4db5de653 134 * @param frequency in Hz
yfkwok 0:1da4db5de653 135 * @param duration of tone in seconds
yfkwok 0:1da4db5de653 136 */
yfkwok 0:1da4db5de653 137 void tone(float frequency, float duration);
yfkwok 0:1da4db5de653 138
yfkwok 0:1da4db5de653 139 /**
yfkwok 0:1da4db5de653 140 * @brief Check whether an event flag has been set and clear it
yfkwok 0:1da4db5de653 141 * @param id[in] The ID of the event to test
yfkwok 0:1da4db5de653 142 * @return true if the event occurred
yfkwok 0:1da4db5de653 143 */
yfkwok 0:1da4db5de653 144 bool check_event(GamepadEvent const id);
yfkwok 0:1da4db5de653 145
yfkwok 0:1da4db5de653 146 /**
yfkwok 0:1da4db5de653 147 * @brief Get the raw binary event state
yfkwok 0:1da4db5de653 148 * @return The event state as a binary code
yfkwok 0:1da4db5de653 149 * @details The check_event() function is likely to be more useful than
yfkwok 0:1da4db5de653 150 * this, for testing whether a given event has occurred. It can be
yfkwok 0:1da4db5de653 151 * useful for debugging via the terminal, however, for example:
yfkwok 0:1da4db5de653 152 * @code
yfkwok 0:1da4db5de653 153 * std::cout << gamepad.get_raw_event_state() << std::endl;
yfkwok 0:1da4db5de653 154 * @endcode
yfkwok 0:1da4db5de653 155 */
yfkwok 0:1da4db5de653 156 inline std::bitset<N_EVENTS> get_raw_event_state() const {
yfkwok 0:1da4db5de653 157 return _event_state;
yfkwok 0:1da4db5de653 158 }
yfkwok 0:1da4db5de653 159
yfkwok 0:1da4db5de653 160 /** Get magnitude of joystick movement
yfkwok 0:1da4db5de653 161 * @returns value in range 0.0 to 1.0
yfkwok 0:1da4db5de653 162 */
yfkwok 0:1da4db5de653 163 float get_mag();
yfkwok 0:1da4db5de653 164
yfkwok 0:1da4db5de653 165 /** Get angle of joystick movement
yfkwok 0:1da4db5de653 166 * @returns value in range 0.0 to 359.9. 0.0 corresponds to N, 180.0 to S. -1.0 is central
yfkwok 0:1da4db5de653 167 */
yfkwok 0:1da4db5de653 168 float get_angle();
yfkwok 0:1da4db5de653 169
yfkwok 0:1da4db5de653 170 /** Gets joystick direction
yfkwok 0:1da4db5de653 171 * @returns an enum: CENTRE, N, NE, E, SE, S, SW, W, NW,
yfkwok 0:1da4db5de653 172 */
yfkwok 0:1da4db5de653 173 Direction get_direction(); // N,NE,E,SE etc.
yfkwok 0:1da4db5de653 174
yfkwok 0:1da4db5de653 175 /** Gets raw cartesian co-ordinates of joystick
yfkwok 0:1da4db5de653 176 * @returns a struct with x,y members, each in the range 0.0 to 1.0
yfkwok 0:1da4db5de653 177 */
yfkwok 0:1da4db5de653 178 Vector2D get_coord(); // cartesian co-ordinates x,y
yfkwok 0:1da4db5de653 179
yfkwok 0:1da4db5de653 180 /** Gets cartesian coordinates mapped to circular grid
yfkwok 0:1da4db5de653 181 * @returns a struct with x,y members, each in the range 0.0 to 1.0
yfkwok 0:1da4db5de653 182 */
yfkwok 0:1da4db5de653 183 Vector2D get_mapped_coord(); // x,y mapped to circle
yfkwok 0:1da4db5de653 184
yfkwok 0:1da4db5de653 185 /** Gets polar coordinates of the joystick
yfkwok 0:1da4db5de653 186 * @returns a struct contains mag and angle
yfkwok 0:1da4db5de653 187 */
yfkwok 0:1da4db5de653 188 Polar get_polar(); // mag and angle in struct form
yfkwok 0:1da4db5de653 189
yfkwok 0:1da4db5de653 190 private:
yfkwok 0:1da4db5de653 191 void init_buttons();
yfkwok 0:1da4db5de653 192 void tone_off();
yfkwok 0:1da4db5de653 193
yfkwok 0:1da4db5de653 194 void a_isr();
yfkwok 0:1da4db5de653 195 void b_isr();
yfkwok 0:1da4db5de653 196 void x_isr();
yfkwok 0:1da4db5de653 197 void y_isr();
yfkwok 0:1da4db5de653 198 void l_isr();
yfkwok 0:1da4db5de653 199 void r_isr();
yfkwok 0:1da4db5de653 200 void back_isr();
yfkwok 0:1da4db5de653 201 void start_isr();
yfkwok 0:1da4db5de653 202 void joy_isr();
yfkwok 0:1da4db5de653 203 };
yfkwok 0:1da4db5de653 204
yfkwok 0:1da4db5de653 205 #endif