single player mbedKart

Dependencies:   Motor

(notes)

Committer:
DerekW2015
Date:
Thu Dec 13 02:13:28 2018 +0000
Revision:
36:a844c1388408
Parent:
35:b0c68a76acc9
Child:
37:44d2cbbd8507
It works

Who changed what in which revision?

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