Rocket threading between missiles game, using touch keypad, audio amp, sd card, ulcd, ulcd sd graphics

Dependencies:   4DGL-uLCD-SE MPR121_Demo SDFileSystem mbed-rtos mbed wave_player

Committer:
atran43
Date:
Tue Nov 01 22:16:50 2016 +0000
Revision:
1:def75d5dff9d
Parent:
0:d3ee0d224bca
version1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
atran43 0:d3ee0d224bca 1 #include "mbed.h"
atran43 0:d3ee0d224bca 2 #include "rtos.h"
atran43 0:d3ee0d224bca 3 #include "SDFileSystem.h"
atran43 0:d3ee0d224bca 4 #include "wave_player.h"
atran43 0:d3ee0d224bca 5 #include "uLCD_4DGL.h"
atran43 0:d3ee0d224bca 6 #include "mpr121.h"
atran43 0:d3ee0d224bca 7
atran43 0:d3ee0d224bca 8 Mutex lcd_mutex;
atran43 0:d3ee0d224bca 9
atran43 0:d3ee0d224bca 10 uLCD_4DGL uLCD(p9, p10, p12); // uLCD-144-G2 screen, (serial tx, serial rx, reset pin)
atran43 0:d3ee0d224bca 11 int currentShipX;
atran43 0:d3ee0d224bca 12 float x;
atran43 0:d3ee0d224bca 13 AnalogOut DACout(p18);
atran43 0:d3ee0d224bca 14 wave_player waver(&DACout);
atran43 0:d3ee0d224bca 15
atran43 0:d3ee0d224bca 16
atran43 0:d3ee0d224bca 17 //8 missiles
atran43 0:d3ee0d224bca 18 int missile0 [1][2]; // 1 row 2 col
atran43 0:d3ee0d224bca 19 int missile1 [1][2];
atran43 0:d3ee0d224bca 20 int missile2 [1][2];
atran43 0:d3ee0d224bca 21 int missile3 [1][2];
atran43 0:d3ee0d224bca 22
atran43 0:d3ee0d224bca 23 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
atran43 0:d3ee0d224bca 24
atran43 0:d3ee0d224bca 25 // Create the interrupt receiver object on pin 26
atran43 0:d3ee0d224bca 26 InterruptIn interrupt(p26);
atran43 0:d3ee0d224bca 27 // Setup the i2c bus on pins 9 and 10
atran43 0:d3ee0d224bca 28 I2C i2c(p28, p27);
atran43 0:d3ee0d224bca 29 // Setup the Mpr121:
atran43 0:d3ee0d224bca 30 // constructor(i2c object, i2c address of the mpr121)
atran43 0:d3ee0d224bca 31 Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);
atran43 0:d3ee0d224bca 32
atran43 0:d3ee0d224bca 33 void fallInterrupt();
atran43 0:d3ee0d224bca 34 void gameover();
atran43 0:d3ee0d224bca 35 void moveShip(void const *args);
atran43 0:d3ee0d224bca 36 void moveMissile0(void const *args);
atran43 0:d3ee0d224bca 37 //void sd_sound(void const *args);
atran43 0:d3ee0d224bca 38 int getRandNum();
atran43 0:d3ee0d224bca 39
atran43 0:d3ee0d224bca 40 void moveShip(void const *args){
atran43 0:d3ee0d224bca 41
atran43 0:d3ee0d224bca 42 currentShipX = 64;
atran43 0:d3ee0d224bca 43 lcd_mutex.lock();
atran43 0:d3ee0d224bca 44 uLCD.media_init();
atran43 0:d3ee0d224bca 45 uLCD.set_sector_address(0x0040, 0x4083);
atran43 0:d3ee0d224bca 46 uLCD.display_image(currentShipX, 112);
atran43 0:d3ee0d224bca 47 lcd_mutex.unlock();
atran43 0:d3ee0d224bca 48
atran43 0:d3ee0d224bca 49 while(1) {
atran43 0:d3ee0d224bca 50
atran43 0:d3ee0d224bca 51 lcd_mutex.lock();
atran43 0:d3ee0d224bca 52 uLCD.filled_rectangle(currentShipX - 16, 112 , currentShipX , 128 ,WHITE);
atran43 0:d3ee0d224bca 53 uLCD.filled_rectangle(currentShipX + 16, 112 ,currentShipX + 32 , 128 ,WHITE);
atran43 0:d3ee0d224bca 54 uLCD.media_init();
atran43 0:d3ee0d224bca 55 uLCD.set_sector_address(0x0040, 0x4083);
atran43 0:d3ee0d224bca 56 uLCD.display_image(currentShipX, 112);
atran43 0:d3ee0d224bca 57 uLCD.filled_rectangle(currentShipX - 16, 112 , currentShipX , 128 ,WHITE);
atran43 0:d3ee0d224bca 58 uLCD.filled_rectangle(currentShipX + 16, 112 ,currentShipX + 32 , 128 ,WHITE);
atran43 0:d3ee0d224bca 59 lcd_mutex.unlock();
atran43 0:d3ee0d224bca 60
atran43 0:d3ee0d224bca 61 }
atran43 0:d3ee0d224bca 62
atran43 0:d3ee0d224bca 63
atran43 0:d3ee0d224bca 64 }
atran43 0:d3ee0d224bca 65
atran43 0:d3ee0d224bca 66 //Move Missile 0
atran43 0:d3ee0d224bca 67 void moveMissile0(void const *args) {
atran43 0:d3ee0d224bca 68 Thread::wait(1000);
atran43 0:d3ee0d224bca 69
atran43 0:d3ee0d224bca 70 missile0[0][0] = getRandNum(); //x coordinate
atran43 0:d3ee0d224bca 71 missile0[0][1] = 0; //y coordinate
atran43 0:d3ee0d224bca 72
atran43 0:d3ee0d224bca 73 //draw Missile
atran43 0:d3ee0d224bca 74 lcd_mutex.lock();
atran43 0:d3ee0d224bca 75 uLCD.media_init();
atran43 0:d3ee0d224bca 76 uLCD.set_sector_address(0x0040, 0x4081);
atran43 0:d3ee0d224bca 77 uLCD.display_image(missile0[0][0], missile0[0][1]);
atran43 0:d3ee0d224bca 78 lcd_mutex.unlock();
atran43 0:d3ee0d224bca 79
atran43 0:d3ee0d224bca 80 while(1) {
atran43 0:d3ee0d224bca 81
atran43 0:d3ee0d224bca 82 lcd_mutex.lock();
atran43 0:d3ee0d224bca 83 uLCD.filled_rectangle(missile0[0][0], missile0[0][1] ,missile0[0][0]+16 , missile0[0][1]+16 ,WHITE);
atran43 0:d3ee0d224bca 84 uLCD.media_init();
atran43 0:d3ee0d224bca 85 uLCD.set_sector_address(0x0040, 0x4081);
atran43 0:d3ee0d224bca 86 //Reset missile
atran43 0:d3ee0d224bca 87 if (missile0[0][1] == 112) {
atran43 0:d3ee0d224bca 88 missile0[0][1] = -16;
atran43 0:d3ee0d224bca 89 missile0[0][0] = getRandNum();
atran43 0:d3ee0d224bca 90 }
atran43 0:d3ee0d224bca 91 uLCD.display_image(missile0[0][0], missile0[0][1]+16);//Move missile down
atran43 0:d3ee0d224bca 92 lcd_mutex.unlock();
atran43 0:d3ee0d224bca 93 missile0[0][1] = missile0[0][1]+16;//Update new y value
atran43 0:d3ee0d224bca 94
atran43 0:d3ee0d224bca 95 }
atran43 0:d3ee0d224bca 96
atran43 0:d3ee0d224bca 97 }
atran43 0:d3ee0d224bca 98
atran43 0:d3ee0d224bca 99 //Move Missile 1
atran43 0:d3ee0d224bca 100 void moveMissile1(void const *args) {
atran43 0:d3ee0d224bca 101 Thread::wait(2000);
atran43 0:d3ee0d224bca 102
atran43 0:d3ee0d224bca 103 missile1[0][0] = getRandNum(); //x coordinate
atran43 0:d3ee0d224bca 104 missile1[0][1] = 0; //y coordinate
atran43 0:d3ee0d224bca 105
atran43 0:d3ee0d224bca 106 //draw Missile
atran43 0:d3ee0d224bca 107 lcd_mutex.lock();
atran43 0:d3ee0d224bca 108 uLCD.media_init();
atran43 0:d3ee0d224bca 109 uLCD.set_sector_address(0x0040, 0x4081);
atran43 0:d3ee0d224bca 110 uLCD.display_image(missile1[0][0], missile1[0][1]);
atran43 0:d3ee0d224bca 111 lcd_mutex.unlock();
atran43 0:d3ee0d224bca 112
atran43 0:d3ee0d224bca 113 while(1) {
atran43 0:d3ee0d224bca 114
atran43 0:d3ee0d224bca 115 lcd_mutex.lock();
atran43 0:d3ee0d224bca 116 uLCD.filled_rectangle(missile1[0][0], missile1[0][1] ,missile1[0][0]+16 , missile1[0][1]+16 ,WHITE);
atran43 0:d3ee0d224bca 117 uLCD.media_init();
atran43 0:d3ee0d224bca 118 uLCD.set_sector_address(0x0040, 0x4081);
atran43 0:d3ee0d224bca 119 //Reset missile
atran43 0:d3ee0d224bca 120 if (missile1[0][1] == 112) {
atran43 0:d3ee0d224bca 121 missile1[0][1] = -16;
atran43 0:d3ee0d224bca 122 missile1[0][0] = getRandNum();
atran43 0:d3ee0d224bca 123 }
atran43 0:d3ee0d224bca 124 uLCD.display_image(missile1[0][0], missile1[0][1]+16);//Move missile down
atran43 0:d3ee0d224bca 125 lcd_mutex.unlock();
atran43 0:d3ee0d224bca 126 missile1[0][1] = missile1[0][1]+16;//Update new y value
atran43 0:d3ee0d224bca 127
atran43 0:d3ee0d224bca 128 }
atran43 0:d3ee0d224bca 129
atran43 0:d3ee0d224bca 130 }
atran43 0:d3ee0d224bca 131
atran43 0:d3ee0d224bca 132 //Move Missile 2
atran43 0:d3ee0d224bca 133 void moveMissile2(void const *args) {
atran43 0:d3ee0d224bca 134 Thread::wait(3000);
atran43 0:d3ee0d224bca 135
atran43 0:d3ee0d224bca 136 missile2[0][0] = getRandNum(); //x coordinate
atran43 0:d3ee0d224bca 137 missile2[0][1] = 0; //y coordinate
atran43 0:d3ee0d224bca 138
atran43 0:d3ee0d224bca 139 //draw Missile
atran43 0:d3ee0d224bca 140 lcd_mutex.lock();
atran43 0:d3ee0d224bca 141 uLCD.media_init();
atran43 0:d3ee0d224bca 142 uLCD.set_sector_address(0x0040, 0x4081);
atran43 0:d3ee0d224bca 143 uLCD.display_image(missile2[0][0], missile2[0][1]);
atran43 0:d3ee0d224bca 144 lcd_mutex.unlock();
atran43 0:d3ee0d224bca 145
atran43 0:d3ee0d224bca 146 while(1) {
atran43 0:d3ee0d224bca 147
atran43 0:d3ee0d224bca 148 lcd_mutex.lock();
atran43 0:d3ee0d224bca 149 uLCD.filled_rectangle(missile2[0][0], missile2[0][1] ,missile2[0][0]+16 , missile2[0][1]+16 ,WHITE);
atran43 0:d3ee0d224bca 150 uLCD.media_init();
atran43 0:d3ee0d224bca 151 uLCD.set_sector_address(0x0040, 0x4081);
atran43 0:d3ee0d224bca 152 //Reset missile
atran43 0:d3ee0d224bca 153 if (missile2[0][1] == 112) {
atran43 0:d3ee0d224bca 154 missile2[0][1] = -16;
atran43 0:d3ee0d224bca 155 missile2[0][0] = getRandNum();
atran43 0:d3ee0d224bca 156 }
atran43 0:d3ee0d224bca 157 uLCD.display_image(missile2[0][0], missile2[0][1]+16);//Move missile down
atran43 0:d3ee0d224bca 158 lcd_mutex.unlock();
atran43 0:d3ee0d224bca 159 missile2[0][1] = missile2[0][1]+16;//Update new y value
atran43 0:d3ee0d224bca 160
atran43 0:d3ee0d224bca 161 }
atran43 0:d3ee0d224bca 162
atran43 0:d3ee0d224bca 163 }
atran43 0:d3ee0d224bca 164
atran43 0:d3ee0d224bca 165 //Move Missile 3
atran43 0:d3ee0d224bca 166 void moveMissile3(void const *args) {
atran43 0:d3ee0d224bca 167 Thread::wait(4000);
atran43 0:d3ee0d224bca 168
atran43 0:d3ee0d224bca 169 missile3[0][0] = getRandNum(); //x coordinate
atran43 0:d3ee0d224bca 170 missile3[0][1] = 0; //y coordinate
atran43 0:d3ee0d224bca 171
atran43 0:d3ee0d224bca 172 //draw Missile
atran43 0:d3ee0d224bca 173 lcd_mutex.lock();
atran43 0:d3ee0d224bca 174 uLCD.media_init();
atran43 0:d3ee0d224bca 175 uLCD.set_sector_address(0x0040, 0x4081);
atran43 0:d3ee0d224bca 176 uLCD.display_image(missile3[0][0], missile3[0][1]);
atran43 0:d3ee0d224bca 177 lcd_mutex.unlock();
atran43 0:d3ee0d224bca 178
atran43 0:d3ee0d224bca 179 while(1) {
atran43 0:d3ee0d224bca 180
atran43 0:d3ee0d224bca 181 lcd_mutex.lock();
atran43 0:d3ee0d224bca 182 uLCD.filled_rectangle(missile3[0][0], missile3[0][1] ,missile3[0][0]+16 , missile3[0][1]+16 ,WHITE);
atran43 0:d3ee0d224bca 183 uLCD.media_init();
atran43 0:d3ee0d224bca 184 uLCD.set_sector_address(0x0040, 0x4081);
atran43 0:d3ee0d224bca 185 //Reset missile
atran43 0:d3ee0d224bca 186 if (missile3[0][1] == 112) {
atran43 0:d3ee0d224bca 187 missile3[0][1] = -16;
atran43 0:d3ee0d224bca 188 missile3[0][0] = getRandNum();
atran43 0:d3ee0d224bca 189 }
atran43 0:d3ee0d224bca 190 uLCD.display_image(missile3[0][0], missile3[0][1]+16);//Move missile down
atran43 0:d3ee0d224bca 191 lcd_mutex.unlock();
atran43 0:d3ee0d224bca 192 missile3[0][1] = missile3[0][1]+16;//Update new y value
atran43 0:d3ee0d224bca 193
atran43 0:d3ee0d224bca 194 }
atran43 0:d3ee0d224bca 195
atran43 0:d3ee0d224bca 196 }
atran43 0:d3ee0d224bca 197
atran43 0:d3ee0d224bca 198
atran43 0:d3ee0d224bca 199 // Key hit/release interrupt routine
atran43 0:d3ee0d224bca 200 void fallInterrupt() {
atran43 0:d3ee0d224bca 201 int key_code=0;
atran43 0:d3ee0d224bca 202 int i=0;
atran43 0:d3ee0d224bca 203 int value=mpr121.read(0x00);
atran43 0:d3ee0d224bca 204 value +=mpr121.read(0x01)<<8;
atran43 0:d3ee0d224bca 205 // LED demo mod
atran43 0:d3ee0d224bca 206 i=0;
atran43 0:d3ee0d224bca 207 // puts key number out to LEDs for demo
atran43 0:d3ee0d224bca 208 for (i=0; i<12; i++) {
atran43 0:d3ee0d224bca 209 if (((value>>i)&0x01)==1) key_code=i+1;
atran43 0:d3ee0d224bca 210 }
atran43 0:d3ee0d224bca 211
atran43 0:d3ee0d224bca 212 if (key_code == 0x4 && currentShipX != 16) {
atran43 0:d3ee0d224bca 213 currentShipX = currentShipX - 16;
atran43 0:d3ee0d224bca 214 }
atran43 0:d3ee0d224bca 215 if (key_code == 0x3 && currentShipX != 96) {
atran43 0:d3ee0d224bca 216 currentShipX = currentShipX + 16;
atran43 0:d3ee0d224bca 217 }
atran43 0:d3ee0d224bca 218 }
atran43 0:d3ee0d224bca 219
atran43 0:d3ee0d224bca 220 inline float random_number()
atran43 0:d3ee0d224bca 221 {
atran43 0:d3ee0d224bca 222 return (rand()/(float(RAND_MAX)));
atran43 0:d3ee0d224bca 223 }
atran43 0:d3ee0d224bca 224
atran43 0:d3ee0d224bca 225 int getRandNum() {
atran43 0:d3ee0d224bca 226
atran43 0:d3ee0d224bca 227 x = random_number();
atran43 0:d3ee0d224bca 228 x = x * 6;
atran43 0:d3ee0d224bca 229 x = x+1;
atran43 0:d3ee0d224bca 230
atran43 0:d3ee0d224bca 231 return (((int)x) * 16);
atran43 0:d3ee0d224bca 232
atran43 0:d3ee0d224bca 233 }
atran43 0:d3ee0d224bca 234
atran43 0:d3ee0d224bca 235
atran43 0:d3ee0d224bca 236 void gameover() {
atran43 0:d3ee0d224bca 237
atran43 0:d3ee0d224bca 238 uLCD.background_color(WHITE);
atran43 0:d3ee0d224bca 239 uLCD.cls();
atran43 0:d3ee0d224bca 240 uLCD.background_color(WHITE);
atran43 0:d3ee0d224bca 241 uLCD.textbackground_color(WHITE);
atran43 0:d3ee0d224bca 242
atran43 0:d3ee0d224bca 243 uLCD.media_init();
atran43 0:d3ee0d224bca 244 uLCD.set_sector_address(0x0040, 0x4089);
atran43 0:d3ee0d224bca 245 uLCD.display_video(0, 0);
atran43 0:d3ee0d224bca 246
atran43 0:d3ee0d224bca 247 uLCD.background_color(WHITE);
atran43 0:d3ee0d224bca 248 uLCD.cls();
atran43 0:d3ee0d224bca 249 uLCD.background_color(WHITE);
atran43 0:d3ee0d224bca 250 uLCD.textbackground_color(WHITE);
atran43 0:d3ee0d224bca 251
atran43 0:d3ee0d224bca 252 uLCD.printf("Gameover");
atran43 0:d3ee0d224bca 253 FILE *wave_file;
atran43 0:d3ee0d224bca 254 wave_file=fopen("/sd/gameover.wav","r");
atran43 0:d3ee0d224bca 255 waver.play(wave_file);
atran43 0:d3ee0d224bca 256 fclose(wave_file);
atran43 0:d3ee0d224bca 257 }
atran43 0:d3ee0d224bca 258
atran43 0:d3ee0d224bca 259 int main() {
atran43 0:d3ee0d224bca 260
atran43 0:d3ee0d224bca 261 interrupt.fall(&fallInterrupt);
atran43 0:d3ee0d224bca 262 interrupt.mode(PullUp);
atran43 0:d3ee0d224bca 263
atran43 0:d3ee0d224bca 264 uLCD.baudrate(3000000);
atran43 0:d3ee0d224bca 265
atran43 0:d3ee0d224bca 266 uLCD.background_color(WHITE);
atran43 0:d3ee0d224bca 267 uLCD.cls();
atran43 0:d3ee0d224bca 268 uLCD.background_color(WHITE);
atran43 0:d3ee0d224bca 269 uLCD.textbackground_color(WHITE);
atran43 0:d3ee0d224bca 270
atran43 0:d3ee0d224bca 271 Thread thread0(moveShip);
atran43 0:d3ee0d224bca 272 Thread thread1(moveMissile0);
atran43 0:d3ee0d224bca 273 Thread thread2(moveMissile1);
atran43 0:d3ee0d224bca 274 Thread thread3(moveMissile2);
atran43 0:d3ee0d224bca 275 Thread thread4(moveMissile3);
atran43 0:d3ee0d224bca 276 bool keepGoing = true;
atran43 0:d3ee0d224bca 277
atran43 0:d3ee0d224bca 278
atran43 0:d3ee0d224bca 279 while(1) {
atran43 0:d3ee0d224bca 280
atran43 0:d3ee0d224bca 281 if (((currentShipX == missile0[0][0] && missile0[0][1] == 112)||
atran43 0:d3ee0d224bca 282 (currentShipX == missile1[0][0] && missile1[0][1]== 112) ||
atran43 0:d3ee0d224bca 283 (currentShipX == missile2[0][0] && missile2[0][1]== 112) ||
atran43 0:d3ee0d224bca 284 (currentShipX == missile3[0][0] && missile3[0][1]== 112)) &&
atran43 0:d3ee0d224bca 285 keepGoing) {
atran43 0:d3ee0d224bca 286 keepGoing = false;
atran43 0:d3ee0d224bca 287 thread0.terminate();
atran43 0:d3ee0d224bca 288 thread1.terminate();
atran43 0:d3ee0d224bca 289 thread2.terminate();
atran43 0:d3ee0d224bca 290 thread3.terminate();
atran43 0:d3ee0d224bca 291 thread4.terminate();
atran43 0:d3ee0d224bca 292 gameover();
atran43 0:d3ee0d224bca 293 }
atran43 0:d3ee0d224bca 294
atran43 0:d3ee0d224bca 295 }
atran43 0:d3ee0d224bca 296 }