Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 12:1b0b6355da4f, committed 2017-03-03
- 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
*/