ELEC2645 (2018/19) / Mbed 2 deprecated el17ajf

Dependencies:   mbed

Fork of el17ajf by Angus Findlay

Input/Input.cpp

Committer:
el17ajf
Date:
2019-03-19
Revision:
15:afeefa3ceb61
Parent:
13:59e17cab320a
Child:
16:3f84f2d7b910

File content as of revision 15:afeefa3ceb61:

#include "Input.h"
#include "Gamepad.h"
#include "mbed.h" // TODO DELETE

namespace Input {
    
    enum State {RELEASED, RELEASED_FRAME, HIT_FRAME, HELD};
    Gamepad * gamepad;
    const int NUMBER_OF_BUTTONS = 4;
    State states[4]; // NUM_OF_BS
    int frame_hit[4] = {-99}; // NUM_OF_BS
    int frame = 0;
    const int bounce_frames = 3;
    void updateButtonState(Button button, Gamepad::GamepadEvent event);
    bool canBounce(Button button);
    
    void init() {
        gamepad = new Gamepad();
        gamepad->init();
        
        for (int i = 0; i < NUMBER_OF_BUTTONS; i++) {
            states[i] = RELEASED;
        }
    }
    
    void deinit() {
        delete gamepad;
    }
    
    void update() {
        frame++;
        
        // update based on existing states
        for (int i = 0; i < NUMBER_OF_BUTTONS; i++) {
            if (states[i] == RELEASED_FRAME) {
                states[i] = RELEASED;
            }
            if (states[i] == HIT_FRAME) {
                states[i] = RELEASED_FRAME;
            }
        }
        
        // update state to reflect events
        updateButtonState(LEFT, Gamepad::A_PRESSED);
        updateButtonState(RIGHT, Gamepad::Y_PRESSED);
        updateButtonState(UP, Gamepad::X_PRESSED);
        updateButtonState(DOWN, Gamepad::B_PRESSED);
    }
    
    bool buttonHit(Button button) {
        return states[button] == HIT_FRAME;
    }
    
    bool buttonHeld(Button button) {
        return states[button] == HIT_FRAME
            || states[button] == HELD;
    }
    
    void updateButtonState(Button button, Gamepad::GamepadEvent event) {
        if (gamepad->check_event(event)) {
            if (canBounce(button)) {
                states[button] = HIT_FRAME;
                frame_hit[button] = frame;
            } else {
                states[button] = HELD;
            }
        }
    }
    
    bool canBounce(Button button) {
        if (frame > frame_hit[button] + bounce_frames) {
            return true;
        } else {
            return false;
        }
    } 
}