single player mbedKart

Dependencies:   Motor

(notes)

Committer:
DerekW2015
Date:
Thu Dec 13 01:28:11 2018 +0000
Revision:
33:820a1510cf2e
Parent:
32:8a7a72c360ed
Child:
34:7989a5914d7d
Removed rest of Wifi. Sad face

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