single player mbedKart

Dependencies:   Motor

(notes)

Committer:
sli425
Date:
Thu Dec 13 01:03:22 2018 +0000
Revision:
32:8a7a72c360ed
Parent:
31:0d925d69cbe2
Child:
33:820a1510cf2e
fixed a few bugs;

Who changed what in which revision?

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