single player mbedKart

Dependencies:   Motor

(notes)

Committer:
DerekW2015
Date:
Mon Dec 10 02:56:30 2018 +0000
Revision:
9:6649141315be
Parent:
8:92bf0cc337b5
Child:
10:83c5333f5b16
Child:
11:8d4b7702ac06
Removed item_thread as that functionality is now in check_rgb

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 0:a9a4c0fd5f8a 5
DerekW2015 0:a9a4c0fd5f8a 6 // Define devices
DerekW2015 0:a9a4c0fd5f8a 7 Motor left(p22, p16, p15); // pwm, fwd, rev
DerekW2015 0:a9a4c0fd5f8a 8 Motor right(p23, p19, p20); // pwm, fwd, rev
DerekW2015 0:a9a4c0fd5f8a 9 BusOut myled(LED1,LED2,LED3,LED4);
DerekW2015 0:a9a4c0fd5f8a 10 RGBLed myRGBled(p26, p25, p24); // red, green, blue
DerekW2015 0:a9a4c0fd5f8a 11 rgbSensor rgbsensor(p28, p27);
DerekW2015 0:a9a4c0fd5f8a 12 Serial blue(p13, p14); // serial tx, serial rx
DerekW2015 0:a9a4c0fd5f8a 13
sli425 3:6c749bff51aa 14 //Game state variables
sli425 3:6c749bff51aa 15 int progress = 0;
sli425 3:6c749bff51aa 16 int current_item;
sli425 3:6c749bff51aa 17 int speed;
sli425 3:6c749bff51aa 18 int max_speed;
sli425 3:6c749bff51aa 19 int acceleration;
sli425 3:6c749bff51aa 20 int cstate;
DerekW2015 6:57a0323bb6b7 21 bool collide = false;
sli425 3:6c749bff51aa 22
DerekW2015 0:a9a4c0fd5f8a 23 // Global game actions
DerekW2015 8:92bf0cc337b5 24 bool paused = false;
DerekW2015 8:92bf0cc337b5 25 void check_unpause() {
DerekW2015 8:92bf0cc337b5 26 char bnum=0;
DerekW2015 8:92bf0cc337b5 27 char bhit=0;
DerekW2015 8:92bf0cc337b5 28 while (true) {
DerekW2015 8:92bf0cc337b5 29 if (blue.getc()=='B') { //button data packet
DerekW2015 8:92bf0cc337b5 30 bnum = blue.getc(); //button number
DerekW2015 8:92bf0cc337b5 31 bhit = blue.getc(); //1=hit, 0=release
DerekW2015 8:92bf0cc337b5 32 if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
DerekW2015 8:92bf0cc337b5 33 if (bnum == '1') { //number button 1, pause
DerekW2015 8:92bf0cc337b5 34 if (bhit=='1') paused = false;
DerekW2015 8:92bf0cc337b5 35 }
DerekW2015 8:92bf0cc337b5 36 }
DerekW2015 8:92bf0cc337b5 37 }
DerekW2015 8:92bf0cc337b5 38 }
DerekW2015 8:92bf0cc337b5 39 }
DerekW2015 8:92bf0cc337b5 40
DerekW2015 8:92bf0cc337b5 41 void game_paused() {
DerekW2015 8:92bf0cc337b5 42 // Cycle through LEDs
DerekW2015 8:92bf0cc337b5 43 Thread pause_thread;
DerekW2015 8:92bf0cc337b5 44 pause_thread.start(check_unpause);
DerekW2015 8:92bf0cc337b5 45 while (paused) {
DerekW2015 8:92bf0cc337b5 46 int num = 1;
DerekW2015 8:92bf0cc337b5 47 for (int i = 0; i < 3; i++) {
DerekW2015 8:92bf0cc337b5 48 num *= 2;
DerekW2015 8:92bf0cc337b5 49 myled = num;
DerekW2015 8:92bf0cc337b5 50 ThisThread::sleep_for(100);
DerekW2015 8:92bf0cc337b5 51 }
DerekW2015 8:92bf0cc337b5 52 ThisThread::sleep_for(500);
DerekW2015 8:92bf0cc337b5 53 for (int i = 3; i > 0; i--) {
DerekW2015 8:92bf0cc337b5 54 num /= 2;
DerekW2015 8:92bf0cc337b5 55 myled = num;
DerekW2015 8:92bf0cc337b5 56 ThisThread::sleep_for(100);
DerekW2015 8:92bf0cc337b5 57 }
DerekW2015 8:92bf0cc337b5 58 ThisThread::sleep_for(500);
DerekW2015 8:92bf0cc337b5 59 }
DerekW2015 9:6649141315be 60 }
DerekW2015 0:a9a4c0fd5f8a 61
sli425 3:6c749bff51aa 62 // Thread for checking rgb sensor values and updating game variables
sli425 3:6c749bff51aa 63 // Change later depending on behavior of RGB sensor and colors used
sli425 3:6c749bff51aa 64 int thresh = 150; //change this depending on RGB values
sli425 3:6c749bff51aa 65 void check_RGB() {
sli425 3:6c749bff51aa 66 rgbsensor.update();
sli425 3:6c749bff51aa 67 int C_value = rgbsensor.get_C();
sli425 3:6c749bff51aa 68 int R_value = rgbsensor.get_R();
sli425 3:6c749bff51aa 69 int G_value = rgbsensor.get_G();
sli425 3:6c749bff51aa 70 int B_value = rgbsensor.get_B();
sli425 3:6c749bff51aa 71 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 3:6c749bff51aa 72 current_item = rand() % 4 + 1; //change this depending on items implemented and random item alg
sli425 3:6c749bff51aa 73 cstate = 0;
sli425 3:6c749bff51aa 74 }
sli425 3:6c749bff51aa 75 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 3:6c749bff51aa 76 max_speed = 1; //change this depending on speed up panel algs
sli425 3:6c749bff51aa 77 cstate = 0;
sli425 3:6c749bff51aa 78 }
sli425 3:6c749bff51aa 79 else if(C_value > thresh && R_value > thresh && G_value > thresh && B_value > thresh) { //Check if cart collides with wall
DerekW2015 6:57a0323bb6b7 80 collide = true;
sli425 3:6c749bff51aa 81 }
sli425 3:6c749bff51aa 82 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 3:6c749bff51aa 83 cstate = 1;
sli425 3:6c749bff51aa 84 }
sli425 3:6c749bff51aa 85 else if(C_value > thresh && R_value > thresh && G_value > thresh && B_value > thresh && cstate == 1) {
sli425 3:6c749bff51aa 86 //Second part of checking if cart reaches next checkpoint. If the previous color was passed through previously, updates checkpoint progress
sli425 3:6c749bff51aa 87 cstate = 0;
sli425 3:6c749bff51aa 88 progress++;
sli425 3:6c749bff51aa 89 }
sli425 3:6c749bff51aa 90 else {
sli425 3:6c749bff51aa 91 cstate = 0;
sli425 3:6c749bff51aa 92 }
sli425 3:6c749bff51aa 93 }
sli425 3:6c749bff51aa 94
DerekW2015 2:b57d7156830c 95 // Define threads
DerekW2015 6:57a0323bb6b7 96 Thread thread1;
DerekW2015 2:b57d7156830c 97
DerekW2015 0:a9a4c0fd5f8a 98 int main() {
DerekW2015 0:a9a4c0fd5f8a 99 // Start threads
DerekW2015 9:6649141315be 100 thread1.start(check_RGB);
DerekW2015 0:a9a4c0fd5f8a 101
DerekW2015 0:a9a4c0fd5f8a 102 // Bluetooth controller code
DerekW2015 0:a9a4c0fd5f8a 103 char bnum=0;
DerekW2015 0:a9a4c0fd5f8a 104 char bhit=0;
DerekW2015 0:a9a4c0fd5f8a 105 while(1) {
DerekW2015 0:a9a4c0fd5f8a 106 if (blue.getc()=='!') {
DerekW2015 0:a9a4c0fd5f8a 107 if (blue.getc()=='B') { //button data packet
DerekW2015 0:a9a4c0fd5f8a 108 bnum = blue.getc(); //button number
DerekW2015 0:a9a4c0fd5f8a 109 bhit = blue.getc(); //1=hit, 0=release
DerekW2015 0:a9a4c0fd5f8a 110 if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
DerekW2015 0:a9a4c0fd5f8a 111 switch (bnum) {
DerekW2015 0:a9a4c0fd5f8a 112 case '1': //number button 1, pause
DerekW2015 0:a9a4c0fd5f8a 113 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 114 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 8:92bf0cc337b5 115 paused = true;
DerekW2015 8:92bf0cc337b5 116 game_paused();
DerekW2015 0:a9a4c0fd5f8a 117 }
DerekW2015 0:a9a4c0fd5f8a 118 break;
DerekW2015 0:a9a4c0fd5f8a 119 case '2': //number button 2, accelerate
DerekW2015 0:a9a4c0fd5f8a 120 if (bhit=='1') {
DerekW2015 8:92bf0cc337b5 121 myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 122 left.speed(1.0);
DerekW2015 0:a9a4c0fd5f8a 123 right.speed(1.0);
DerekW2015 0:a9a4c0fd5f8a 124 } else {
DerekW2015 0:a9a4c0fd5f8a 125 left.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 126 right.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 127 }
DerekW2015 0:a9a4c0fd5f8a 128 break;
DerekW2015 0:a9a4c0fd5f8a 129 case '3': //number button 3
DerekW2015 0:a9a4c0fd5f8a 130 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 131 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 132 //add hit code here
DerekW2015 0:a9a4c0fd5f8a 133 } else {
DerekW2015 0:a9a4c0fd5f8a 134 //add release code here
DerekW2015 0:a9a4c0fd5f8a 135 }
DerekW2015 0:a9a4c0fd5f8a 136 break;
DerekW2015 0:a9a4c0fd5f8a 137 case '4': //number button 4, brakes
DerekW2015 0:a9a4c0fd5f8a 138 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 139 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 140 //add hit code here
DerekW2015 0:a9a4c0fd5f8a 141 } else {
DerekW2015 0:a9a4c0fd5f8a 142 //add release code here
DerekW2015 0:a9a4c0fd5f8a 143 }
DerekW2015 0:a9a4c0fd5f8a 144 break;
DerekW2015 0:a9a4c0fd5f8a 145 case '5': //button 5 up arrow
DerekW2015 0:a9a4c0fd5f8a 146 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 147 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 148 //throw_item();
DerekW2015 0:a9a4c0fd5f8a 149 //item_box();
DerekW2015 0:a9a4c0fd5f8a 150 } else {
DerekW2015 0:a9a4c0fd5f8a 151
DerekW2015 0:a9a4c0fd5f8a 152 }
DerekW2015 0:a9a4c0fd5f8a 153 break;
DerekW2015 0:a9a4c0fd5f8a 154 case '6': //button 6 down arrow
DerekW2015 0:a9a4c0fd5f8a 155 if (bhit=='1') {
DerekW2015 8:92bf0cc337b5 156 myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 157 left.speed(-1.0);
DerekW2015 0:a9a4c0fd5f8a 158 right.speed(-1.0);
DerekW2015 0:a9a4c0fd5f8a 159 } else {
DerekW2015 0:a9a4c0fd5f8a 160 left.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 161 right.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 162 }
DerekW2015 0:a9a4c0fd5f8a 163 break;
DerekW2015 0:a9a4c0fd5f8a 164 case '7': //button 7 left arrow
DerekW2015 0:a9a4c0fd5f8a 165 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 166 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 167 left.speed(0.3);
DerekW2015 0:a9a4c0fd5f8a 168 right.speed(1.0);
DerekW2015 0:a9a4c0fd5f8a 169 } else {
DerekW2015 0:a9a4c0fd5f8a 170 left.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 171 right.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 172 }
DerekW2015 0:a9a4c0fd5f8a 173 break;
DerekW2015 0:a9a4c0fd5f8a 174 case '8': //button 8 right arrow
DerekW2015 0:a9a4c0fd5f8a 175 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 176 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 177 left.speed(1.0);
DerekW2015 0:a9a4c0fd5f8a 178 right.speed(0.3);
DerekW2015 0:a9a4c0fd5f8a 179 } else {
DerekW2015 0:a9a4c0fd5f8a 180 left.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 181 right.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 182 }
DerekW2015 0:a9a4c0fd5f8a 183 break;
DerekW2015 0:a9a4c0fd5f8a 184 default:
DerekW2015 0:a9a4c0fd5f8a 185 break;
DerekW2015 0:a9a4c0fd5f8a 186 }
DerekW2015 0:a9a4c0fd5f8a 187 }
DerekW2015 0:a9a4c0fd5f8a 188 }
DerekW2015 0:a9a4c0fd5f8a 189 }
DerekW2015 0:a9a4c0fd5f8a 190 }
DerekW2015 0:a9a4c0fd5f8a 191 }