Andreas Garmannslund / Mbed 2 deprecated SimplePlatformGame

Dependencies:   N5110 PinDetect PowerControl mbed

Committer:
Siriagus
Date:
Sat May 09 14:39:48 2015 +0000
Revision:
14:b4fed570abaf
Parent:
13:7ab71c7c311b
Child:
17:d6a3b29cab31
Added function for generating random seed from two unconnected AnalogIn pins.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Siriagus 0:1f92de30d43e 1 /**
Siriagus 10:f2488a0ecab7 2 * @file main.cpp
Siriagus 10:f2488a0ecab7 3 * @brief Simple platform game developed for ELEC2645 Embedded Systems Project at University of Leeds
Siriagus 10:f2488a0ecab7 4 * @author Andreas Garmannslund
Siriagus 10:f2488a0ecab7 5 */
Siriagus 0:1f92de30d43e 6
Siriagus 0:1f92de30d43e 7 #include "mbed.h"
Siriagus 0:1f92de30d43e 8 #include "N5110.h"
Siriagus 1:0cfe2255092a 9 #include "PowerControl.h"
Siriagus 1:0cfe2255092a 10 #include "PinDetect.h"
Siriagus 4:d6661b976359 11 #include <string>
Siriagus 7:678873947b29 12 #include <sstream>
Siriagus 4:d6661b976359 13 #include <ctime>
Siriagus 1:0cfe2255092a 14
Siriagus 0:1f92de30d43e 15 #include "Joystick.h"
Siriagus 1:0cfe2255092a 16
Siriagus 5:100d960fc6d5 17 #include "StateManager.h"
Siriagus 1:0cfe2255092a 18 #include "State.h"
Siriagus 1:0cfe2255092a 19 #include "images.h"
Siriagus 4:d6661b976359 20 #include "InputManager.h"
Siriagus 1:0cfe2255092a 21
Siriagus 4:d6661b976359 22
Siriagus 0:1f92de30d43e 23
Siriagus 1:0cfe2255092a 24 // Redefine pin names for simple access.
Siriagus 1:0cfe2255092a 25 #define JOY_H p17
Siriagus 1:0cfe2255092a 26 #define JOY_V p16
Siriagus 1:0cfe2255092a 27 #define JOY_BTN p15
Siriagus 1:0cfe2255092a 28
Siriagus 1:0cfe2255092a 29 #define LED_POT p20
Siriagus 1:0cfe2255092a 30
Siriagus 2:0ae5ac8b0cac 31 #define BUTTON_A p28
Siriagus 2:0ae5ac8b0cac 32 #define BUTTON_B p27
Siriagus 1:0cfe2255092a 33 #define BUTTON_C p29
Siriagus 1:0cfe2255092a 34
Siriagus 4:d6661b976359 35 // Input and Output
Siriagus 10:f2488a0ecab7 36 N5110 *lcd; /// Display
Siriagus 4:d6661b976359 37
Siriagus 10:f2488a0ecab7 38 InputManager *input; /// Responsible for managing user input
Siriagus 4:d6661b976359 39
Siriagus 0:1f92de30d43e 40 // Brightness potentiometer
Siriagus 1:0cfe2255092a 41 AnalogIn ledPot(LED_POT);
Siriagus 0:1f92de30d43e 42
Siriagus 0:1f92de30d43e 43 // Debugging
Siriagus 0:1f92de30d43e 44 BusOut leds(LED1, LED2, LED3, LED4);
Siriagus 0:1f92de30d43e 45
Siriagus 10:f2488a0ecab7 46 void init(); /// Set up initial variables
Siriagus 10:f2488a0ecab7 47 void cleanUp(); /// Frees remaining allocated memory
Siriagus 1:0cfe2255092a 48
Siriagus 5:100d960fc6d5 49 StateManager* fsm;
Siriagus 5:100d960fc6d5 50
Siriagus 14:b4fed570abaf 51 AnalogIn randomPin(p18); // Unconnected pin => noise, used for generating a random seed.
Siriagus 14:b4fed570abaf 52 AnalogIn randomPin2(p19); // Unconnected pin
Siriagus 14:b4fed570abaf 53
Siriagus 14:b4fed570abaf 54 /// Function for generating a random seed by using a unconnected analog input pin
Siriagus 14:b4fed570abaf 55 // 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
Siriagus 14:b4fed570abaf 56 unsigned int getRandSeed()
Siriagus 14:b4fed570abaf 57 {
Siriagus 14:b4fed570abaf 58 unsigned int randNum = 0;
Siriagus 14:b4fed570abaf 59 unsigned int lsb; // least significant bit
Siriagus 14:b4fed570abaf 60
Siriagus 14:b4fed570abaf 61 for (unsigned int i = 0; i < 16; ++i)
Siriagus 14:b4fed570abaf 62 {
Siriagus 14:b4fed570abaf 63 lsb = 1 & (randomPin.read_u16()); // Read least significant bit in randomInput - value depends on noise
Siriagus 14:b4fed570abaf 64 randNum |= (lsb << i); // Set bit nr.i to lsb in randomInput
Siriagus 14:b4fed570abaf 65
Siriagus 14:b4fed570abaf 66 lsb = 1 & (randomPin2.read_u16());
Siriagus 14:b4fed570abaf 67 randNum |= (lsb << (16+i));
Siriagus 14:b4fed570abaf 68 }
Siriagus 14:b4fed570abaf 69
Siriagus 14:b4fed570abaf 70 return randNum;
Siriagus 14:b4fed570abaf 71 }
Siriagus 14:b4fed570abaf 72
Siriagus 14:b4fed570abaf 73 Serial term(USBTX, USBRX); // TO DELETE - DEBUGGING ONLY
Siriagus 14:b4fed570abaf 74
Siriagus 1:0cfe2255092a 75 int main()
Siriagus 14:b4fed570abaf 76 {
Siriagus 14:b4fed570abaf 77 srand(getRandSeed());
Siriagus 14:b4fed570abaf 78
Siriagus 1:0cfe2255092a 79 init();
Siriagus 1:0cfe2255092a 80
Siriagus 7:678873947b29 81 Timer timer;
Siriagus 7:678873947b29 82 timer.start();
Siriagus 4:d6661b976359 83
Siriagus 0:1f92de30d43e 84 while(true)
Siriagus 7:678873947b29 85 {
Siriagus 8:9ac6a428fa26 86 // We need to call Sleep() repeatedly, because periodic interrupts in InputManager will cause it to wake up every 20 ms.
Siriagus 8:9ac6a428fa26 87 while (timer.read() < 0.08)
Siriagus 8:9ac6a428fa26 88 Sleep();
Siriagus 8:9ac6a428fa26 89
Siriagus 7:678873947b29 90 // update
Siriagus 0:1f92de30d43e 91 lcd->setBrightness(1.0 - ledPot); // Update brightness of screen
Siriagus 7:678873947b29 92 fsm->update(timer.read());
Siriagus 7:678873947b29 93 input->joystick->update();
Siriagus 4:d6661b976359 94
Siriagus 4:d6661b976359 95 // render
Siriagus 5:100d960fc6d5 96 lcd->clear();
Siriagus 7:678873947b29 97 fsm->render();
Siriagus 5:100d960fc6d5 98 lcd->refresh();
Siriagus 1:0cfe2255092a 99
Siriagus 7:678873947b29 100 fsm->processRequest(); // Change the state if requested.
Siriagus 7:678873947b29 101
Siriagus 7:678873947b29 102 timer.reset();
Siriagus 0:1f92de30d43e 103 }
Siriagus 0:1f92de30d43e 104
Siriagus 10:f2488a0ecab7 105 cleanUp(); // Not really reached as the program never terminates. Added for completeness.
Siriagus 0:1f92de30d43e 106
Siriagus 0:1f92de30d43e 107 return 0;
Siriagus 3:4e3f342a135c 108 }
Siriagus 3:4e3f342a135c 109
Siriagus 3:4e3f342a135c 110 void init()
Siriagus 3:4e3f342a135c 111 {
Siriagus 3:4e3f342a135c 112 // Init LCD
Siriagus 3:4e3f342a135c 113 lcd = new N5110(p7, p8, p9, p10, p11, p13, p26);
Siriagus 3:4e3f342a135c 114 lcd->init();
Siriagus 3:4e3f342a135c 115 lcd->normalMode();
Siriagus 3:4e3f342a135c 116 lcd->setBrightness(1.0 - ledPot); // Update brightness of screen
Siriagus 3:4e3f342a135c 117
Siriagus 4:d6661b976359 118 // Input
Siriagus 8:9ac6a428fa26 119 input = new InputManager(BUTTON_A, BUTTON_B, BUTTON_C, JOY_H, JOY_V, JOY_BTN);
Siriagus 3:4e3f342a135c 120
Siriagus 8:9ac6a428fa26 121 fsm = new StateManager(lcd, input, TITLE_SCREEN);
Siriagus 3:4e3f342a135c 122 }
Siriagus 3:4e3f342a135c 123
Siriagus 3:4e3f342a135c 124 void cleanUp()
Siriagus 3:4e3f342a135c 125 {
Siriagus 3:4e3f342a135c 126 delete lcd;
Siriagus 4:d6661b976359 127 delete input;
Siriagus 1:0cfe2255092a 128 }