single player mbedKart

Dependencies:   Motor

(notes)

Committer:
sli425
Date:
Thu Dec 13 03:53:31 2018 +0000
Revision:
44:40183935dc5f
Parent:
43:6fb9461e9aa3
Child:
45:29d1f7734b9b
buggy wav stuff

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DerekW2015 0:a9a4c0fd5f8a 1 #include "mbed.h"
DerekW2015 42:d7e8f7331a65 2 #include <stdio.h>
DerekW2015 0:a9a4c0fd5f8a 3 #include "Motor.h"
DerekW2015 0:a9a4c0fd5f8a 4 #include "rgbled.h"
DerekW2015 0:a9a4c0fd5f8a 5 #include "rgbSensor.h"
DerekW2015 42:d7e8f7331a65 6 #include "FATFileSystem.h"
DerekW2015 42:d7e8f7331a65 7 #include "SDBlockDevice.h"
sli425 43:6fb9461e9aa3 8 #include "wave_player.h"
DerekW2015 21:f8f6c1f5743c 9 #include "universal.h"
sli425 31:0d925d69cbe2 10 #include <ctime>
DerekW2015 28:0187a2d494a2 11
DerekW2015 11:8d4b7702ac06 12 // Define threads and mutexes
DerekW2015 11:8d4b7702ac06 13 Thread thread1;
DerekW2015 11:8d4b7702ac06 14 Thread thread2;
sli425 31:0d925d69cbe2 15 Thread thread3;
DerekW2015 11:8d4b7702ac06 16
DerekW2015 0:a9a4c0fd5f8a 17 // Global game actions
DerekW2015 8:92bf0cc337b5 18 bool paused = false;
DerekW2015 8:92bf0cc337b5 19 void check_unpause() {
DerekW2015 8:92bf0cc337b5 20 char bnum=0;
DerekW2015 8:92bf0cc337b5 21 char bhit=0;
DerekW2015 37:44d2cbbd8507 22 while (paused) {
DerekW2015 8:92bf0cc337b5 23 if (blue.getc()=='B') { //button data packet
DerekW2015 8:92bf0cc337b5 24 bnum = blue.getc(); //button number
DerekW2015 8:92bf0cc337b5 25 bhit = blue.getc(); //1=hit, 0=release
DerekW2015 8:92bf0cc337b5 26 if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
DerekW2015 8:92bf0cc337b5 27 if (bnum == '1') { //number button 1, pause
DerekW2015 8:92bf0cc337b5 28 if (bhit=='1') paused = false;
DerekW2015 8:92bf0cc337b5 29 }
DerekW2015 8:92bf0cc337b5 30 }
DerekW2015 8:92bf0cc337b5 31 }
DerekW2015 8:92bf0cc337b5 32 }
DerekW2015 8:92bf0cc337b5 33 }
sli425 12:4fec6ed886ab 34
DerekW2015 8:92bf0cc337b5 35 void game_paused() {
DerekW2015 8:92bf0cc337b5 36 // Cycle through LEDs
DerekW2015 38:db41ff8c0e00 37 sstate = pause;
DerekW2015 8:92bf0cc337b5 38 Thread pause_thread;
DerekW2015 8:92bf0cc337b5 39 pause_thread.start(check_unpause);
DerekW2015 8:92bf0cc337b5 40 while (paused) {
DerekW2015 8:92bf0cc337b5 41 int num = 1;
DerekW2015 8:92bf0cc337b5 42 for (int i = 0; i < 3; i++) {
DerekW2015 8:92bf0cc337b5 43 num *= 2;
DerekW2015 8:92bf0cc337b5 44 myled = num;
DerekW2015 8:92bf0cc337b5 45 ThisThread::sleep_for(100);
DerekW2015 8:92bf0cc337b5 46 }
DerekW2015 8:92bf0cc337b5 47 ThisThread::sleep_for(500);
DerekW2015 8:92bf0cc337b5 48 for (int i = 3; i > 0; i--) {
DerekW2015 8:92bf0cc337b5 49 num /= 2;
DerekW2015 8:92bf0cc337b5 50 myled = num;
DerekW2015 8:92bf0cc337b5 51 ThisThread::sleep_for(100);
DerekW2015 8:92bf0cc337b5 52 }
DerekW2015 8:92bf0cc337b5 53 ThisThread::sleep_for(500);
DerekW2015 8:92bf0cc337b5 54 }
DerekW2015 37:44d2cbbd8507 55 pause_thread.terminate();
DerekW2015 37:44d2cbbd8507 56 }
DerekW2015 37:44d2cbbd8507 57
DerekW2015 37:44d2cbbd8507 58 void win() {
DerekW2015 38:db41ff8c0e00 59 while(1) {
DerekW2015 37:44d2cbbd8507 60 unsigned int rgbColor[3];
DerekW2015 37:44d2cbbd8507 61
DerekW2015 37:44d2cbbd8507 62 // Start off with red.
DerekW2015 37:44d2cbbd8507 63 rgbColor[0] = 255;
DerekW2015 37:44d2cbbd8507 64 rgbColor[1] = 0;
DerekW2015 37:44d2cbbd8507 65 rgbColor[2] = 0;
DerekW2015 37:44d2cbbd8507 66
DerekW2015 37:44d2cbbd8507 67 // Choose the colors to increment and decrement.
DerekW2015 37:44d2cbbd8507 68 for (int decColor = 0; decColor < 3; decColor += 1) {
DerekW2015 37:44d2cbbd8507 69 int incColor = decColor == 2 ? 0 : decColor + 1;
DerekW2015 37:44d2cbbd8507 70
DerekW2015 37:44d2cbbd8507 71 // cross-fade the two colors.
DerekW2015 37:44d2cbbd8507 72 for(int i = 0; i < 255; i += 1) {
DerekW2015 37:44d2cbbd8507 73 rgbColor[decColor] -= 1;
DerekW2015 37:44d2cbbd8507 74 rgbColor[incColor] += 1;
DerekW2015 37:44d2cbbd8507 75
DerekW2015 37:44d2cbbd8507 76 myRGBled.write(rgbColor[0]/255.0, rgbColor[1]/255.0, rgbColor[2]/255.0);
DerekW2015 37:44d2cbbd8507 77 ThisThread::sleep_for(1);
DerekW2015 37:44d2cbbd8507 78 }
DerekW2015 37:44d2cbbd8507 79 }
DerekW2015 37:44d2cbbd8507 80 }
DerekW2015 11:8d4b7702ac06 81 }
DerekW2015 11:8d4b7702ac06 82
DerekW2015 11:8d4b7702ac06 83 // Thread to control speed
DerekW2015 11:8d4b7702ac06 84 void speed_control() {
DerekW2015 11:8d4b7702ac06 85 // The kart has to be in one of three states at all times
DerekW2015 11:8d4b7702ac06 86 while(1) {
DerekW2015 11:8d4b7702ac06 87 while(sstate == coasting) {
DerekW2015 15:350b9128a602 88 if (speed_cmd > 0.0) speed_cmd -= coast_rate;
DerekW2015 15:350b9128a602 89 else speed_cmd = 0.0;
DerekW2015 28:0187a2d494a2 90 left.speed(speed_cmd * left_multiplier);
DerekW2015 28:0187a2d494a2 91 right.speed(speed_cmd * right_multiplier);
DerekW2015 11:8d4b7702ac06 92 ThisThread::sleep_for(200);
DerekW2015 11:8d4b7702ac06 93 }
DerekW2015 11:8d4b7702ac06 94 while(sstate == accelerating) {
DerekW2015 15:350b9128a602 95 if (speed_cmd < max_speed) speed_cmd += acceleration_rate;
DerekW2015 15:350b9128a602 96 else speed_cmd = max_speed;
DerekW2015 28:0187a2d494a2 97 left.speed(speed_cmd * left_multiplier);
DerekW2015 28:0187a2d494a2 98 right.speed(speed_cmd * right_multiplier);
DerekW2015 11:8d4b7702ac06 99 ThisThread::sleep_for(200);
DerekW2015 11:8d4b7702ac06 100 }
DerekW2015 11:8d4b7702ac06 101 while(sstate == braking) {
DerekW2015 28:0187a2d494a2 102 if (speed_cmd > -1.0) speed_cmd -= brake_rate;
DerekW2015 28:0187a2d494a2 103 else speed_cmd = -1.0;
DerekW2015 28:0187a2d494a2 104 left.speed(speed_cmd * left_multiplier);
DerekW2015 28:0187a2d494a2 105 right.speed(speed_cmd * right_multiplier);
DerekW2015 11:8d4b7702ac06 106 ThisThread::sleep_for(200);
DerekW2015 11:8d4b7702ac06 107 }
DerekW2015 38:db41ff8c0e00 108 while(sstate == pause) {
DerekW2015 38:db41ff8c0e00 109 left.speed(0.0);
DerekW2015 38:db41ff8c0e00 110 right.speed(0.0);
DerekW2015 38:db41ff8c0e00 111 }
DerekW2015 11:8d4b7702ac06 112 }
DerekW2015 11:8d4b7702ac06 113 }
DerekW2015 11:8d4b7702ac06 114
sli425 31:0d925d69cbe2 115 void powerupthread() {
sli425 31:0d925d69cbe2 116 while(1){
sli425 31:0d925d69cbe2 117 if(powerup){
sli425 31:0d925d69cbe2 118 max_speed = 1.0;
sli425 31:0d925d69cbe2 119 ThisThread::sleep_for(5000);
sli425 31:0d925d69cbe2 120 max_speed = 0.8;
DerekW2015 38:db41ff8c0e00 121 powerup = false;
sli425 31:0d925d69cbe2 122 }
sli425 31:0d925d69cbe2 123 ThisThread::sleep_for(300);
sli425 31:0d925d69cbe2 124 }
sli425 31:0d925d69cbe2 125 }
sli425 31:0d925d69cbe2 126
sli425 3:6c749bff51aa 127 // Thread for checking rgb sensor values and updating game variables
sli425 3:6c749bff51aa 128 // Change later depending on behavior of RGB sensor and colors used
sli425 31:0d925d69cbe2 129 int t = 8000; //change this depending on RGB values
sli425 3:6c749bff51aa 130 void check_RGB() {
sli425 12:4fec6ed886ab 131 while(true){
sli425 12:4fec6ed886ab 132 rgbsensor.update();
sli425 12:4fec6ed886ab 133 int C_value = rgbsensor.get_C();
sli425 12:4fec6ed886ab 134 int R_value = rgbsensor.get_R();
sli425 12:4fec6ed886ab 135 int G_value = rgbsensor.get_G();
sli425 12:4fec6ed886ab 136 int B_value = rgbsensor.get_B();
DerekW2015 35:b0c68a76acc9 137 if(R_value < 3000 && B_value > 6500) { //Check for if cart runs over a speed boost panel
DerekW2015 35:b0c68a76acc9 138 pc.printf("Found blue");
sli425 31:0d925d69cbe2 139 powerup = true; //change this depending on speed up panel algs
sli425 12:4fec6ed886ab 140 cstate = 0;
sli425 12:4fec6ed886ab 141 }
DerekW2015 35:b0c68a76acc9 142 else if(R_value > 3000 && G_value < 2000 && B_value < 2000) { //Check if cart reaches next checkpoint. cstate is set to 1 upon seeing first color of checkpoint
DerekW2015 35:b0c68a76acc9 143 pc.printf("Found red");
DerekW2015 37:44d2cbbd8507 144 paused = true;
DerekW2015 37:44d2cbbd8507 145 win();
sli425 12:4fec6ed886ab 146 }
DerekW2015 33:820a1510cf2e 147 pc.printf("[C: %d, R: %d, G: %d, B: %d]\r\n", C_value, R_value, G_value, B_value);
sli425 32:8a7a72c360ed 148 ThisThread::sleep_for(500);
sli425 3:6c749bff51aa 149 }
sli425 3:6c749bff51aa 150 }
sli425 3:6c749bff51aa 151
DerekW2015 0:a9a4c0fd5f8a 152 int main() {
sli425 44:40183935dc5f 153 sd.init();
sli425 44:40183935dc5f 154 FATFileSystem fs("fs", &sd);
sli425 44:40183935dc5f 155 FILE *f = fopen("/fs/sounds/mushroom.wav","r");
sli425 44:40183935dc5f 156 wav.play(f);
sli425 44:40183935dc5f 157 fclose(f);
sli425 23:b0fe1c1046dc 158 pc.printf("Initializing ");
DerekW2015 30:889aff39caa8 159
DerekW2015 26:708fb66f0b6a 160 // Start threads
DerekW2015 26:708fb66f0b6a 161 thread1.start(check_RGB);
DerekW2015 26:708fb66f0b6a 162 thread2.start(speed_control); // Since we're stopped, this won't do anything
sli425 31:0d925d69cbe2 163 thread3.start(powerupthread);
sli425 31:0d925d69cbe2 164
sli425 31:0d925d69cbe2 165 std::clock_t start;
sli425 31:0d925d69cbe2 166 double duration;
sli425 31:0d925d69cbe2 167 start = std::clock();
DerekW2015 26:708fb66f0b6a 168
DerekW2015 0:a9a4c0fd5f8a 169 // Bluetooth controller code
DerekW2015 0:a9a4c0fd5f8a 170 char bnum=0;
DerekW2015 0:a9a4c0fd5f8a 171 char bhit=0;
sli425 31:0d925d69cbe2 172 pc.printf("running");
DerekW2015 30:889aff39caa8 173 while(running) {
DerekW2015 0:a9a4c0fd5f8a 174 if (blue.getc()=='!') {
DerekW2015 0:a9a4c0fd5f8a 175 if (blue.getc()=='B') { //button data packet
DerekW2015 0:a9a4c0fd5f8a 176 bnum = blue.getc(); //button number
DerekW2015 0:a9a4c0fd5f8a 177 bhit = blue.getc(); //1=hit, 0=release
DerekW2015 0:a9a4c0fd5f8a 178 if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
DerekW2015 0:a9a4c0fd5f8a 179 switch (bnum) {
DerekW2015 0:a9a4c0fd5f8a 180 case '1': //number button 1, pause
DerekW2015 0:a9a4c0fd5f8a 181 if (bhit=='1') {
DerekW2015 8:92bf0cc337b5 182 paused = true;
DerekW2015 8:92bf0cc337b5 183 game_paused();
DerekW2015 0:a9a4c0fd5f8a 184 }
DerekW2015 0:a9a4c0fd5f8a 185 break;
DerekW2015 0:a9a4c0fd5f8a 186 case '2': //number button 2, accelerate
DerekW2015 0:a9a4c0fd5f8a 187 if (bhit=='1') {
DerekW2015 11:8d4b7702ac06 188 sstate = accelerating;
sli425 31:0d925d69cbe2 189 pc.printf("accelerating");
DerekW2015 0:a9a4c0fd5f8a 190 } else {
DerekW2015 11:8d4b7702ac06 191 sstate = coasting;
DerekW2015 0:a9a4c0fd5f8a 192 }
DerekW2015 0:a9a4c0fd5f8a 193 break;
DerekW2015 0:a9a4c0fd5f8a 194 case '3': //number button 3
DerekW2015 0:a9a4c0fd5f8a 195 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 196 } else {
DerekW2015 0:a9a4c0fd5f8a 197 }
DerekW2015 0:a9a4c0fd5f8a 198 break;
DerekW2015 0:a9a4c0fd5f8a 199 case '4': //number button 4, brakes
DerekW2015 0:a9a4c0fd5f8a 200 if (bhit=='1') {
DerekW2015 11:8d4b7702ac06 201 sstate = braking;
DerekW2015 0:a9a4c0fd5f8a 202 } else {
DerekW2015 11:8d4b7702ac06 203 sstate = coasting;
DerekW2015 0:a9a4c0fd5f8a 204 }
DerekW2015 0:a9a4c0fd5f8a 205 break;
DerekW2015 0:a9a4c0fd5f8a 206 case '5': //button 5 up arrow
DerekW2015 0:a9a4c0fd5f8a 207 if (bhit=='1') {
sli425 31:0d925d69cbe2 208 pc.printf("up");
DerekW2015 0:a9a4c0fd5f8a 209 } else {
DerekW2015 0:a9a4c0fd5f8a 210 }
DerekW2015 0:a9a4c0fd5f8a 211 break;
DerekW2015 0:a9a4c0fd5f8a 212 case '6': //button 6 down arrow
DerekW2015 0:a9a4c0fd5f8a 213 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 214 } else {
DerekW2015 0:a9a4c0fd5f8a 215 }
DerekW2015 0:a9a4c0fd5f8a 216 break;
DerekW2015 0:a9a4c0fd5f8a 217 case '7': //button 7 left arrow
DerekW2015 0:a9a4c0fd5f8a 218 if (bhit=='1') {
sli425 31:0d925d69cbe2 219 pc.printf("left");
DerekW2015 28:0187a2d494a2 220 left_multiplier = 0.5;
DerekW2015 28:0187a2d494a2 221 right_multiplier = 1.0;
DerekW2015 0:a9a4c0fd5f8a 222 } else {
DerekW2015 28:0187a2d494a2 223 left_multiplier = 1.0;
DerekW2015 28:0187a2d494a2 224 right_multiplier = 1.0;
DerekW2015 0:a9a4c0fd5f8a 225 }
DerekW2015 0:a9a4c0fd5f8a 226 break;
DerekW2015 0:a9a4c0fd5f8a 227 case '8': //button 8 right arrow
DerekW2015 0:a9a4c0fd5f8a 228 if (bhit=='1') {
sli425 31:0d925d69cbe2 229 pc.printf("right");
DerekW2015 28:0187a2d494a2 230 left_multiplier = 1.0;
DerekW2015 28:0187a2d494a2 231 right_multiplier = 0.5;
DerekW2015 0:a9a4c0fd5f8a 232 } else {
DerekW2015 28:0187a2d494a2 233 left_multiplier = 1.0;
DerekW2015 28:0187a2d494a2 234 right_multiplier = 1.0;
DerekW2015 0:a9a4c0fd5f8a 235 }
DerekW2015 0:a9a4c0fd5f8a 236 break;
DerekW2015 0:a9a4c0fd5f8a 237 default:
DerekW2015 0:a9a4c0fd5f8a 238 break;
DerekW2015 0:a9a4c0fd5f8a 239 }
DerekW2015 0:a9a4c0fd5f8a 240 }
DerekW2015 0:a9a4c0fd5f8a 241 }
DerekW2015 0:a9a4c0fd5f8a 242 }
DerekW2015 0:a9a4c0fd5f8a 243 }
DerekW2015 35:b0c68a76acc9 244 // Clean up
DerekW2015 35:b0c68a76acc9 245 duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;
DerekW2015 35:b0c68a76acc9 246 pc.printf("%d",duration);
DerekW2015 35:b0c68a76acc9 247 thread1.terminate();
DerekW2015 35:b0c68a76acc9 248 thread2.terminate();
DerekW2015 35:b0c68a76acc9 249 thread3.terminate();
DerekW2015 0:a9a4c0fd5f8a 250 }