ECE2035 Project 2
Dependencies: mbed mbed-rtos SDFileSystem
main.cpp@10:1994adcfc86f, 2021-04-20 (annotated)
- 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?
User | Revision | Line number | New 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=== |