single player mbedKart

Dependencies:   Motor

(notes)

Committer:
DerekW2015
Date:
Tue Dec 11 05:01:27 2018 +0000
Revision:
27:2872e658125e
Parent:
26:708fb66f0b6a
Child:
28:0187a2d494a2
Removed xbee send for button 5 and changed item button to button 5

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