ECE2035 Project 2

Dependencies:   mbed mbed-rtos SDFileSystem

Committer:
kwengryn3
Date:
Tue Apr 20 18:15:22 2021 +0000
Revision:
10:1994adcfc86f
Parent:
9:f1d34ef049c5
adv features

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kwengryn3 0:bff8b9020128 1 //=================================================================
kwengryn3 0:bff8b9020128 2 // The main program file.
kwengryn3 0:bff8b9020128 3 //
kwengryn3 0:bff8b9020128 4 // Copyright 2020 Georgia Tech. All rights reserved.
kwengryn3 0:bff8b9020128 5 // The materials provided by the instructor in this course are for
kwengryn3 0:bff8b9020128 6 // the use of the students currently enrolled in the course.
kwengryn3 0:bff8b9020128 7 // Copyrighted course materials may not be further disseminated.
kwengryn3 0:bff8b9020128 8 // This file must not be made publicly available anywhere.
kwengryn3 0:bff8b9020128 9 //==================================================================
kwengryn3 0:bff8b9020128 10
kwengryn3 0:bff8b9020128 11 // External libs
kwengryn3 0:bff8b9020128 12 #include <stdlib.h>
kwengryn3 0:bff8b9020128 13
kwengryn3 0:bff8b9020128 14 // Project includes
kwengryn3 0:bff8b9020128 15 #include "globals.h"
kwengryn3 0:bff8b9020128 16 #include "hardware.h"
kwengryn3 0:bff8b9020128 17 #include "compost_pile_public.h"
kwengryn3 0:bff8b9020128 18 #include "fruit_public.h"
kwengryn3 0:bff8b9020128 19 #include "player_public.h"
kwengryn3 0:bff8b9020128 20 #include "mbed.h"
kwengryn3 4:8e15742ebcc6 21 #include "doubly_linked_list.h"
kwengryn3 5:b9b7993823e1 22 #include "rtos.h"
kwengryn3 7:95db0d89fbac 23 #include "Speaker.h"
kwengryn3 0:bff8b9020128 24
kwengryn3 0:bff8b9020128 25 //For sound components
kwengryn3 5:b9b7993823e1 26 //AnalogOut DACout(p18);
kwengryn3 7:95db0d89fbac 27 //PwmOut pwmout(p26);
kwengryn3 5:b9b7993823e1 28 //PwmOut speaker(p25);
kwengryn3 7:95db0d89fbac 29 Speaker speak(p25);
kwengryn3 0:bff8b9020128 30
kwengryn3 5:b9b7993823e1 31 //wave_player waver(&DACout);
kwengryn3 0:bff8b9020128 32 //SDFileSystem sd(p5, p6, p7, p8, "sd"); // mosi, miso, sck, cs
kwengryn3 0:bff8b9020128 33
kwengryn3 0:bff8b9020128 34 DigitalOut myled1(LED1);
kwengryn3 0:bff8b9020128 35 DigitalOut myled2(LED2);
kwengryn3 0:bff8b9020128 36 DigitalOut myled3(LED3);
kwengryn3 0:bff8b9020128 37 DigitalOut myled4(LED4);
kwengryn3 0:bff8b9020128 38 bool exitFlag = false;
kwengryn3 0:bff8b9020128 39 int score = 0;
kwengryn3 9:f1d34ef049c5 40 int lives = 3;
kwengryn3 5:b9b7993823e1 41 Thread thread;
kwengryn3 7:95db0d89fbac 42 int sound = 0;
kwengryn3 0:bff8b9020128 43
kwengryn3 0:bff8b9020128 44 // ===User implementations start===
kwengryn3 0:bff8b9020128 45 int fruit_contact(void); // iterate through fruits and see if any collided
kwengryn3 5:b9b7993823e1 46 int compost_pile_update(void);
kwengryn3 0:bff8b9020128 47
kwengryn3 5:b9b7993823e1 48 void playSound(void);
kwengryn3 0:bff8b9020128 49 void playNotes(void);
kwengryn3 0:bff8b9020128 50 void set_random_seed(Timer);
kwengryn3 9:f1d34ef049c5 51 int pause_menu();
kwengryn3 5:b9b7993823e1 52 bool compare_bounding_boxes(boundingBox box1, boundingBox box2);
kwengryn3 0:bff8b9020128 53
kwengryn3 0:bff8b9020128 54
kwengryn3 0:bff8b9020128 55
kwengryn3 0:bff8b9020128 56 int main()
kwengryn3 0:bff8b9020128 57 {
kwengryn3 0:bff8b9020128 58 GameInputs inputs;
kwengryn3 0:bff8b9020128 59 // First things first: initialize hardware
kwengryn3 0:bff8b9020128 60 ASSERT_P(hardware_init() == ERROR_NONE, "Hardware init failed!");
kwengryn3 0:bff8b9020128 61 pc.printf("Program Starting\n");
kwengryn3 4:8e15742ebcc6 62 pc.printf("-------------------------\n");
kwengryn3 0:bff8b9020128 63
kwengryn3 0:bff8b9020128 64
kwengryn3 0:bff8b9020128 65 // ===User implementations start===
kwengryn3 0:bff8b9020128 66 // Game state variables
kwengryn3 0:bff8b9020128 67
kwengryn3 0:bff8b9020128 68 // Timer to measure game update speed (secondarily used to generate random seed)
kwengryn3 0:bff8b9020128 69 Timer t;
kwengryn3 0:bff8b9020128 70 int dt; // delta time
kwengryn3 0:bff8b9020128 71 set_random_seed(t);
kwengryn3 0:bff8b9020128 72 wait(0.3);
kwengryn3 5:b9b7993823e1 73 //mkdir("/sd/wavfiles", 0777);
kwengryn3 7:95db0d89fbac 74 //pwmout.period(1.0/4000.0);
kwengryn3 7:95db0d89fbac 75 //playSound();//test the sound convert to thread
kwengryn3 0:bff8b9020128 76 //wait(0.1);
kwengryn3 0:bff8b9020128 77 //playNotes();
kwengryn3 0:bff8b9020128 78
kwengryn3 0:bff8b9020128 79 //initialize functions
kwengryn3 5:b9b7993823e1 80
kwengryn3 0:bff8b9020128 81 fruit_init();
kwengryn3 5:b9b7993823e1 82 player_init();
kwengryn3 5:b9b7993823e1 83 compost_pile_init();
kwengryn3 0:bff8b9020128 84 pc.printf("Initialization complete\n");
kwengryn3 5:b9b7993823e1 85 //uLCD.printf("Score: %d", score);
kwengryn3 0:bff8b9020128 86
kwengryn3 0:bff8b9020128 87 while(1)
kwengryn3 0:bff8b9020128 88 {
kwengryn3 0:bff8b9020128 89 t.start();
kwengryn3 4:8e15742ebcc6 90
kwengryn3 0:bff8b9020128 91 // Draw fruits first
kwengryn3 9:f1d34ef049c5 92 uLCD.text_string("",0, 0, FONT_7X8, BLACK);
kwengryn3 5:b9b7993823e1 93 uLCD.color(WHITE);
kwengryn3 9:f1d34ef049c5 94 uLCD.printf("X:%d|strk:%d pts:%d\n",lives, get_player_strikes(), score);
kwengryn3 9:f1d34ef049c5 95
kwengryn3 5:b9b7993823e1 96
kwengryn3 0:bff8b9020128 97 fruit_generator();
kwengryn3 0:bff8b9020128 98 //Put score on screen
kwengryn3 0:bff8b9020128 99 // NOTE: Text is 8 pixels tall
kwengryn3 5:b9b7993823e1 100
kwengryn3 0:bff8b9020128 101 player_move(inputs.ax);
kwengryn3 0:bff8b9020128 102
kwengryn3 9:f1d34ef049c5 103 if (get_player_strikes() == 0) {
kwengryn3 9:f1d34ef049c5 104 uLCD.cls();
kwengryn3 9:f1d34ef049c5 105 uLCD.printf("Game Ended:\n");
kwengryn3 9:f1d34ef049c5 106 uLCD.printf("Too Many Strikes\n\n");
kwengryn3 9:f1d34ef049c5 107 break;
kwengryn3 9:f1d34ef049c5 108
kwengryn3 9:f1d34ef049c5 109 }
kwengryn3 9:f1d34ef049c5 110
kwengryn3 0:bff8b9020128 111 inputs = read_inputs();
kwengryn3 0:bff8b9020128 112 if (!inputs.b1) {
kwengryn3 9:f1d34ef049c5 113 int action = pause_menu();
kwengryn3 9:f1d34ef049c5 114 if (action == 0) {
kwengryn3 9:f1d34ef049c5 115 break;
kwengryn3 9:f1d34ef049c5 116 }
kwengryn3 0:bff8b9020128 117 }
kwengryn3 0:bff8b9020128 118
kwengryn3 0:bff8b9020128 119
kwengryn3 0:bff8b9020128 120 if (!inputs.b3) {
kwengryn3 7:95db0d89fbac 121 //speak.PlayNote(400.0, 0.1, 0.1);
kwengryn3 7:95db0d89fbac 122 sound = 1;
kwengryn3 7:95db0d89fbac 123 thread.start(playSound);
kwengryn3 0:bff8b9020128 124 player_throw();
kwengryn3 0:bff8b9020128 125 }
kwengryn3 0:bff8b9020128 126
kwengryn3 5:b9b7993823e1 127
kwengryn3 5:b9b7993823e1 128 //handling collisions in the compost pile
kwengryn3 5:b9b7993823e1 129 int compost_contact = compost_pile_update();
kwengryn3 0:bff8b9020128 130
kwengryn3 5:b9b7993823e1 131 if (compost_contact == 1) {
kwengryn3 9:f1d34ef049c5 132 lives--;
kwengryn3 9:f1d34ef049c5 133 if (lives == 0) {
kwengryn3 9:f1d34ef049c5 134 uLCD.cls();
kwengryn3 9:f1d34ef049c5 135 uLCD.printf("Game Ended:\n");
kwengryn3 9:f1d34ef049c5 136 uLCD.printf("Too Much Compost\n\n");
kwengryn3 9:f1d34ef049c5 137 break;
kwengryn3 9:f1d34ef049c5 138 } else {
kwengryn3 9:f1d34ef049c5 139 remove_tallest_pile();
kwengryn3 9:f1d34ef049c5 140 }
kwengryn3 9:f1d34ef049c5 141
kwengryn3 5:b9b7993823e1 142 }
kwengryn3 0:bff8b9020128 143
kwengryn3 5:b9b7993823e1 144
kwengryn3 5:b9b7993823e1 145 //checking for knife contact
kwengryn3 5:b9b7993823e1 146 int knife_contact = fruit_contact();
kwengryn3 0:bff8b9020128 147
kwengryn3 5:b9b7993823e1 148 if (knife_contact == -1) {
kwengryn3 9:f1d34ef049c5 149 lives--;
kwengryn3 9:f1d34ef049c5 150 if (lives == 0) {
kwengryn3 9:f1d34ef049c5 151 uLCD.cls();
kwengryn3 9:f1d34ef049c5 152 uLCD.printf("Game Ended:\nBomb Destroyed\n\n");
kwengryn3 9:f1d34ef049c5 153 break;
kwengryn3 9:f1d34ef049c5 154 }
kwengryn3 9:f1d34ef049c5 155
kwengryn3 5:b9b7993823e1 156 }
kwengryn3 0:bff8b9020128 157
kwengryn3 5:b9b7993823e1 158 if (score == 10) {
kwengryn3 5:b9b7993823e1 159 uLCD.cls();
kwengryn3 5:b9b7993823e1 160 uLCD.printf("Victory!\n\n");
kwengryn3 9:f1d34ef049c5 161 break;
kwengryn3 5:b9b7993823e1 162 }
kwengryn3 5:b9b7993823e1 163
kwengryn3 0:bff8b9020128 164
kwengryn3 0:bff8b9020128 165 // TODO: Check if game won
kwengryn3 0:bff8b9020128 166
kwengryn3 0:bff8b9020128 167 // Compute update time
kwengryn3 0:bff8b9020128 168 t.stop();
kwengryn3 0:bff8b9020128 169 dt = t.read_ms();
kwengryn3 0:bff8b9020128 170
kwengryn3 0:bff8b9020128 171 if (dt < 100) wait_ms(100 - dt);
kwengryn3 0:bff8b9020128 172
kwengryn3 0:bff8b9020128 173 }
kwengryn3 5:b9b7993823e1 174 uLCD.color(0xFF0000);
kwengryn3 5:b9b7993823e1 175 uLCD.printf("Final Score: %d\n", score);
kwengryn3 0:bff8b9020128 176 destroyList(get_fruit_list());
kwengryn3 5:b9b7993823e1 177 //thread.stop();
kwengryn3 0:bff8b9020128 178
kwengryn3 0:bff8b9020128 179 return 0;
kwengryn3 0:bff8b9020128 180 // ===User implementations end===
kwengryn3 0:bff8b9020128 181 }
kwengryn3 0:bff8b9020128 182
kwengryn3 0:bff8b9020128 183 // ===User implementations start===
kwengryn3 0:bff8b9020128 184
kwengryn3 0:bff8b9020128 185 /* This function iterate through the fruit list, checking if anyone one of them is contacting
kwengryn3 0:bff8b9020128 186 * with the player's knife. Don't forget to check if the "fruit" is the bomb, since we
kwengryn3 0:bff8b9020128 187 * generated bombs using the fruit_generator.
kwengryn3 0:bff8b9020128 188 */
kwengryn3 0:bff8b9020128 189 int fruit_contact(void) {
kwengryn3 5:b9b7993823e1 190 PLAYER player = player_get_info();
kwengryn3 5:b9b7993823e1 191 if (player.player_has_knife) {
kwengryn3 5:b9b7993823e1 192 return 0;
kwengryn3 5:b9b7993823e1 193 }
kwengryn3 5:b9b7993823e1 194 DLinkedList* fruits = get_fruit_list();
kwengryn3 5:b9b7993823e1 195 LLNode* curr = fruits->head;
kwengryn3 5:b9b7993823e1 196 while (curr) {
kwengryn3 5:b9b7993823e1 197 FRUIT* fruitData = (FRUIT*)curr->data;
kwengryn3 5:b9b7993823e1 198 boundingBox box1 = player.knife_boundingBox;
kwengryn3 5:b9b7993823e1 199 boundingBox box2 = fruitData->box;
kwengryn3 5:b9b7993823e1 200 if (compare_bounding_boxes(box1, box2)) {
kwengryn3 5:b9b7993823e1 201 fruitData->status = FRUIT_SLICED;
kwengryn3 5:b9b7993823e1 202 if (fruitData->type == 0) {
kwengryn3 9:f1d34ef049c5 203 player_knife_return();
kwengryn3 5:b9b7993823e1 204 return -1;
kwengryn3 5:b9b7993823e1 205 }
kwengryn3 9:f1d34ef049c5 206 //player_knife_return();
kwengryn3 5:b9b7993823e1 207 score++;
kwengryn3 7:95db0d89fbac 208 //pc.printf("score: %d\n", score);
kwengryn3 7:95db0d89fbac 209 sound = 2;
kwengryn3 7:95db0d89fbac 210 thread.start(playSound);
kwengryn3 5:b9b7993823e1 211 return 1;
kwengryn3 5:b9b7993823e1 212 }
kwengryn3 5:b9b7993823e1 213 curr = curr->next;
kwengryn3 5:b9b7993823e1 214 }
kwengryn3 5:b9b7993823e1 215 return 0;
kwengryn3 5:b9b7993823e1 216
kwengryn3 0:bff8b9020128 217 }
kwengryn3 0:bff8b9020128 218
kwengryn3 0:bff8b9020128 219 /** Call compost_pile_update() repeatedly in your game-loop. ex: main()
kwengryn3 0:bff8b9020128 220 This function iterate through the fruit list. Add fruits that reach the bottom of the screen
kwengryn3 0:bff8b9020128 221 to the compost pile.
kwengryn3 0:bff8b9020128 222 @return Number of remaining cities. You might end the game when all cities are demolished.
kwengryn3 0:bff8b9020128 223 */
kwengryn3 5:b9b7993823e1 224 int compost_pile_update(void){
kwengryn3 5:b9b7993823e1 225 DLinkedList* fruits = get_fruit_list();
kwengryn3 5:b9b7993823e1 226 int numPiles = get_num_piles();
kwengryn3 5:b9b7993823e1 227 for (int i = 0; i < numPiles; i++) {
kwengryn3 5:b9b7993823e1 228 LLNode* curr = fruits->head;
kwengryn3 5:b9b7993823e1 229 while (curr) {
kwengryn3 5:b9b7993823e1 230 FRUIT* fruitData = (FRUIT*)curr->data;
kwengryn3 5:b9b7993823e1 231 boundingBox box1 = compost_get_info(i).box;
kwengryn3 5:b9b7993823e1 232 boundingBox box2 = fruitData->box;
kwengryn3 5:b9b7993823e1 233 if (compare_bounding_boxes(box1, box2)) {
kwengryn3 5:b9b7993823e1 234 //pc.printf("Collision between fruit and compost\n");
kwengryn3 5:b9b7993823e1 235 fruitData->status = FRUIT_SLICED;
kwengryn3 5:b9b7993823e1 236 compost_add(i);
kwengryn3 5:b9b7993823e1 237 if (check_overflow()) {
kwengryn3 5:b9b7993823e1 238 return 1;
kwengryn3 5:b9b7993823e1 239 }
kwengryn3 5:b9b7993823e1 240 return 0;
kwengryn3 5:b9b7993823e1 241 }
kwengryn3 5:b9b7993823e1 242 curr = curr->next;
kwengryn3 5:b9b7993823e1 243 }
kwengryn3 5:b9b7993823e1 244 }
kwengryn3 5:b9b7993823e1 245 draw_compost();
kwengryn3 5:b9b7993823e1 246 return 0;
kwengryn3 5:b9b7993823e1 247
kwengryn3 5:b9b7993823e1 248 }
kwengryn3 5:b9b7993823e1 249
kwengryn3 5:b9b7993823e1 250 bool compare_bounding_boxes(boundingBox box1, boundingBox box2) {
kwengryn3 5:b9b7993823e1 251 return ((box1.topLeft.x < box2.bottomRight.x) && (box1.bottomRight.x > box2.topLeft.x) &&
kwengryn3 5:b9b7993823e1 252 (box1.topLeft.y < box2.bottomRight.y) && (box1.bottomRight.y > box2.topLeft.y));
kwengryn3 0:bff8b9020128 253 }
kwengryn3 0:bff8b9020128 254
kwengryn3 0:bff8b9020128 255 //fcn to play a wav
kwengryn3 5:b9b7993823e1 256 void playSound()
kwengryn3 0:bff8b9020128 257 {
kwengryn3 0:bff8b9020128 258 //open wav file
kwengryn3 0:bff8b9020128 259 FILE *wave_file;
kwengryn3 7:95db0d89fbac 260 char* wav;
kwengryn3 7:95db0d89fbac 261
kwengryn3 7:95db0d89fbac 262 switch (sound) {
kwengryn3 7:95db0d89fbac 263 case 1:
kwengryn3 7:95db0d89fbac 264 wav = "/sd/wavfiles/FIRE.wav";
kwengryn3 7:95db0d89fbac 265 break;
kwengryn3 7:95db0d89fbac 266 case 2:
kwengryn3 7:95db0d89fbac 267 wav = "/sd/wavfiles/SCORE.wav";
kwengryn3 7:95db0d89fbac 268 break;
kwengryn3 7:95db0d89fbac 269 default:
kwengryn3 7:95db0d89fbac 270 break;
kwengryn3 7:95db0d89fbac 271
kwengryn3 7:95db0d89fbac 272 }
kwengryn3 7:95db0d89fbac 273
kwengryn3 0:bff8b9020128 274 wave_file=fopen(wav,"r");
kwengryn3 5:b9b7993823e1 275 //waver.set_verbosity(1);
kwengryn3 0:bff8b9020128 276
kwengryn3 0:bff8b9020128 277 if(wave_file != NULL)
kwengryn3 0:bff8b9020128 278 {
kwengryn3 5:b9b7993823e1 279 pc.printf("File opened successfully\n");
kwengryn3 0:bff8b9020128 280
kwengryn3 0:bff8b9020128 281 //play wav file
kwengryn3 5:b9b7993823e1 282 pc.printf("Sound playing...\n");
kwengryn3 0:bff8b9020128 283 waver.play(wave_file);
kwengryn3 0:bff8b9020128 284
kwengryn3 0:bff8b9020128 285 //close wav file
kwengryn3 5:b9b7993823e1 286 pc.printf("Sound stopped...\n");
kwengryn3 0:bff8b9020128 287 fclose(wave_file);
kwengryn3 0:bff8b9020128 288 return;
kwengryn3 0:bff8b9020128 289 }
kwengryn3 0:bff8b9020128 290
kwengryn3 5:b9b7993823e1 291 pc.printf("Could not open file for reading - %s\n", wav);
kwengryn3 0:bff8b9020128 292 return;
kwengryn3 0:bff8b9020128 293 }
kwengryn3 0:bff8b9020128 294
kwengryn3 0:bff8b9020128 295 /* Wanna hear some annoying sounds?*/
kwengryn3 0:bff8b9020128 296 void playNotes(void)
kwengryn3 0:bff8b9020128 297 {
kwengryn3 0:bff8b9020128 298 int i;
kwengryn3 0:bff8b9020128 299 // generate a 500Hz tone using PWM hardware output
kwengryn3 0:bff8b9020128 300 speaker.period(1.0/500.0); // 500hz period
kwengryn3 0:bff8b9020128 301 speaker =0.5; //50% duty cycle - max volume
kwengryn3 0:bff8b9020128 302 wait(3);
kwengryn3 0:bff8b9020128 303 speaker=0.0; // turn off audio
kwengryn3 0:bff8b9020128 304 wait(2);
kwengryn3 0:bff8b9020128 305 // generate a short 150Hz tone using PWM hardware output
kwengryn3 0:bff8b9020128 306 // something like this can be used for a button click effect for feedback
kwengryn3 0:bff8b9020128 307 for (i=0; i<10; i++) {
kwengryn3 0:bff8b9020128 308 speaker.period(1.0/150.0); // 500hz period
kwengryn3 0:bff8b9020128 309 speaker =0.25; //25% duty cycle - mid range volume
kwengryn3 0:bff8b9020128 310 wait(.02);
kwengryn3 0:bff8b9020128 311 speaker=0.0; // turn off audio
kwengryn3 0:bff8b9020128 312 wait(0.5);
kwengryn3 0:bff8b9020128 313 }
kwengryn3 0:bff8b9020128 314
kwengryn3 0:bff8b9020128 315 // sweep up in frequency by changing the PWM period
kwengryn3 0:bff8b9020128 316 for (i=0; i<8000; i=i+100) {
kwengryn3 0:bff8b9020128 317 speaker.period(1.0/float(i));
kwengryn3 0:bff8b9020128 318 speaker=0.25;
kwengryn3 0:bff8b9020128 319 wait(.1);
kwengryn3 0:bff8b9020128 320 }
kwengryn3 0:bff8b9020128 321 wait(2);
kwengryn3 0:bff8b9020128 322
kwengryn3 0:bff8b9020128 323 // two tone police siren effect -  two periods or two frequencies
kwengryn3 0:bff8b9020128 324 // increase volume - by changing the PWM duty cycle
kwengryn3 0:bff8b9020128 325 for (i=0; i<26; i=i+2) {
kwengryn3 0:bff8b9020128 326 speaker.period(1.0/969.0);
kwengryn3 0:bff8b9020128 327 speaker = float(i)/50.0;
kwengryn3 0:bff8b9020128 328 wait(.5);
kwengryn3 0:bff8b9020128 329 speaker.period(1.0/800.0);
kwengryn3 0:bff8b9020128 330 wait(.5);
kwengryn3 0:bff8b9020128 331 }
kwengryn3 0:bff8b9020128 332 // decrease volume
kwengryn3 0:bff8b9020128 333 for (i=25; i>=0; i=i-2) {
kwengryn3 0:bff8b9020128 334 speaker.period(1.0/969.0);
kwengryn3 0:bff8b9020128 335 speaker = float(i)/50.0;
kwengryn3 0:bff8b9020128 336 wait(.5);
kwengryn3 0:bff8b9020128 337 speaker.period(1.0/800.0);
kwengryn3 0:bff8b9020128 338 wait(.5);
kwengryn3 0:bff8b9020128 339 }
kwengryn3 0:bff8b9020128 340 speaker =0.0;
kwengryn3 0:bff8b9020128 341 wait(2);
kwengryn3 0:bff8b9020128 342 }
kwengryn3 0:bff8b9020128 343
kwengryn3 0:bff8b9020128 344 void set_random_seed(Timer t) {
kwengryn3 7:95db0d89fbac 345 //thread.start(playSound);
kwengryn3 0:bff8b9020128 346 GameInputs inputs;
kwengryn3 0:bff8b9020128 347 t.start();
kwengryn3 0:bff8b9020128 348 uLCD.printf("Push any button to start.\n");
kwengryn3 0:bff8b9020128 349 while(1){
kwengryn3 0:bff8b9020128 350 inputs = read_inputs();
kwengryn3 7:95db0d89fbac 351 if (!inputs.b1 || !inputs.b2 || !inputs.b3) {
kwengryn3 7:95db0d89fbac 352 break;
kwengryn3 7:95db0d89fbac 353 }
kwengryn3 7:95db0d89fbac 354 }
kwengryn3 0:bff8b9020128 355 uLCD.cls();
kwengryn3 0:bff8b9020128 356 t.stop();
kwengryn3 0:bff8b9020128 357 int seed = t.read_ms();
kwengryn3 0:bff8b9020128 358 srand(seed);
kwengryn3 0:bff8b9020128 359 }
kwengryn3 9:f1d34ef049c5 360
kwengryn3 9:f1d34ef049c5 361 int pause_menu() {
kwengryn3 9:f1d34ef049c5 362 uLCD.cls();
kwengryn3 9:f1d34ef049c5 363 uLCD.printf(" Game Paused\n\n\n");
kwengryn3 9:f1d34ef049c5 364 uLCD.printf(" End Game | Play");
kwengryn3 9:f1d34ef049c5 365 GameInputs inputs;
kwengryn3 9:f1d34ef049c5 366 while(1) {
kwengryn3 9:f1d34ef049c5 367 inputs = read_inputs();
kwengryn3 9:f1d34ef049c5 368 if (!inputs.b1) {
kwengryn3 9:f1d34ef049c5 369 uLCD.cls();
kwengryn3 9:f1d34ef049c5 370 return 0;
kwengryn3 9:f1d34ef049c5 371 }
kwengryn3 9:f1d34ef049c5 372 if (!inputs.b3) {
kwengryn3 9:f1d34ef049c5 373 uLCD.cls();
kwengryn3 9:f1d34ef049c5 374 return 1;
kwengryn3 9:f1d34ef049c5 375 }
kwengryn3 9:f1d34ef049c5 376
kwengryn3 9:f1d34ef049c5 377 }
kwengryn3 9:f1d34ef049c5 378
kwengryn3 9:f1d34ef049c5 379
kwengryn3 9:f1d34ef049c5 380
kwengryn3 9:f1d34ef049c5 381
kwengryn3 9:f1d34ef049c5 382 }
kwengryn3 0:bff8b9020128 383 // ===User implementations end===