Dependencies:   Motor

(notes)

Committer:
DerekW2015
Date:
Wed Dec 12 21:25:53 2018 +0000
Revision:
29:1d568c399cb7
Parent:
28:0187a2d494a2
Child:
30:889aff39caa8
Deleted all XBee libraries and code. Begin work with Wifi instead.

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