Joe Shotton / ll16j23s_test_docs

Files at this revision

API Documentation at this revision

Comitter:
valavanisalex
Date:
Fri Mar 03 12:35:43 2017 +0000
Parent:
11:ff86b2ffce01
Child:
13:ef5fc9f58805
Commit message:
Handle event flags using a single _event_state bitset and ID flags

Changed in this revision

Gamepad.cpp Show annotated file Show diff for this revision Revisions of this file
Gamepad.h Show annotated file Show diff for this revision Revisions of this file
--- a/Gamepad.cpp	Thu Mar 02 18:34:42 2017 +0000
+++ b/Gamepad.cpp	Fri Mar 03 12:35:43 2017 +0000
@@ -50,15 +50,7 @@
     _y0 = _vert->read();
 
     // clear all flags
-    _a_flag     = false;
-    _b_flag     = false;
-    _x_flag     = false;
-    _y_flag     = false;
-    _joy_flag   = false;
-    _l_flag     = false;
-    _r_flag     = false;
-    _back_flag  = false;
-    _start_flag = false;
+    _event_state = 0;
 }
 
 void Gamepad::leds_off()
@@ -123,99 +115,11 @@
     _timeout->attach(callback(this, &Gamepad::tone_off), duration );
 }
 
-bool Gamepad::a_pressed()
-{
-    // ISR must have been triggered
-    if (_a_flag) {
-        _a_flag = 0;  // clear flag
-        return true;
-    } else {
-        return false;
-    }
-}
-
-bool Gamepad::b_pressed()
-{
-    // ISR must have been triggered
-    if (_b_flag) {
-        _b_flag = false;  // clear flag
-        return true;
-    } else {
-        return false;
-    }
-}
-
-bool Gamepad::x_pressed()
-{
-    // ISR must have been triggered
-    if (_x_flag) {
-        _x_flag = false;  // clear flag
-        return true;
-    } else {
-        return false;
-    }
-}
-
-bool Gamepad::y_pressed()
-{
-    // ISR must have been triggered
-    if (_y_flag) {
-        _y_flag = false;  // clear flag
-        return true;
-    } else {
-        return false;
-    }
-}
-
-bool Gamepad::l_pressed()
+bool Gamepad::check_event(GamepadEvent const id)
 {
-    // ISR must have been triggered
-    if (_l_flag) {
-        _l_flag = false;  // clear flag
-        return true;
-    } else {
-        return false;
-    }
-}
-
-bool Gamepad::r_pressed()
-{
-    // ISR must have been triggered
-    if (_r_flag) {
-        _r_flag = false;  // clear flag
-        return true;
-    } else {
-        return false;
-    }
-}
-
-bool Gamepad::back_pressed()
-{
-    // ISR must have been triggered
-    if (_back_flag) {
-        _back_flag = false;  // clear flag
-        return true;
-    } else {
-        return false;
-    }
-}
-
-bool Gamepad::start_pressed()
-{
-    // ISR must have been triggered
-    if (_start_flag) {
-        _start_flag = false;  // clear flag
-        return true;
-    } else {
-        return false;
-    }
-}
-
-bool Gamepad::joystick_pressed()
-{
-    // ISR must have been triggered
-    if (_joy_flag) {
-        _joy_flag = false;  // clear flag
+    // Check whether event flag is set
+    if (_event_state[id]) {
+        _event_state.reset(id);  // clear flag
         return true;
     } else {
         return false;
@@ -300,41 +204,43 @@
 }
 
 // button interrupts ISRs
+// Each of these simply sets the appropriate event bit in the _event_state
+// variable
 void Gamepad::a_isr()
 {
-    _a_flag=true;
+    _event_state.set(EVENT_A_PRESSED);
 }
 void Gamepad::b_isr()
 {
-    _b_flag=true;
+    _event_state.set(EVENT_B_PRESSED);
 }
 void Gamepad::x_isr()
 {
-    _x_flag=true;
+    _event_state.set(EVENT_X_PRESSED);
 }
 void Gamepad::y_isr()
 {
-    _y_flag=true;
+    _event_state.set(EVENT_Y_PRESSED);
 }
 void Gamepad::l_isr()
 {
-    _l_flag=true;
+    _event_state.set(EVENT_L_PRESSED);
 }
 void Gamepad::r_isr()
 {
-    _r_flag=true;
+    _event_state.set(EVENT_R_PRESSED);
 }
 void Gamepad::back_isr()
 {
-    _back_flag=true;
+    _event_state.set(EVENT_BACK_PRESSED);
 }
 void Gamepad::start_isr()
 {
-    _start_flag=true;
+    _event_state.set(EVENT_START_PRESSED);
 }
 void Gamepad::joy_isr()
 {
-    _joy_flag=true;
+    _event_state.set(EVENT_JOY_PRESSED);
 }
 
 // get raw joystick coordinate in range -1 to 1
--- a/Gamepad.h	Thu Mar 02 18:34:42 2017 +0000
+++ b/Gamepad.h	Fri Mar 03 12:35:43 2017 +0000
@@ -1,6 +1,8 @@
 #ifndef GAMEPAD_H
 #define GAMEPAD_H
 
+#include <bitset>
+
 #include "mbed.h"
 
 #define TOL 0.1f
@@ -31,6 +33,23 @@
     float angle; /**< float for angle (in degrees) */
 };
 
+
+/**
+ * List of events that can be registered on the gamepad
+ */
+enum GamepadEvent {
+    EVENT_A_PRESSED,     ///< Button A has been pressed
+    EVENT_B_PRESSED,     ///< Button B has been pressed
+    EVENT_X_PRESSED,     ///< Button X has been pressed
+    EVENT_Y_PRESSED,     ///< Button Y has been pressed
+    EVENT_L_PRESSED,     ///< Button L has been pressed
+    EVENT_R_PRESSED,     ///< Button R has been pressed
+    EVENT_BACK_PRESSED,  ///< Button "Back" has been pressed
+    EVENT_START_PRESSED, ///< Button "Start" has been pressed
+    EVENT_JOY_PRESSED,   ///< Joystick button has been pressed
+    N_EVENTS             ///< A dummy flag that marks the end of the list
+};
+
 /** Gamepad Class
 @brief Library for interfacing with ELEC2645 Gamepad PCB, University of Leeds
 @author Dr Craig A. Evans
@@ -64,15 +83,7 @@
 
     Timeout *_timeout;
 
-    bool _a_flag;
-    bool _b_flag;
-    bool _x_flag;
-    bool _y_flag;
-    bool _l_flag;
-    bool _r_flag;
-    bool _back_flag;
-    bool _start_flag;
-    bool _joy_flag;
+    std::bitset<N_EVENTS> _event_state; ///< A binary list of buttons that has been pressed
 
     // centred x,y values
     float _x0;
@@ -141,51 +152,13 @@
     */
     void tone(float frequency, float duration);
 
-    /** Check if A button pressed
-    * @returns true if yes, false if no
-    */
-    bool a_pressed();
-
-    /** Check if B button pressed
-    * @returns true if yes, false if no
-    */
-    bool b_pressed();
-
-    /** Check if X button pressed
-    * @returns true if yes, false if no
-    */
-    bool x_pressed();
-
-    /** Check if Y button pressed
-    * @returns true if yes, false if no
-    */
-    bool y_pressed();
-
-    /** Check if L button pressed
-    * @returns true if yes, false if no
-    */
-    bool l_pressed();
-
-    /** Check if R button pressed
-    * @returns true if yes, false if no
-    */
-    bool r_pressed();
-
-    /** Check if Back button pressed
-    * @returns true if yes, false if no
-    */
-    bool back_pressed();
-
-    /** Check if Start button pressed
-    * @returns true if yes, false if no
-    */
-    bool start_pressed();
-
-    /** Check if Joystick button pressed
-    * @returns true if yes, false if no
-    */
-    bool joystick_pressed();
-
+    /**
+     * @brief Check whether an event flag has been set and clear it
+     * @param id[in] The ID of the event to test
+     * @return true if the event occurred
+     */
+    bool check_event(GamepadEvent const id);
+    
     /** Get magnitude of joystick movement
     * @returns value in range 0.0 to 1.0
     */