single player mbedKart

Dependencies:   Motor

(notes)

Committer:
sli425
Date:
Mon Dec 10 20:43:33 2018 +0000
Revision:
13:583181de031e
Parent:
12:4fec6ed886ab
Child:
15:350b9128a602
Added basic XBee communication and corresponding game logic

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"
sli425 13:583181de031e 5 #include "XBeeLib.h"
DerekW2015 0:a9a4c0fd5f8a 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 Mutex motors_lock;
DerekW2015 11:8d4b7702ac06 11
DerekW2015 0:a9a4c0fd5f8a 12 // Define devices
DerekW2015 0:a9a4c0fd5f8a 13 Motor left(p22, p16, p15); // pwm, fwd, rev
DerekW2015 0:a9a4c0fd5f8a 14 Motor right(p23, p19, p20); // pwm, fwd, rev
DerekW2015 0:a9a4c0fd5f8a 15 BusOut myled(LED1,LED2,LED3,LED4);
DerekW2015 0:a9a4c0fd5f8a 16 RGBLed myRGBled(p26, p25, p24); // red, green, blue
DerekW2015 0:a9a4c0fd5f8a 17 rgbSensor rgbsensor(p28, p27);
DerekW2015 0:a9a4c0fd5f8a 18 Serial blue(p13, p14); // serial tx, serial rx
DerekW2015 11:8d4b7702ac06 19 enum speed_state { accelerating, braking, coasting };
sli425 13:583181de031e 20 XBeeZB xbee = XBeeZB(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600); //Change these to pins used
DerekW2015 0:a9a4c0fd5f8a 21
sli425 3:6c749bff51aa 22 //Game state variables
sli425 3:6c749bff51aa 23 int progress = 0;
sli425 13:583181de031e 24 int position = 1;
DerekW2015 11:8d4b7702ac06 25 int current_item = 0;
sli425 12:4fec6ed886ab 26 bool holding_item = false;
sli425 12:4fec6ed886ab 27 bool itembox = false;
sli425 13:583181de031e 28 bool is_hit = false;
DerekW2015 11:8d4b7702ac06 29 float speed_cmd = 0.0;
DerekW2015 11:8d4b7702ac06 30 float max_speed = 1.0;
DerekW2015 11:8d4b7702ac06 31 float acceleration_rate = 0.04;
DerekW2015 11:8d4b7702ac06 32 float brake_rate = 0.1;
DerekW2015 11:8d4b7702ac06 33 float coast_rate = 0.02;
sli425 3:6c749bff51aa 34 int cstate;
DerekW2015 11:8d4b7702ac06 35 speed_state sstate = coasting;
DerekW2015 6:57a0323bb6b7 36 bool collide = false;
sli425 3:6c749bff51aa 37
DerekW2015 0:a9a4c0fd5f8a 38 // Global game actions
DerekW2015 8:92bf0cc337b5 39 bool paused = false;
DerekW2015 8:92bf0cc337b5 40 void check_unpause() {
DerekW2015 8:92bf0cc337b5 41 char bnum=0;
DerekW2015 8:92bf0cc337b5 42 char bhit=0;
DerekW2015 8:92bf0cc337b5 43 while (true) {
DerekW2015 8:92bf0cc337b5 44 if (blue.getc()=='B') { //button data packet
DerekW2015 8:92bf0cc337b5 45 bnum = blue.getc(); //button number
DerekW2015 8:92bf0cc337b5 46 bhit = blue.getc(); //1=hit, 0=release
DerekW2015 8:92bf0cc337b5 47 if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
DerekW2015 8:92bf0cc337b5 48 if (bnum == '1') { //number button 1, pause
DerekW2015 8:92bf0cc337b5 49 if (bhit=='1') paused = false;
DerekW2015 8:92bf0cc337b5 50 }
DerekW2015 8:92bf0cc337b5 51 }
DerekW2015 8:92bf0cc337b5 52 }
DerekW2015 8:92bf0cc337b5 53 }
DerekW2015 8:92bf0cc337b5 54 }
sli425 12:4fec6ed886ab 55
DerekW2015 8:92bf0cc337b5 56 void game_paused() {
DerekW2015 8:92bf0cc337b5 57 // Cycle through LEDs
DerekW2015 8:92bf0cc337b5 58 Thread pause_thread;
DerekW2015 8:92bf0cc337b5 59 pause_thread.start(check_unpause);
DerekW2015 8:92bf0cc337b5 60 while (paused) {
DerekW2015 8:92bf0cc337b5 61 int num = 1;
DerekW2015 8:92bf0cc337b5 62 for (int i = 0; i < 3; i++) {
DerekW2015 8:92bf0cc337b5 63 num *= 2;
DerekW2015 8:92bf0cc337b5 64 myled = num;
DerekW2015 8:92bf0cc337b5 65 ThisThread::sleep_for(100);
DerekW2015 8:92bf0cc337b5 66 }
DerekW2015 8:92bf0cc337b5 67 ThisThread::sleep_for(500);
DerekW2015 8:92bf0cc337b5 68 for (int i = 3; i > 0; i--) {
DerekW2015 8:92bf0cc337b5 69 num /= 2;
DerekW2015 8:92bf0cc337b5 70 myled = num;
DerekW2015 8:92bf0cc337b5 71 ThisThread::sleep_for(100);
DerekW2015 8:92bf0cc337b5 72 }
DerekW2015 8:92bf0cc337b5 73 ThisThread::sleep_for(500);
DerekW2015 8:92bf0cc337b5 74 }
DerekW2015 11:8d4b7702ac06 75 }
DerekW2015 11:8d4b7702ac06 76
DerekW2015 11:8d4b7702ac06 77 // Thread to control speed
DerekW2015 11:8d4b7702ac06 78 void speed_control() {
DerekW2015 11:8d4b7702ac06 79 // The kart has to be in one of three states at all times
DerekW2015 11:8d4b7702ac06 80 while(1) {
DerekW2015 11:8d4b7702ac06 81 while(sstate == coasting) {
DerekW2015 11:8d4b7702ac06 82 if (speed_cmd > 0.0) {
DerekW2015 11:8d4b7702ac06 83 speed_cmd -= coast_rate;
DerekW2015 11:8d4b7702ac06 84 left.speed(speed_cmd);
DerekW2015 11:8d4b7702ac06 85 right.speed(speed_cmd);
DerekW2015 11:8d4b7702ac06 86 }
DerekW2015 11:8d4b7702ac06 87 ThisThread::sleep_for(200);
DerekW2015 11:8d4b7702ac06 88 }
DerekW2015 11:8d4b7702ac06 89 while(sstate == accelerating) {
DerekW2015 11:8d4b7702ac06 90 if (speed_cmd < 1.0) {
DerekW2015 11:8d4b7702ac06 91 speed_cmd += acceleration_rate;
DerekW2015 11:8d4b7702ac06 92 left.speed(speed_cmd);
DerekW2015 11:8d4b7702ac06 93 right.speed(speed_cmd);
DerekW2015 11:8d4b7702ac06 94 }
DerekW2015 11:8d4b7702ac06 95 ThisThread::sleep_for(200);
DerekW2015 11:8d4b7702ac06 96 }
DerekW2015 11:8d4b7702ac06 97 while(sstate == braking) {
DerekW2015 11:8d4b7702ac06 98 if (speed_cmd > 0.0) {
DerekW2015 11:8d4b7702ac06 99 speed_cmd -= brake_rate;
DerekW2015 11:8d4b7702ac06 100 left.speed(speed_cmd);
DerekW2015 11:8d4b7702ac06 101 right.speed(speed_cmd);
DerekW2015 11:8d4b7702ac06 102 }
DerekW2015 11:8d4b7702ac06 103 ThisThread::sleep_for(200);
DerekW2015 11:8d4b7702ac06 104 }
DerekW2015 11:8d4b7702ac06 105 }
DerekW2015 11:8d4b7702ac06 106 }
DerekW2015 11:8d4b7702ac06 107
DerekW2015 11:8d4b7702ac06 108 // Thread to brake
DerekW2015 11:8d4b7702ac06 109 void brake() {
DerekW2015 11:8d4b7702ac06 110 motors_lock.lock();
DerekW2015 11:8d4b7702ac06 111 myled = 8;
DerekW2015 11:8d4b7702ac06 112 while(1) {
DerekW2015 11:8d4b7702ac06 113 if (speed_cmd > 0.0) {
DerekW2015 11:8d4b7702ac06 114 speed_cmd -= brake_rate;
DerekW2015 11:8d4b7702ac06 115 left.speed(speed_cmd);
DerekW2015 11:8d4b7702ac06 116 right.speed(speed_cmd);
DerekW2015 11:8d4b7702ac06 117 }
DerekW2015 11:8d4b7702ac06 118 ThisThread::sleep_for(200);
DerekW2015 11:8d4b7702ac06 119 }
DerekW2015 11:8d4b7702ac06 120 }
DerekW2015 0:a9a4c0fd5f8a 121
sli425 3:6c749bff51aa 122 // Thread for checking rgb sensor values and updating game variables
sli425 3:6c749bff51aa 123 // Change later depending on behavior of RGB sensor and colors used
sli425 3:6c749bff51aa 124 int thresh = 150; //change this depending on RGB values
sli425 3:6c749bff51aa 125 void check_RGB() {
sli425 12:4fec6ed886ab 126 while(true){
sli425 12:4fec6ed886ab 127 rgbsensor.update();
sli425 12:4fec6ed886ab 128 int C_value = rgbsensor.get_C();
sli425 12:4fec6ed886ab 129 int R_value = rgbsensor.get_R();
sli425 12:4fec6ed886ab 130 int G_value = rgbsensor.get_G();
sli425 12:4fec6ed886ab 131 int B_value = rgbsensor.get_B();
sli425 12:4fec6ed886ab 132 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 133 itembox = true;
sli425 12:4fec6ed886ab 134 cstate = 0;
sli425 12:4fec6ed886ab 135 }
sli425 12:4fec6ed886ab 136 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 137 max_speed = 1; //change this depending on speed up panel algs
sli425 12:4fec6ed886ab 138 cstate = 0;
sli425 12:4fec6ed886ab 139 }
sli425 12:4fec6ed886ab 140 else if(C_value > thresh && R_value > thresh && G_value > thresh && B_value > thresh) { //Check if cart collides with wall
sli425 12:4fec6ed886ab 141 collide = true;
sli425 12:4fec6ed886ab 142 }
sli425 12:4fec6ed886ab 143 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 144 cstate = 1;
sli425 12:4fec6ed886ab 145 }
sli425 12:4fec6ed886ab 146 else if(C_value > thresh && R_value > thresh && G_value > thresh && B_value > thresh && cstate == 1) {
sli425 12:4fec6ed886ab 147 //Second part of checking if cart reaches next checkpoint. If the previous color was passed through previously, updates checkpoint progress
sli425 12:4fec6ed886ab 148 cstate = 0;
sli425 12:4fec6ed886ab 149 progress++;
sli425 12:4fec6ed886ab 150 }
sli425 12:4fec6ed886ab 151 else {
sli425 12:4fec6ed886ab 152 cstate = 0;
sli425 12:4fec6ed886ab 153 }
sli425 12:4fec6ed886ab 154 ThisThread::sleep_for(500);
sli425 3:6c749bff51aa 155 }
sli425 3:6c749bff51aa 156 }
sli425 3:6c749bff51aa 157
sli425 12:4fec6ed886ab 158 void set_item() {
sli425 12:4fec6ed886ab 159 while(true){
sli425 12:4fec6ed886ab 160 if(itembox && current_item == 0) {
sli425 12:4fec6ed886ab 161 //playsound
sli425 12:4fec6ed886ab 162 for(int n = 0, n < 10, n++){ //flash the led to simulate slot machine effect
sli425 12:4fec6ed886ab 163 myRGBled(1.0,0.0,0.0);
sli425 12:4fec6ed886ab 164 ThisThread::sleep_for(50);
sli425 12:4fec6ed886ab 165 myRGBled(0.0,1.0,0.0);
sli425 12:4fec6ed886ab 166 ThisThread::sleep_for(50);
sli425 12:4fec6ed886ab 167 myRGBled(0.0,0.0,1.0);
sli425 12:4fec6ed886ab 168 ThisThread::sleep_for(50);
sli425 12:4fec6ed886ab 169 myRGBled(1.0,1.0,0.0);
sli425 12:4fec6ed886ab 170 ThisThread::sleep_for(50);
sli425 12:4fec6ed886ab 171 }
sli425 12:4fec6ed886ab 172 current_item = rand() % 4 + 1; //change this depending on items implemented and random item alg
sli425 12:4fec6ed886ab 173 if(current_item == 1){ //mushroom
sli425 12:4fec6ed886ab 174 myRGBled(1.0,0.0,0.0);
sli425 12:4fec6ed886ab 175 }
sli425 12:4fec6ed886ab 176 if(current_item == 2){ //green shell
sli425 12:4fec6ed886ab 177 myRGBled(0.0,1.0,0.0);
sli425 12:4fec6ed886ab 178 }
sli425 12:4fec6ed886ab 179 if(current_item == 3){ //blue shell
sli425 12:4fec6ed886ab 180 myRGBled(0.0,0.0,1.0);
sli425 12:4fec6ed886ab 181 }
sli425 12:4fec6ed886ab 182 if(current_item == 4){ //banana
sli425 12:4fec6ed886ab 183 myRGBled(1.0,1.0,0.0);
sli425 12:4fec6ed886ab 184 }
sli425 12:4fec6ed886ab 185 itembox = false;
sli425 12:4fec6ed886ab 186 }
sli425 12:4fec6ed886ab 187 ThisThread::sleep_for(500);
sli425 12:4fec6ed886ab 188 }
sli425 12:4fec6ed886ab 189 }
sli425 12:4fec6ed886ab 190
sli425 12:4fec6ed886ab 191 void hold_item() {
sli425 12:4fec6ed886ab 192 if(current_item == 0){
sli425 12:4fec6ed886ab 193 return;
sli425 12:4fec6ed886ab 194 }
sli425 12:4fec6ed886ab 195 if(current_item == 1){
sli425 12:4fec6ed886ab 196 max_speed = 1;
sli425 12:4fec6ed886ab 197 current_item = 0;
sli425 12:4fec6ed886ab 198 }
sli425 12:4fec6ed886ab 199 else{
sli425 12:4fec6ed886ab 200 holding_item = true;
sli425 12:4fec6ed886ab 201 }
sli425 12:4fec6ed886ab 202 return;
sli425 12:4fec6ed886ab 203 }
sli425 12:4fec6ed886ab 204
sli425 12:4fec6ed886ab 205 void release_item(){
sli425 12:4fec6ed886ab 206 holding_item = false;
sli425 12:4fec6ed886ab 207 if(current_item == 2){
sli425 12:4fec6ed886ab 208 //hit player in front
sli425 12:4fec6ed886ab 209 return;
sli425 12:4fec6ed886ab 210 }
sli425 12:4fec6ed886ab 211 if(current_item == 3){
sli425 12:4fec6ed886ab 212 //hit player in first
sli425 12:4fec6ed886ab 213 return;
sli425 12:4fec6ed886ab 214 }
sli425 12:4fec6ed886ab 215 if(current_item == 4){
sli425 12:4fec6ed886ab 216 //hit player behind
sli425 12:4fec6ed886ab 217 return;
sli425 12:4fec6ed886ab 218 }
sli425 12:4fec6ed886ab 219 }
sli425 12:4fec6ed886ab 220
sli425 13:583181de031e 221 static void send_broadcast_data(XBeeZB& xbee, int message_type)
sli425 13:583181de031e 222 {
sli425 13:583181de031e 223 if (message_type == 0) const char data[] = "?"; //update position
sli425 13:583181de031e 224 else if (message_type == 1) const char data[] = "F" + (const char)position; //shell forward
sli425 13:583181de031e 225 else if (message_type == 2) const char data[] = "B" + (const char)position; //hit backwards
sli425 13:583181de031e 226 else if (message_type == 3) const char data[] = "U" + (const char)progress; //Fix this thing later
sli425 13:583181de031e 227 else return;
sli425 13:583181de031e 228
sli425 13:583181de031e 229 const uint16_t data_len = strlen(data);
sli425 13:583181de031e 230 xbee.send_data_broadcast((const uint8_t *)data, data_len);
sli425 13:583181de031e 231 //const char data[] = "send_broadcast_data";
sli425 13:583181de031e 232 //const uint16_t data_len = strlen(data);
sli425 13:583181de031e 233
sli425 13:583181de031e 234 //const TxStatus txStatus = xbee.send_data_broadcast((const uint8_t *)data, data_len);
sli425 13:583181de031e 235 //if (txStatus == TxStatusSuccess)
sli425 13:583181de031e 236 //log_serial->printf("send_broadcast_data OK\r\n");
sli425 13:583181de031e 237 //else
sli425 13:583181de031e 238 //log_serial->printf("send_broadcast_data failed with %d\r\n", (int) txStatus);
sli425 13:583181de031e 239 }
sli425 13:583181de031e 240
sli425 13:583181de031e 241 static void receive_cb(const RemoteXBeeZB& remote, bool broadcast, const uint8_t *const data, uint16_t len)
sli425 13:583181de031e 242 {
sli425 13:583181de031e 243 const uint64_t remote_addr64 = remote.get_addr64();
sli425 13:583181de031e 244 if (data[0] == "?") send_broadcast_data(xbee, 3);
sli425 13:583181de031e 245 if (data[0] == "F") is_hit = ((int)data[1] - "0" - 1 == position);
sli425 13:583181de031e 246 if (data[0] == "B") is_hit = ((int)data[1] - "0" + 1 == position);
sli425 13:583181de031e 247 if (data[0] == "U") {
sli425 13:583181de031e 248 if ((int)data[1] - "0" > progress) position++;
sli425 13:583181de031e 249 if ((int)data[1] - "0" < progress) position--;
sli425 13:583181de031e 250 //update position value
sli425 13:583181de031e 251 }
sli425 13:583181de031e 252
sli425 13:583181de031e 253 //log_serial->printf("\r\nGot a %s RX packet [%08x:%08x|%04x], len %d\r\nData: ", broadcast ? "BROADCAST" : "UNICAST", UINT64_HI32(remote_addr64), UINT64_LO32(remote_addr64), remote.get_addr16(), len);
sli425 13:583181de031e 254
sli425 13:583181de031e 255 //for (int i = 0; i < len; i++)
sli425 13:583181de031e 256 //log_serial->printf("%02x ", data[i]);
sli425 13:583181de031e 257
sli425 13:583181de031e 258 //log_serial->printf("\r\n");
sli425 13:583181de031e 259 }
sli425 13:583181de031e 260
sli425 13:583181de031e 261 void update_thread(){
sli425 13:583181de031e 262 send_broadcast_data(xbee, 0);
sli425 13:583181de031e 263 ThisThread::sleep_for(500);
sli425 13:583181de031e 264 }
sli425 12:4fec6ed886ab 265
DerekW2015 0:a9a4c0fd5f8a 266 int main() {
DerekW2015 0:a9a4c0fd5f8a 267 // Start threads
DerekW2015 9:6649141315be 268 thread1.start(check_RGB);
DerekW2015 11:8d4b7702ac06 269 thread2.start(speed_control); // Since we're stopped, this won't do anything
sli425 13:583181de031e 270 xbee.register_receive_cb(&receive_cb);
DerekW2015 0:a9a4c0fd5f8a 271
DerekW2015 0:a9a4c0fd5f8a 272 // Bluetooth controller code
DerekW2015 0:a9a4c0fd5f8a 273 char bnum=0;
DerekW2015 0:a9a4c0fd5f8a 274 char bhit=0;
DerekW2015 0:a9a4c0fd5f8a 275 while(1) {
DerekW2015 0:a9a4c0fd5f8a 276 if (blue.getc()=='!') {
DerekW2015 0:a9a4c0fd5f8a 277 if (blue.getc()=='B') { //button data packet
DerekW2015 0:a9a4c0fd5f8a 278 bnum = blue.getc(); //button number
DerekW2015 0:a9a4c0fd5f8a 279 bhit = blue.getc(); //1=hit, 0=release
DerekW2015 0:a9a4c0fd5f8a 280 if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
DerekW2015 0:a9a4c0fd5f8a 281 switch (bnum) {
DerekW2015 0:a9a4c0fd5f8a 282 case '1': //number button 1, pause
DerekW2015 0:a9a4c0fd5f8a 283 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 284 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 8:92bf0cc337b5 285 paused = true;
DerekW2015 8:92bf0cc337b5 286 game_paused();
DerekW2015 0:a9a4c0fd5f8a 287 }
DerekW2015 0:a9a4c0fd5f8a 288 break;
DerekW2015 0:a9a4c0fd5f8a 289 case '2': //number button 2, accelerate
DerekW2015 0:a9a4c0fd5f8a 290 if (bhit=='1') {
DerekW2015 11:8d4b7702ac06 291 sstate = accelerating;
DerekW2015 0:a9a4c0fd5f8a 292 } else {
DerekW2015 11:8d4b7702ac06 293 sstate = coasting;
DerekW2015 0:a9a4c0fd5f8a 294 }
DerekW2015 0:a9a4c0fd5f8a 295 break;
DerekW2015 0:a9a4c0fd5f8a 296 case '3': //number button 3
DerekW2015 0:a9a4c0fd5f8a 297 if (bhit=='1') {
sli425 12:4fec6ed886ab 298 hold_item(); //holds item to protect player from incoming hazards
DerekW2015 0:a9a4c0fd5f8a 299 } else {
sli425 12:4fec6ed886ab 300 release_item(); //release item to attack
DerekW2015 0:a9a4c0fd5f8a 301 }
DerekW2015 0:a9a4c0fd5f8a 302 break;
DerekW2015 0:a9a4c0fd5f8a 303 case '4': //number button 4, brakes
DerekW2015 0:a9a4c0fd5f8a 304 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 305 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 11:8d4b7702ac06 306 sstate = braking;
DerekW2015 0:a9a4c0fd5f8a 307 } else {
DerekW2015 11:8d4b7702ac06 308 sstate = coasting;
DerekW2015 0:a9a4c0fd5f8a 309 }
DerekW2015 0:a9a4c0fd5f8a 310 break;
DerekW2015 0:a9a4c0fd5f8a 311 case '5': //button 5 up arrow
DerekW2015 0:a9a4c0fd5f8a 312 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 313 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 314 //throw_item();
DerekW2015 0:a9a4c0fd5f8a 315 //item_box();
DerekW2015 0:a9a4c0fd5f8a 316 } else {
DerekW2015 0:a9a4c0fd5f8a 317
DerekW2015 0:a9a4c0fd5f8a 318 }
DerekW2015 0:a9a4c0fd5f8a 319 break;
DerekW2015 0:a9a4c0fd5f8a 320 case '6': //button 6 down arrow
DerekW2015 0:a9a4c0fd5f8a 321 if (bhit=='1') {
DerekW2015 11:8d4b7702ac06 322 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 323 left.speed(-1.0);
DerekW2015 0:a9a4c0fd5f8a 324 right.speed(-1.0);
DerekW2015 0:a9a4c0fd5f8a 325 } else {
DerekW2015 0:a9a4c0fd5f8a 326 left.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 327 right.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 328 }
DerekW2015 0:a9a4c0fd5f8a 329 break;
DerekW2015 0:a9a4c0fd5f8a 330 case '7': //button 7 left arrow
DerekW2015 0:a9a4c0fd5f8a 331 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 332 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 333 left.speed(0.3);
DerekW2015 0:a9a4c0fd5f8a 334 right.speed(1.0);
DerekW2015 0:a9a4c0fd5f8a 335 } else {
DerekW2015 0:a9a4c0fd5f8a 336 left.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 337 right.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 338 }
DerekW2015 0:a9a4c0fd5f8a 339 break;
DerekW2015 0:a9a4c0fd5f8a 340 case '8': //button 8 right arrow
DerekW2015 0:a9a4c0fd5f8a 341 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 342 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 343 left.speed(1.0);
DerekW2015 0:a9a4c0fd5f8a 344 right.speed(0.3);
DerekW2015 0:a9a4c0fd5f8a 345 } else {
DerekW2015 0:a9a4c0fd5f8a 346 left.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 347 right.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 348 }
DerekW2015 0:a9a4c0fd5f8a 349 break;
DerekW2015 0:a9a4c0fd5f8a 350 default:
DerekW2015 0:a9a4c0fd5f8a 351 break;
DerekW2015 0:a9a4c0fd5f8a 352 }
DerekW2015 0:a9a4c0fd5f8a 353 }
DerekW2015 0:a9a4c0fd5f8a 354 }
DerekW2015 0:a9a4c0fd5f8a 355 }
DerekW2015 0:a9a4c0fd5f8a 356 }
DerekW2015 0:a9a4c0fd5f8a 357 }