A complex 2D-dungeon game on LPC1768 in SWJTU-Leeds Joint School XJEL2645 project. Referenced from the framework contributed by https://os.mbed.com/users/Siriagus/code/SimplePlatformGame/
Dependencies: mbed N5110 ShiftReg PinDetect
Diff: main.cpp
- Revision:
- 17:d6a3b29cab31
- Parent:
- 14:b4fed570abaf
- Child:
- 18:709ea375b0df
--- a/main.cpp Sun May 10 13:14:33 2015 +0000 +++ b/main.cpp Mon May 11 03:52:18 2015 +0000 @@ -2,24 +2,23 @@ * @file main.cpp * @brief Simple platform game developed for ELEC2645 Embedded Systems Project at University of Leeds * @author Andreas Garmannslund +* @date April/May 2015 */ #include "mbed.h" #include "N5110.h" -#include "PowerControl.h" +#include "PowerControl/PowerControl.h" +#include "PowerControl/EthernetPowerControl.h" #include "PinDetect.h" #include <string> #include <sstream> #include <ctime> #include "Joystick.h" - #include "StateManager.h" #include "State.h" -#include "images.h" #include "InputManager.h" - - +#include "Sound.h" // Redefine pin names for simple access. #define JOY_H p17 @@ -34,43 +33,27 @@ // Input and Output N5110 *lcd; /// Display +Sound *sound; // Sound: Piezo buzzer InputManager *input; /// Responsible for managing user input // Brightness potentiometer AnalogIn ledPot(LED_POT); -// Debugging -BusOut leds(LED1, LED2, LED3, LED4); - void init(); /// Set up initial variables void cleanUp(); /// Frees remaining allocated memory -StateManager* fsm; +StateManager* fsm; /// Finite state machine AnalogIn randomPin(p18); // Unconnected pin => noise, used for generating a random seed. AnalogIn randomPin2(p19); // Unconnected pin +LocalFileSystem local("local"); /// Local file system + /// Function for generating a random seed by using a unconnected analog input pin -// Problem: Not trully random as pin is fairly stable. It is unfortunately connected to the ground layer (often returning 0). Would be better to connect it to a "loose wire"/bad connection -unsigned int getRandSeed() -{ - unsigned int randNum = 0; - unsigned int lsb; // least significant bit - - for (unsigned int i = 0; i < 16; ++i) - { - lsb = 1 & (randomPin.read_u16()); // Read least significant bit in randomInput - value depends on noise - randNum |= (lsb << i); // Set bit nr.i to lsb in randomInput - - lsb = 1 & (randomPin2.read_u16()); - randNum |= (lsb << (16+i)); - } - - return randNum; -} - -Serial term(USBTX, USBRX); // TO DELETE - DEBUGGING ONLY +// Problem: Not trully random as pin is fairly stable. It is unfortunately connected to the ground layer (often returning 0). Would be better to connect it to a "loose wire"/bad connection- +unsigned int getRandSeed(); +void readHighscoreFile(); int main() { @@ -102,13 +85,16 @@ timer.reset(); } - cleanUp(); // Not really reached as the program never terminates. Added for completeness. + cleanUp(); // Not really reached as the program never terminates. Added for completeness. return 0; } void init() { + // Disable ethernet to save power + PHY_PowerDown(); + // Init LCD lcd = new N5110(p7, p8, p9, p10, p11, p13, p26); lcd->init(); @@ -118,11 +104,62 @@ // Input input = new InputManager(BUTTON_A, BUTTON_B, BUTTON_C, JOY_H, JOY_V, JOY_BTN); - fsm = new StateManager(lcd, input, TITLE_SCREEN); + // Sound + sound = new Sound(p21); + + // Finite state machine + fsm = new StateManager(lcd, input, sound, TITLE_SCREEN); + + readHighscoreFile(); // load highscores from file system + + sound->playNote(SFX::RESTART); +} + +void readHighscoreFile() +{ + FILE *fp = fopen("/local/highscores.txt", "r"); // read from local file + + if (!fp) // if file is not created yet the highscores will default values as defined in Global.cpp + return; + + char initials[4]; + char scoreStr[8]; + + for (int i = 0; i < 3; ++i) + { + fscanf(fp, "%s %s", initials, scoreStr); // read from file + + int score = atoi(scoreStr); // convert to int + + // update global highscore table + Global::highscores[i].initials = initials; + Global::highscores[i].score = score; + } + + fclose(fp); } void cleanUp() { delete lcd; delete input; + delete sound; +} + +/// Get a random seed based on unconnected analog input pins +unsigned int getRandSeed() +{ + unsigned int randNum = 0; + unsigned int lsb; // least significant bit + + for (unsigned int i = 0; i < 16; ++i) + { + lsb = 1 & (randomPin.read_u16()); // Read least significant bit in randomInput - value depends on noise + randNum |= (lsb << i); // Set bit nr.i to lsb in randomInput + + lsb = 1 & (randomPin2.read_u16()); + randNum |= (lsb << (16+i)); + } + + return randNum; } \ No newline at end of file