Library for ELEC2645 Gamepad PCB. University of Leeds Version 2 January 2020

Dependents:   ELEC2645_Ticker_WAV ELEC2645_Project_username ELEC2645_Project_el18vgt ELEC2645_Project_el17oc11 ... more

Revision:
21:da0b4e14c867
Parent:
20:c0959710291b
Child:
22:72357412608d
--- a/Gamepad.h	Wed Apr 26 13:58:10 2017 +0000
+++ b/Gamepad.h	Mon Jan 27 12:31:15 2020 +0000
@@ -11,11 +11,15 @@
 class AnalogIn;
 class InterruptIn;
 class PwmOut;
+class AnalogOut;
+class Ticker;
 class Timeout;
 }
 
 #define TOL 0.1f
 #define RAD2DEG 57.2957795131f
+#define PI 3.14159265359
+
 
 /** Enum for direction */
 enum Direction {
@@ -49,22 +53,6 @@
  */
 class Gamepad
 {
-public:
-/** Gamepad events 
- * @brief List of events that can be registered on the gamepad
- */
-enum GamepadEvent {
-    A_PRESSED,     ///< Button A has been pressed
-    B_PRESSED,     ///< Button B has been pressed
-    X_PRESSED,     ///< Button X has been pressed
-    Y_PRESSED,     ///< Button Y has been pressed
-    L_PRESSED,     ///< Button L has been pressed
-    R_PRESSED,     ///< Button R has been pressed
-    BACK_PRESSED,  ///< Button "Back" has been pressed
-    START_PRESSED, ///< Button "Start" has been pressed
-    JOY_PRESSED,   ///< Joystick button has been pressed
-    N_EVENTS       ///< A dummy flag that marks the end of the list
-};
 
 private:
     mbed::PwmOut *_led1;
@@ -78,33 +66,39 @@
     mbed::InterruptIn *_button_B;
     mbed::InterruptIn *_button_X;
     mbed::InterruptIn *_button_Y;
-    mbed::InterruptIn *_button_L;
-    mbed::InterruptIn *_button_R;
-    mbed::InterruptIn *_button_back;
     mbed::InterruptIn *_button_start;
-    mbed::InterruptIn *_button_joystick;
 
     mbed::AnalogIn *_vert;
     mbed::AnalogIn *_horiz;
 
-    mbed::PwmOut   *_buzzer;
-    mbed::AnalogIn *_pot;
-
-    mbed::Timeout *_timeout;
-
-    std::bitset<N_EVENTS> _event_state; ///< A binary list of buttons that has been pressed
+    mbed::AnalogIn *_pot1;
+    mbed::AnalogIn *_pot2;
+    
+    mbed::AnalogOut *dac;
+    mbed::Ticker *ticker;
+    mbed::Timeout *timeout;
+    mbed::Timeout *note_timeout;
 
     // centred x,y values
     float _x0;
     float _y0;
+    
+    float *_sample_array;
+    const int *_notes;
+    const int *_durations;
+    
+    int _n;
+    int _melody_length;
+    volatile unsigned int _sample;
+    volatile unsigned int _note;
+    float _bpm;
+    bool _repeat;
+    
 
 public:
     /** Constructor */
     Gamepad();
 
-    /** Destructor */
-    ~Gamepad();
-
     /** Initialise all peripherals and configure interrupts */
     void init();
 
@@ -125,37 +119,15 @@
     */
     void led(int n,float val) const;
 
-    /** Read potentiometer
+    /** Read potentiometer 1 value
     *@returns potentiometer value in range 0.0 to 1.0
     */
-    float read_pot() const;
-
-    /** Play tone on piezo
-    * @param frequency in Hz
-    * @param duration of tone in seconds
-    */
-    void tone(float frequency, float duration);
+    float read_pot1() const;
 
-    /**
-     * @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);
-
-    /**
-     * @brief   Get the raw binary event state
-     * @return  The event state as a binary code
-     * @details The check_event() function is likely to be more useful than
-     *          this, for testing whether a given event has occurred. It can be
-     *          useful for debugging via the terminal, however, for example:
-     *          @code
-     *          std::cout << gamepad.get_raw_event_state() << std::endl;
-     *          @endcode
-     */
-    inline std::bitset<N_EVENTS> get_raw_event_state() const {
-        return _event_state;
-    }
+    /** Read potentiometer 2 value
+    *@returns potentiometer value in range 0.0 to 1.0
+    */
+    float read_pot2() const;
 
     /** Get magnitude of joystick movement
     * @returns value in range 0.0 to 1.0
@@ -187,19 +159,200 @@
     */
     Polar get_polar();            // mag and angle in struct form
 
-private:
-    void init_buttons();
-    void tone_off();
+
+    /** Resets all button states. Useful for calling inbetween scenes
+    *   where you do not want button presses from the previous scene effecting
+    *   the current scene
+    */
+    void reset_buttons();
+
+    /** Returns true if A has been pressed
+    * @returns a bool corresponding to A being pressed
+    */
+
+    bool A_pressed();
+
+    /** Returns true if A is held
+    * @returns a bool corresponding to A being held
+    *
+    */
+    bool A_held();
+    
+
+    /** Returns true if B has been pressed
+    * @returns a bool corresponding to B being pressed
+    */
+    bool B_pressed();
+
+    /** Returns true if B is held
+    * @returns a bool corresponding to B being held
+    *
+    */
+    bool B_held();
+
+    /** Returns true if B has been pressed
+    * @returns a bool corresponding to B being pressed
+    */
+    bool X_pressed();
+
+    /** Returns true if X is held
+    * @returns a bool corresponding to X being held
+    *
+    */
+    bool X_held();    
+
+    /** Returns true if Y has been pressed
+    * @returns a bool corresponding to Y being pressed
+    */
+    bool Y_pressed();
 
-    void a_isr();
-    void b_isr();
-    void x_isr();
-    void y_isr();
-    void l_isr();
-    void r_isr();
-    void back_isr();
-    void start_isr();
-    void joy_isr();
+    /** Returns true if Y is held
+    * @returns a bool corresponding to Y being held
+    *
+    */
+    bool Y_held();
+
+
+    /** Returns true if start has been pressed
+    * @returns a bool corresponding to start being pressed
+    */
+    bool start_pressed();
+
+    /** Returns true if start is held
+    * @returns a bool corresponding to start being held
+    *
+    */
+    bool start_held();
+    
+    
+    // play single note of specific duration
+    void tone(const float frequency,const float duration);
+    
+    // play array of notes and duration, must send length and beats per minute
+    void play_melody(int length,const int *notes,const int *durations,float bpm,bool repeat);
+    
+    // change the BPM
+    void set_bpm(float bpm);
+
+
+
+
+private:
+
+    volatile bool A_fall;
+    void A_fall_interrupt();
+
+    volatile bool B_fall;
+    void B_fall_interrupt();
+    
+    volatile bool X_fall;
+    void X_fall_interrupt();
+
+    volatile bool Y_fall;
+    void Y_fall_interrupt();
+
+    volatile bool start_fall;
+    void start_fall_interrupt();
+
+   // Tone functions  
+    void ticker_isr();    
+    void timeout_isr();
+    void note_timeout_isr();  
+    void play_next_note();
+
+
+
 };
 
+// Note definitions from Arduino.cc
+#define NOTE_B0  31
+#define NOTE_C1  33
+#define NOTE_CS1 35
+#define NOTE_D1  37
+#define NOTE_DS1 39
+#define NOTE_E1  41
+#define NOTE_F1  44
+#define NOTE_FS1 46
+#define NOTE_G1  49
+#define NOTE_GS1 52
+#define NOTE_A1  55
+#define NOTE_AS1 58
+#define NOTE_B1  62
+#define NOTE_C2  65
+#define NOTE_CS2 69
+#define NOTE_D2  73
+#define NOTE_DS2 78
+#define NOTE_E2  82
+#define NOTE_F2  87
+#define NOTE_FS2 93
+#define NOTE_G2  98
+#define NOTE_GS2 104
+#define NOTE_A2  110
+#define NOTE_AS2 117
+#define NOTE_B2  123
+#define NOTE_C3  131
+#define NOTE_CS3 139
+#define NOTE_D3  147
+#define NOTE_DS3 156
+#define NOTE_E3  165
+#define NOTE_F3  175
+#define NOTE_FS3 185
+#define NOTE_G3  196
+#define NOTE_GS3 208
+#define NOTE_A3  220
+#define NOTE_AS3 233
+#define NOTE_B3  247
+#define NOTE_C4  262
+#define NOTE_CS4 277
+#define NOTE_D4  294
+#define NOTE_DS4 311
+#define NOTE_E4  330
+#define NOTE_F4  349
+#define NOTE_FS4 370
+#define NOTE_G4  392
+#define NOTE_GS4 415
+#define NOTE_A4  440
+#define NOTE_AS4 466
+#define NOTE_B4  494
+#define NOTE_C5  523
+#define NOTE_CS5 554
+#define NOTE_D5  587
+#define NOTE_DS5 622
+#define NOTE_E5  659
+#define NOTE_F5  698
+#define NOTE_FS5 740
+#define NOTE_G5  784
+#define NOTE_GS5 831
+#define NOTE_A5  880
+#define NOTE_AS5 932
+#define NOTE_B5  988
+#define NOTE_C6  1047
+#define NOTE_CS6 1109
+#define NOTE_D6  1175
+#define NOTE_DS6 1245
+#define NOTE_E6  1319
+#define NOTE_F6  1397
+#define NOTE_FS6 1480
+#define NOTE_G6  1568
+#define NOTE_GS6 1661
+#define NOTE_A6  1760
+#define NOTE_AS6 1865
+#define NOTE_B6  1976
+#define NOTE_C7  2093
+#define NOTE_CS7 2217
+#define NOTE_D7  2349
+#define NOTE_DS7 2489
+#define NOTE_E7  2637
+#define NOTE_F7  2794
+#define NOTE_FS7 2960
+#define NOTE_G7  3136
+#define NOTE_GS7 3322
+#define NOTE_A7  3520
+#define NOTE_AS7 3729
+#define NOTE_B7  3951
+#define NOTE_C8  4186
+#define NOTE_CS8 4435
+#define NOTE_D8  4699
+#define NOTE_DS8 4978
+
 #endif
\ No newline at end of file