single player mbedKart

Dependencies:   Motor

(notes)

Committer:
DerekW2015
Date:
Tue Dec 11 02:06:44 2018 +0000
Revision:
18:6c93ec600402
Parent:
16:40f697a68445
Child:
21:f8f6c1f5743c
Fixed XBeeLib broken identifiers

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 16:40f697a68445 5 #include "xbee_functions.h"
DerekW2015 11:8d4b7702ac06 6 // Define threads and mutexes
DerekW2015 11:8d4b7702ac06 7 Thread thread1;
DerekW2015 11:8d4b7702ac06 8 Thread thread2;
DerekW2015 11:8d4b7702ac06 9
DerekW2015 0:a9a4c0fd5f8a 10 // Global game actions
DerekW2015 8:92bf0cc337b5 11 bool paused = false;
DerekW2015 8:92bf0cc337b5 12 void check_unpause() {
DerekW2015 8:92bf0cc337b5 13 char bnum=0;
DerekW2015 8:92bf0cc337b5 14 char bhit=0;
DerekW2015 8:92bf0cc337b5 15 while (true) {
DerekW2015 8:92bf0cc337b5 16 if (blue.getc()=='B') { //button data packet
DerekW2015 8:92bf0cc337b5 17 bnum = blue.getc(); //button number
DerekW2015 8:92bf0cc337b5 18 bhit = blue.getc(); //1=hit, 0=release
DerekW2015 8:92bf0cc337b5 19 if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
DerekW2015 8:92bf0cc337b5 20 if (bnum == '1') { //number button 1, pause
DerekW2015 8:92bf0cc337b5 21 if (bhit=='1') paused = false;
DerekW2015 8:92bf0cc337b5 22 }
DerekW2015 8:92bf0cc337b5 23 }
DerekW2015 8:92bf0cc337b5 24 }
DerekW2015 8:92bf0cc337b5 25 }
DerekW2015 8:92bf0cc337b5 26 }
sli425 12:4fec6ed886ab 27
DerekW2015 8:92bf0cc337b5 28 void game_paused() {
DerekW2015 8:92bf0cc337b5 29 // Cycle through LEDs
DerekW2015 8:92bf0cc337b5 30 Thread pause_thread;
DerekW2015 8:92bf0cc337b5 31 pause_thread.start(check_unpause);
DerekW2015 8:92bf0cc337b5 32 while (paused) {
DerekW2015 8:92bf0cc337b5 33 int num = 1;
DerekW2015 8:92bf0cc337b5 34 for (int i = 0; i < 3; i++) {
DerekW2015 8:92bf0cc337b5 35 num *= 2;
DerekW2015 8:92bf0cc337b5 36 myled = num;
DerekW2015 8:92bf0cc337b5 37 ThisThread::sleep_for(100);
DerekW2015 8:92bf0cc337b5 38 }
DerekW2015 8:92bf0cc337b5 39 ThisThread::sleep_for(500);
DerekW2015 8:92bf0cc337b5 40 for (int i = 3; i > 0; 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 }
DerekW2015 11:8d4b7702ac06 47 }
DerekW2015 11:8d4b7702ac06 48
DerekW2015 11:8d4b7702ac06 49 // Thread to control speed
DerekW2015 11:8d4b7702ac06 50 void speed_control() {
DerekW2015 11:8d4b7702ac06 51 // The kart has to be in one of three states at all times
DerekW2015 11:8d4b7702ac06 52 while(1) {
DerekW2015 11:8d4b7702ac06 53 while(sstate == coasting) {
DerekW2015 15:350b9128a602 54 if (speed_cmd > 0.0) speed_cmd -= coast_rate;
DerekW2015 15:350b9128a602 55 else speed_cmd = 0.0;
DerekW2015 15:350b9128a602 56 left.speed(speed_cmd);
DerekW2015 15:350b9128a602 57 right.speed(speed_cmd);
DerekW2015 11:8d4b7702ac06 58 ThisThread::sleep_for(200);
DerekW2015 11:8d4b7702ac06 59 }
DerekW2015 11:8d4b7702ac06 60 while(sstate == accelerating) {
DerekW2015 15:350b9128a602 61 if (speed_cmd < max_speed) speed_cmd += acceleration_rate;
DerekW2015 15:350b9128a602 62 else speed_cmd = max_speed;
DerekW2015 15:350b9128a602 63 left.speed(speed_cmd);
DerekW2015 15:350b9128a602 64 right.speed(speed_cmd);
DerekW2015 11:8d4b7702ac06 65 ThisThread::sleep_for(200);
DerekW2015 11:8d4b7702ac06 66 }
DerekW2015 11:8d4b7702ac06 67 while(sstate == braking) {
DerekW2015 15:350b9128a602 68 if (speed_cmd > 0.0) speed_cmd -= brake_rate;
DerekW2015 15:350b9128a602 69 else speed_cmd = 0.0;
DerekW2015 15:350b9128a602 70 left.speed(speed_cmd);
DerekW2015 15:350b9128a602 71 right.speed(speed_cmd);
DerekW2015 11:8d4b7702ac06 72 ThisThread::sleep_for(200);
DerekW2015 11:8d4b7702ac06 73 }
DerekW2015 11:8d4b7702ac06 74 }
DerekW2015 11:8d4b7702ac06 75 }
DerekW2015 11:8d4b7702ac06 76
sli425 3:6c749bff51aa 77 // Thread for checking rgb sensor values and updating game variables
sli425 3:6c749bff51aa 78 // Change later depending on behavior of RGB sensor and colors used
sli425 3:6c749bff51aa 79 int thresh = 150; //change this depending on RGB values
sli425 3:6c749bff51aa 80 void check_RGB() {
sli425 12:4fec6ed886ab 81 while(true){
sli425 12:4fec6ed886ab 82 rgbsensor.update();
sli425 12:4fec6ed886ab 83 int C_value = rgbsensor.get_C();
sli425 12:4fec6ed886ab 84 int R_value = rgbsensor.get_R();
sli425 12:4fec6ed886ab 85 int G_value = rgbsensor.get_G();
sli425 12:4fec6ed886ab 86 int B_value = rgbsensor.get_B();
sli425 12:4fec6ed886ab 87 if(C_value > thresh && R_value > thresh && G_value > thresh && B_value > thresh && current_item == 0) { //Check for if cart runs over an item box
sli425 12:4fec6ed886ab 88 itembox = true;
sli425 12:4fec6ed886ab 89 cstate = 0;
sli425 12:4fec6ed886ab 90 }
sli425 12:4fec6ed886ab 91 else if(C_value > thresh && R_value > thresh && G_value > thresh && B_value > thresh) { //Check for if cart runs over a speed boost panel
sli425 12:4fec6ed886ab 92 max_speed = 1; //change this depending on speed up panel algs
sli425 12:4fec6ed886ab 93 cstate = 0;
sli425 12:4fec6ed886ab 94 }
sli425 12:4fec6ed886ab 95 else if(C_value > thresh && R_value > thresh && G_value > thresh && B_value > thresh) { //Check if cart collides with wall
sli425 12:4fec6ed886ab 96 collide = true;
sli425 12:4fec6ed886ab 97 }
sli425 12:4fec6ed886ab 98 else if(C_value > thresh && R_value > thresh && G_value > thresh && B_value > thresh) { //Check if cart reaches next checkpoint. cstate is set to 1 upon seeing first color of checkpoint
sli425 12:4fec6ed886ab 99 cstate = 1;
sli425 12:4fec6ed886ab 100 }
sli425 12:4fec6ed886ab 101 else if(C_value > thresh && R_value > thresh && G_value > thresh && B_value > thresh && cstate == 1) {
sli425 12:4fec6ed886ab 102 //Second part of checking if cart reaches next checkpoint. If the previous color was passed through previously, updates checkpoint progress
sli425 12:4fec6ed886ab 103 cstate = 0;
sli425 12:4fec6ed886ab 104 progress++;
sli425 12:4fec6ed886ab 105 }
sli425 12:4fec6ed886ab 106 else {
sli425 12:4fec6ed886ab 107 cstate = 0;
sli425 12:4fec6ed886ab 108 }
sli425 12:4fec6ed886ab 109 ThisThread::sleep_for(500);
sli425 3:6c749bff51aa 110 }
sli425 3:6c749bff51aa 111 }
sli425 3:6c749bff51aa 112
sli425 12:4fec6ed886ab 113 void set_item() {
sli425 12:4fec6ed886ab 114 while(true){
sli425 12:4fec6ed886ab 115 if(itembox && current_item == 0) {
sli425 12:4fec6ed886ab 116 //playsound
DerekW2015 18:6c93ec600402 117 for(int n = 0; n < 10; n++){ //flash the led to simulate slot machine effect
DerekW2015 18:6c93ec600402 118 myRGBled.write(1.0,0.0,0.0);
sli425 12:4fec6ed886ab 119 ThisThread::sleep_for(50);
DerekW2015 18:6c93ec600402 120 myRGBled.write(0.0,1.0,0.0);
sli425 12:4fec6ed886ab 121 ThisThread::sleep_for(50);
DerekW2015 18:6c93ec600402 122 myRGBled.write(0.0,0.0,1.0);
sli425 12:4fec6ed886ab 123 ThisThread::sleep_for(50);
DerekW2015 18:6c93ec600402 124 myRGBled.write(1.0,1.0,0.0);
sli425 12:4fec6ed886ab 125 ThisThread::sleep_for(50);
sli425 12:4fec6ed886ab 126 }
sli425 12:4fec6ed886ab 127 current_item = rand() % 4 + 1; //change this depending on items implemented and random item alg
DerekW2015 18:6c93ec600402 128 switch(current_item) {
DerekW2015 18:6c93ec600402 129 case 1 : //mushroom
DerekW2015 18:6c93ec600402 130 myRGBled.write(1.0,0.0,0.0);
DerekW2015 18:6c93ec600402 131 break;
DerekW2015 18:6c93ec600402 132 case 2 : //green shell
DerekW2015 18:6c93ec600402 133 myRGBled.write(0.0,1.0,0.0);
DerekW2015 18:6c93ec600402 134 break;
DerekW2015 18:6c93ec600402 135 case 3 : //blue shell
DerekW2015 18:6c93ec600402 136 myRGBled.write(0.0,0.0,1.0);
DerekW2015 18:6c93ec600402 137 break;
DerekW2015 18:6c93ec600402 138 case 4 : //banana
DerekW2015 18:6c93ec600402 139 myRGBled.write(1.0,1.0,0.0);
DerekW2015 18:6c93ec600402 140 break;
DerekW2015 18:6c93ec600402 141 default :
DerekW2015 18:6c93ec600402 142 break;
sli425 12:4fec6ed886ab 143 }
sli425 12:4fec6ed886ab 144 itembox = false;
sli425 12:4fec6ed886ab 145 }
sli425 12:4fec6ed886ab 146 ThisThread::sleep_for(500);
sli425 12:4fec6ed886ab 147 }
sli425 12:4fec6ed886ab 148 }
sli425 12:4fec6ed886ab 149
sli425 12:4fec6ed886ab 150 void hold_item() {
sli425 12:4fec6ed886ab 151 if(current_item == 0){
sli425 12:4fec6ed886ab 152 return;
sli425 12:4fec6ed886ab 153 }
sli425 12:4fec6ed886ab 154 if(current_item == 1){
sli425 12:4fec6ed886ab 155 max_speed = 1;
sli425 12:4fec6ed886ab 156 current_item = 0;
sli425 12:4fec6ed886ab 157 }
sli425 12:4fec6ed886ab 158 else{
sli425 12:4fec6ed886ab 159 holding_item = true;
sli425 12:4fec6ed886ab 160 }
sli425 12:4fec6ed886ab 161 return;
sli425 12:4fec6ed886ab 162 }
sli425 12:4fec6ed886ab 163
sli425 12:4fec6ed886ab 164 void release_item(){
sli425 12:4fec6ed886ab 165 holding_item = false;
sli425 12:4fec6ed886ab 166 if(current_item == 2){
sli425 12:4fec6ed886ab 167 //hit player in front
sli425 12:4fec6ed886ab 168 return;
sli425 12:4fec6ed886ab 169 }
sli425 12:4fec6ed886ab 170 if(current_item == 3){
sli425 12:4fec6ed886ab 171 //hit player in first
sli425 12:4fec6ed886ab 172 return;
sli425 12:4fec6ed886ab 173 }
sli425 12:4fec6ed886ab 174 if(current_item == 4){
sli425 12:4fec6ed886ab 175 //hit player behind
sli425 12:4fec6ed886ab 176 return;
sli425 12:4fec6ed886ab 177 }
sli425 12:4fec6ed886ab 178 }
sli425 12:4fec6ed886ab 179
DerekW2015 0:a9a4c0fd5f8a 180 int main() {
DerekW2015 0:a9a4c0fd5f8a 181 // Start threads
DerekW2015 9:6649141315be 182 thread1.start(check_RGB);
DerekW2015 11:8d4b7702ac06 183 thread2.start(speed_control); // Since we're stopped, this won't do anything
DerekW2015 16:40f697a68445 184
DerekW2015 16:40f697a68445 185 // Initialize Xbee and remote modules
sli425 13:583181de031e 186 xbee.register_receive_cb(&receive_cb);
DerekW2015 16:40f697a68445 187 RadioStatus const radioStatus = xbee.init();
DerekW2015 18:6c93ec600402 188 const XBeeLib::RemoteXBee802 remoteDevice64b = RemoteXBee802(REMOTE_NODE_ADDR64);
DerekW2015 0:a9a4c0fd5f8a 189
DerekW2015 0:a9a4c0fd5f8a 190 // Bluetooth controller code
DerekW2015 0:a9a4c0fd5f8a 191 char bnum=0;
DerekW2015 0:a9a4c0fd5f8a 192 char bhit=0;
DerekW2015 0:a9a4c0fd5f8a 193 while(1) {
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 0:a9a4c0fd5f8a 202 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 8:92bf0cc337b5 203 paused = true;
DerekW2015 8:92bf0cc337b5 204 game_paused();
DerekW2015 0:a9a4c0fd5f8a 205 }
DerekW2015 0:a9a4c0fd5f8a 206 break;
DerekW2015 0:a9a4c0fd5f8a 207 case '2': //number button 2, accelerate
DerekW2015 0:a9a4c0fd5f8a 208 if (bhit=='1') {
DerekW2015 11:8d4b7702ac06 209 sstate = 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') {
sli425 12:4fec6ed886ab 216 hold_item(); //holds item to protect player from incoming hazards
DerekW2015 0:a9a4c0fd5f8a 217 } else {
sli425 12:4fec6ed886ab 218 release_item(); //release item to attack
DerekW2015 0:a9a4c0fd5f8a 219 }
DerekW2015 0:a9a4c0fd5f8a 220 break;
DerekW2015 0:a9a4c0fd5f8a 221 case '4': //number button 4, brakes
DerekW2015 0:a9a4c0fd5f8a 222 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 223 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 11:8d4b7702ac06 224 sstate = braking;
DerekW2015 0:a9a4c0fd5f8a 225 } else {
DerekW2015 11:8d4b7702ac06 226 sstate = coasting;
DerekW2015 0:a9a4c0fd5f8a 227 }
DerekW2015 0:a9a4c0fd5f8a 228 break;
DerekW2015 0:a9a4c0fd5f8a 229 case '5': //button 5 up arrow
DerekW2015 0:a9a4c0fd5f8a 230 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 231 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 232 //throw_item();
DerekW2015 0:a9a4c0fd5f8a 233 //item_box();
DerekW2015 0:a9a4c0fd5f8a 234 } else {
DerekW2015 0:a9a4c0fd5f8a 235
DerekW2015 0:a9a4c0fd5f8a 236 }
DerekW2015 0:a9a4c0fd5f8a 237 break;
DerekW2015 0:a9a4c0fd5f8a 238 case '6': //button 6 down arrow
DerekW2015 0:a9a4c0fd5f8a 239 if (bhit=='1') {
DerekW2015 11:8d4b7702ac06 240 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 241 left.speed(-1.0);
DerekW2015 0:a9a4c0fd5f8a 242 right.speed(-1.0);
DerekW2015 0:a9a4c0fd5f8a 243 } else {
DerekW2015 0:a9a4c0fd5f8a 244 left.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 245 right.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 246 }
DerekW2015 0:a9a4c0fd5f8a 247 break;
DerekW2015 0:a9a4c0fd5f8a 248 case '7': //button 7 left arrow
DerekW2015 0:a9a4c0fd5f8a 249 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 250 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 251 left.speed(0.3);
DerekW2015 0:a9a4c0fd5f8a 252 right.speed(1.0);
DerekW2015 0:a9a4c0fd5f8a 253 } else {
DerekW2015 0:a9a4c0fd5f8a 254 left.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 255 right.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 256 }
DerekW2015 0:a9a4c0fd5f8a 257 break;
DerekW2015 0:a9a4c0fd5f8a 258 case '8': //button 8 right arrow
DerekW2015 0:a9a4c0fd5f8a 259 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 260 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 261 left.speed(1.0);
DerekW2015 0:a9a4c0fd5f8a 262 right.speed(0.3);
DerekW2015 0:a9a4c0fd5f8a 263 } else {
DerekW2015 0:a9a4c0fd5f8a 264 left.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 265 right.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 266 }
DerekW2015 0:a9a4c0fd5f8a 267 break;
DerekW2015 0:a9a4c0fd5f8a 268 default:
DerekW2015 0:a9a4c0fd5f8a 269 break;
DerekW2015 0:a9a4c0fd5f8a 270 }
DerekW2015 0:a9a4c0fd5f8a 271 }
DerekW2015 0:a9a4c0fd5f8a 272 }
DerekW2015 0:a9a4c0fd5f8a 273 }
DerekW2015 16:40f697a68445 274 // Finish up loop
DerekW2015 16:40f697a68445 275 xbee.process_rx_frames();
DerekW2015 0:a9a4c0fd5f8a 276 }
DerekW2015 0:a9a4c0fd5f8a 277 }