Andreas Garmannslund / Mbed 2 deprecated SimplePlatformGame

Dependencies:   N5110 PinDetect PowerControl mbed

main.cpp

Committer:
Siriagus
Date:
2015-04-28
Revision:
2:0ae5ac8b0cac
Parent:
1:0cfe2255092a
Child:
3:4e3f342a135c

File content as of revision 2:0ae5ac8b0cac:

/**
@brief Simple platform game developed for ELEC2645 Embedded Systems Project at University of Leeds

@author Andreas Garmannslund
**/

#include "mbed.h"
#include "N5110.h"
#include "PowerControl.h"
#include "PinDetect.h"

#include "Joystick.h"
#include <string>

#include "State.h"
#include "MainMenu.h"
#include "map.h"
#include "images.h"

#include <ctime>

// Redefine pin names for simple access.
#define JOY_H p17
#define JOY_V p16
#define JOY_BTN p15

#define LED_POT p20

#define BUTTON_A p28
#define BUTTON_B p27
#define BUTTON_C p29

enum MenuState {SELECT_MENU, HIGH_SCORES, CONTROLS, LOAD_GAME};
MenuState currentState; // current state

// Components
N5110 *lcd; // VCC, SCE, RST, D/C, MOSI, SCLK and LED
Joystick *joystick;

// Brightness potentiometer
AnalogIn ledPot(LED_POT);

/*
// Buttons
DigitalIn btnA(p27);
DigitalIn btnB(p28);
DigitalIn btnC(p29);
*/

// Debugging
Serial pc(USBTX, USBRX);
BusOut leds(LED1, LED2, LED3, LED4);


// @brief Clears the screen and fill it with the image in the argument.
void clearAndDrawImage(const int img[BANKS][WIDTH])
{
    for (int i = 0; i < BANKS; ++i)
    {
        for (int j = 0; j < WIDTH; ++j)
        {
            lcd->buffer[j][i] = img[i][j];
        }
    }
    lcd->refresh();
}

State *stateObj; // current state object
void init()
{
    // Init LCD
    lcd = new N5110(p7, p8, p9, p10, p11, p13, p26);
    lcd->init();
    //lcd->normalMode();
    lcd->setBrightness(1.0 - ledPot); // Update brightness of screen
    
    // Init joystick
    joystick = new Joystick(JOY_H, JOY_V, JOY_BTN);
    joystick->calibrate();
    
    // Set initial state    
//    currentState = MENU;

    currentState = SELECT_MENU;
//    stateObj = new MainMenu(lcd, BUTTON_A, BUTTON_B, BUTTON_C);
}

void cleanUp()
{
    delete lcd;
    delete joystick;
    delete stateObj;
}

// States


const int NUM_CHOICES = 3;
std::string choices[NUM_CHOICES] = {"Play", "High Score", "Controls"};
int selectedChoice = 0;

PinDetect btnA(BUTTON_A);
PinDetect btnB(BUTTON_B);
PinDetect btnC(BUTTON_C);

void btnAPressed()
{
    switch(currentState)
    {
        case SELECT_MENU:
            switch(selectedChoice)
            {
                case 0:
                    currentState = LOAD_GAME;
                break;
                
                case 1:
                    currentState = HIGH_SCORES;
                break;
                
                case 2:
                    currentState = CONTROLS;
                break;
            }
        break;
        
        case CONTROLS:
        case HIGH_SCORES:
            currentState = SELECT_MENU;
        break;
    }

}
void btnBPressed()
{
    switch(currentState)
    {
        case HIGH_SCORES:
        case CONTROLS:
            currentState = SELECT_MENU;
        break;
    }
    
}

void btnCPressed()
{
    if (currentState == SELECT_MENU)
        selectedChoice = (selectedChoice + 1) % NUM_CHOICES;
}

// Processes button input.
int buttons = 0; // Three first bit corresponds the buttons
void processButtonInput(int buttonPressed)
{
    switch(buttonPressed)
    {
        case 0:     // Button A
            btnAPressed();
        break;
        
        case 1:     // Button B
            btnBPressed();
        break;
        
        case 2:     // Button C
            btnCPressed();
        break;
    }
}

int main()
{
    init();
    
    // button
    btnA.attach_asserted(&btnAPressed);
    btnB.attach_asserted(&btnBPressed);
    btnC.attach_asserted(&btnCPressed);
    
    btnA.setSampleFrequency();
    btnB.setSampleFrequency();
    btnC.setSampleFrequency();
    // Game loop, fixed-time step, updates game logic with regular intervals, rendering happens as fast as possible
    while(true)
    {   
        lcd->clear();
        
        //stateObj->run();
    
        joystick->update();
        lcd->setBrightness(1.0 - ledPot); // Update brightness of screen
        
        // Process events
        
        
        // Update
        switch (currentState)
        {
            case SELECT_MENU:            
                for (int i = 0; i < 3; ++i)
                {
                    std::string str = (selectedChoice == i) ? ("> " + choices[i]) : choices[i];
                    lcd->printString(str.c_str(), 10, i+1);
                }
            break;
            
            case HIGH_SCORES:
            // Placeholder TODO: Actually high scores
                lcd->printString("High Scores", 10, 0);
                lcd->printString("AND 1000000", 10, 1);
                lcd->printString("AND  500000", 10, 2);
                lcd->printString("AND     100", 10, 3);
                lcd->printString("> Back", 10, 4);
            break;
            
            case CONTROLS:
                lcd->printString("Controls", 10, 0);
                lcd->printString("A: Jump", 10, 1);
                lcd->printString("B: Shoot", 10, 2);
                lcd->printString("C: Pause", 10, 3);
                lcd->printString("> Back", 10, 4);
            break;
            
            case LOAD_GAME:
                lcd->inverseMode();
                clearAndDrawImage(logo);
            break;
                
        }
        
        lcd->refresh();
        Sleep();
    }
    
    cleanUp();
    
    return 0;
}