Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Fork of BeaconDemo_RobotCodeNew by
PsiSwarm/demo.cpp
- Committer:
- jah128
- Date:
- 2015-10-03
- Revision:
- 0:8a5497a2e366
- Child:
- 1:f6356cf1cefc
File content as of revision 0:8a5497a2e366:
/* University of York Robotics Laboratory PsiSwarm Library: Demo Mode Source File
*
* File: demo.cpp
*
* (C) Dr James Hilder, Dept. Electronics & Computer Science, University of York
*
* PsiSwarm Library Version: 0.2
*
* Version 0.2 : Remove most the functionality from center-button push to allow all operations to be accessable from
* four directions alone.
*
* September 2015
*
*/
#include "psiswarm.h"
char top_menu = 0;
char sub_menu = 0;
char level = 0;
char started = 0;
char topline[17];
char bottomline[17];
char led_state[9];
char all_led_state = 0;
char base_led_state = 0;
char brightness = 20;
char bl_brightness = 100;
char base_ir_index = 0;
char side_ir_index = 0;
signed short left_speed = 0;
signed short right_speed = 0;
char both_motor_mode = 0;
char last_switch_pressed;
Timeout demo_event;
char handling_event = 0;
Timeout demo_timeout;
char demo_running = 0;
Timer demo_timer;
float time_out;
float speed;
char state;
char led_step = 0;
char spin_step = 0;
char stress_step = 0;
void demo_mode()
{
debug("- Starting Demo Mode\n");
demo_on = 1;
display.set_backlight_brightness(bl_brightness * 0.01f);
display.clear_display();
display.write_string("PSI SWARM SYSTEM");
display.set_position(1,0);
display.write_string(" DEMO MODE");
wait(0.5);
display.clear_display();
display.write_string("Use cursor to");
display.set_position(1,0);
display.write_string("navigate menus");
char step = 0;
while(demo_on) {
if(demo_running == 0) {
switch(step) {
case 0:
mbed_led1 = 1;
mbed_led4 = 0;
break;
case 1:
mbed_led2 = 1;
mbed_led1 = 0;
break;
case 2:
mbed_led3 = 1;
mbed_led2 = 0;
break;
case 3:
mbed_led4 = 1;
mbed_led3 = 0;
break;
}
step++;
if(step==4)step=0;
} else {
mbed_led1 = 0;
mbed_led2 = 0;
mbed_led3 = 0;
mbed_led4 = 0;
}
wait(0.5);
}
debug("- Demo mode ended\n");
}
void demo_handle_switch_event(char switch_pressed)
{
if(!handling_event) {
handling_event = 1;
last_switch_pressed = switch_pressed;
demo_event.attach_us(&demo_event_thread, 1000);
}
}
void demo_event_thread()
{
handling_event = 0;
if(started == 1) {
switch(last_switch_pressed) {
case 1: //Up pressed
switch(level) {
case 0:
if(top_menu < 6) {
level++;
sub_menu = 0;
} else {
demo_on = 0;
user_code_running = user_code_restore_mode;
}
break;
case 1:
switch(top_menu) {
case 0: //LED Menu
if(sub_menu < 9) {
if(led_state[sub_menu] == 0) led_state[sub_menu] = 3;
else led_state[sub_menu]--;
demo_update_leds();
}
if(sub_menu == 9) {
if(all_led_state == 0) all_led_state = 3;
else all_led_state--;
for(int i=0; i<9; i++) {
led_state[i]=all_led_state;
}
demo_update_leds();
}
if(sub_menu == 10) {
base_led_state = 1 - base_led_state;
demo_update_leds();
}
if(sub_menu == 11) {
switch(brightness) {
case 100:
brightness = 50;
break;
case 2:
brightness = 1;
break;
case 5:
brightness = 2;
break;
case 10:
brightness = 5;
break;
case 20:
brightness = 10;
break;
case 50:
brightness = 20;
break;
}
demo_update_leds();
}
if(sub_menu == 12) {
if(bl_brightness > 0) bl_brightness-=10;
display.set_backlight_brightness(bl_brightness * 0.01f);
}
if(sub_menu == 13) level = 0;
break;
case 1: // Sensors Menu
if(sub_menu == 4 || sub_menu == 5) {
if(base_ir_index == 0) base_ir_index = 4;
else base_ir_index --;
}
if(sub_menu > 5 && sub_menu < 9) {
if(side_ir_index == 0) side_ir_index = 7;
else side_ir_index --;
}
if(sub_menu == 10) level = 0;
break;
case 2: // Motor Menu
if(sub_menu == 0) {
left_speed += 5;
if(left_speed > 100) left_speed = 100;
set_left_motor_speed(left_speed / 100.0f);
}
if(sub_menu == 1) {
right_speed += 5;
if(right_speed > 100) right_speed = 100;
set_right_motor_speed(right_speed / 100.0f);
}
if(sub_menu == 2) {
if(both_motor_mode == 0) both_motor_mode=5;
else both_motor_mode--;
switch(both_motor_mode) {
case 0:
stop();
break;
case 1:
brake();
break;
case 2:
forward(0.5);
break;
case 3:
forward(1);
break;
case 4:
backward(0.5);
break;
case 5:
backward(1.0);
break;
}
}
if(sub_menu == 3) {
level = 0;
}
break;
case 3: // Radio Menu
if(sub_menu == 0) level = 0;
break;
case 4: // Info Menu
if(sub_menu == 3) level = 0;
break;
case 5: // Demo Menu
if(sub_menu == 1) {
if(demo_running == 0) {
start_obstacle_demo();
} else {
demo_running = 0;
display.set_backlight_brightness(bl_brightness * 0.01f);
stop();
}
}
if(sub_menu == 2) {
if(demo_running == 0) {
start_spinning_demo();
} else {
demo_running = 0;
display.set_backlight_brightness(bl_brightness * 0.01f);
stop();
}
}
if(sub_menu == 3) {
if(demo_running == 0) {
start_stress_demo();
} else {
demo_running = 0;
display.set_backlight_brightness(bl_brightness * 0.01f);
stop();
}
}
if(sub_menu == 4) level = 0;
break;
}
break;
}
break;
case 2: //Down pressed
switch(level) {
case 0:
if(top_menu < 6) {
level++;
sub_menu = 0;
} else {
demo_on = 0;
user_code_running = user_code_restore_mode;
}
break;
case 1:
switch(top_menu) {
case 0: //LED Menu
if(sub_menu < 9) {
led_state[sub_menu]++;
if(led_state[sub_menu] == 4) led_state[sub_menu] = 0;
demo_update_leds();
}
if(sub_menu == 9) {
all_led_state++;
if(all_led_state == 4) all_led_state = 0;
for(int i=0; i<9; i++) {
led_state[i]=all_led_state;
}
demo_update_leds();
}
if(sub_menu == 10) {
base_led_state = 1 - base_led_state;
demo_update_leds();
}
if(sub_menu == 11) {
switch(brightness) {
case 1:
brightness = 2;
break;
case 2:
brightness = 5;
break;
case 5:
brightness = 10;
break;
case 10:
brightness = 20;
break;
case 20:
brightness = 50;
break;
case 50:
brightness = 100;
break;
}
demo_update_leds();
}
if(sub_menu == 12) {
if(bl_brightness < 100) bl_brightness+=10;
display.set_backlight_brightness(bl_brightness * 0.01f);
}
if(sub_menu == 13) level = 0;
break;
case 1: // Sensors Menu
if(sub_menu == 4 || sub_menu == 5) {
if(base_ir_index == 4) base_ir_index = 0;
else base_ir_index ++;
}
if(sub_menu > 5 && sub_menu < 9) {
if(side_ir_index == 7) side_ir_index = 0;
else side_ir_index ++;
}
if(sub_menu == 10) level = 0;
break;
case 2: // Motor Menu
if(sub_menu == 0) {
left_speed -= 5;
if(left_speed < -100) left_speed = -100;
set_left_motor_speed(left_speed / 100.0f);
}
if(sub_menu == 1) {
right_speed -= 5;
if(right_speed < -100) right_speed = -100;
set_right_motor_speed(right_speed / 100.0f);
}
if(sub_menu == 2) {
both_motor_mode++;
if(both_motor_mode == 6) both_motor_mode=0;
switch(both_motor_mode) {
case 0:
stop();
break;
case 1:
brake();
break;
case 2:
forward(0.5);
break;
case 3:
forward(1);
break;
case 4:
backward(0.5);
break;
case 5:
backward(1.0);
break;
}
}
if(sub_menu == 3) {
level = 0;
}
break;
case 3: // Radio Menu
if(sub_menu == 0) level = 0;
break;
case 4: // Info Menu
if(sub_menu == 3) level = 0;
break;
case 5: // Demo Menu
if(sub_menu == 1) {
if(demo_running == 0) {
start_obstacle_demo();
} else {
demo_running = 0;
display.set_backlight_brightness(bl_brightness * 0.01f);
stop();
}
}
if(sub_menu == 2) {
if(demo_running == 0) {
start_spinning_demo();
} else {
demo_running = 0;
display.set_backlight_brightness(bl_brightness * 0.01f);
stop();
}
}
if(sub_menu == 3) {
if(demo_running == 0) {
start_stress_demo();
} else {
demo_running = 0;
display.set_backlight_brightness(bl_brightness * 0.01f);
stop();
}
}
if(sub_menu == 4) level = 0;
break;
}
break;
}
break;
case 4: //Left pressed
switch(level) {
case 0:
if(top_menu == 0) top_menu = 6;
else top_menu --;
break;
case 1:
switch(top_menu) {
case 0: //LED Menu
if(sub_menu == 0) sub_menu = 13;
else sub_menu --;
break;
case 1: //Sensors Menu
if(sub_menu == 0) sub_menu = 10;
else sub_menu --;
break;
case 2: //Motor Menu
if(sub_menu == 0) sub_menu = 3;
else sub_menu --;
break;
case 4: //Info Menu
if(sub_menu == 0) sub_menu = 3;
else sub_menu --;
break;
case 5: //Demo Menu
if(sub_menu == 0) sub_menu = 4;
else sub_menu --;
break;
}
break;
}
break;
case 8: //Right pressed
switch(level) {
case 0:
top_menu ++;
if(top_menu > 6) top_menu = 0;
break;
case 1:
switch(top_menu) {
case 0: //LED Menu
if(sub_menu == 13) sub_menu = 0;
else sub_menu ++;
break;
case 1: //Sensors Menu
if(sub_menu == 10) sub_menu = 0;
else sub_menu ++;
break;
case 2: //Motor Menu
if(sub_menu == 3) sub_menu = 0;
else sub_menu ++;
break;
case 4: //Info Menu
if(sub_menu == 3) sub_menu = 0;
else sub_menu ++;
break;
case 5: //Demo Menu
if(sub_menu == 4) sub_menu = 0;
else sub_menu ++;
break;
}
break;
}
break;
case 16: //Select pressed
switch(level) {
case 0:
if(top_menu < 6) {
level++;
sub_menu = 0;
} else {
demo_on = 0;
user_code_running = user_code_restore_mode;
}
break;
case 1:
switch(top_menu) {
case 0: //LED Menu
if(sub_menu == 9) {
for(int i=0; i<9; i++) {
led_state[i]=all_led_state;
}
demo_update_leds();
}
if(sub_menu == 13) level = 0;
break;
case 1: // Sensors Menu
if(sub_menu == 10) level = 0;
break;
case 2: //Motor Menu
if(sub_menu == 2) {
switch(both_motor_mode) {
case 0:
stop();
break;
case 1:
brake();
break;
case 2:
forward(0.5);
break;
case 3:
forward(1);
break;
case 4:
backward(0.5);
break;
case 5:
backward(1.0);
break;
}
}
if(sub_menu == 3) {
level = 0;
}
break;
case 3: // Radio Menu
if(sub_menu == 0) level = 0;
break;
case 4: // Info Menu
if(sub_menu == 3) level = 0;
break;
case 5: // Demo Menu
if(sub_menu == 4) level = 0;
break;
}
break;
}
break;
}
} else started = 1;
display.clear_display();
switch(level) {
case 0:
//Top level menu
switch(top_menu) {
case 0:
strcpy(topline,"---TEST LEDS----");
break;
case 1:
strcpy(topline,"--TEST SENSORS--");
break;
case 2:
strcpy(topline,"--TEST MOTORS---");
break;
case 3:
strcpy(topline,"---TEST RADIO---");
break;
case 4:
strcpy(topline,"------INFO------");
break;
case 5:
strcpy(topline,"---CODE DEMOS---");
break;
case 6:
strcpy(topline,"------EXIT------");
break;
}
strcpy(bottomline,"");
break;
case 1:
//Sub level menu
switch(top_menu) {
case 0:
strcpy(topline,"----LED MENU----");
char led_status[7];
if(sub_menu<9) {
switch(led_state[sub_menu]) {
case 0:
strcpy(led_status,"OFF");
break;
case 1:
strcpy(led_status,"RED");
break;
case 2:
strcpy(led_status,"GREEN");
break;
case 3:
strcpy(led_status,"YELLOW");
break;
}
}
if(sub_menu < 8) sprintf(bottomline,"OUTER %d: %s",(sub_menu + 1),led_status);
if(sub_menu == 8) sprintf(bottomline,"CENTER: %s",led_status);
if(sub_menu == 9) {
switch(all_led_state) {
case 0:
strcpy(led_status,"OFF");
break;
case 1:
strcpy(led_status,"RED");
break;
case 2:
strcpy(led_status,"GREEN");
break;
case 3:
strcpy(led_status,"YELLOW");
break;
}
sprintf(bottomline,"SET ALL %s", led_status);
}
if(sub_menu == 10) {
if(base_led_state == 0) strcpy(led_status,"OFF");
else strcpy(led_status,"ON");
sprintf(bottomline,"BASE: %s",led_status);
}
if(sub_menu == 11) sprintf(bottomline,"CLED BNESS %d%%", brightness);
if(sub_menu == 12) sprintf(bottomline,"DISP BNESS %d%%", bl_brightness);
if(sub_menu == 13) strcpy(bottomline,"EXIT");
break;
case 1:
strcpy(topline,"--SENSORS MENU--");
switch(sub_menu) {
case 0: {
float battery = get_battery_voltage ();
sprintf(bottomline,"BATTERY: %1.3fV",battery);
break;
}
case 1: {
float dc = get_dc_voltage ();
sprintf(bottomline,"DC: %1.3fV",dc);
break;
}
case 2: {
float current = get_current ();
sprintf(bottomline,"CURRENT: %1.3fA",current);
break;
}
case 3: {
float temperature = get_temperature();
sprintf(bottomline,"TEMP: %3.2fC", temperature);
break;
}
case 4:
store_background_base_ir_values();
sprintf(bottomline,"BIR%dB:%d",base_ir_index+1,get_background_base_ir_value(base_ir_index));
break;
case 5:
store_illuminated_base_ir_values();
sprintf(bottomline,"BIR%dR:%d",base_ir_index+1,get_illuminated_base_ir_value(base_ir_index));
break;
case 6:
store_background_raw_ir_values();
sprintf(bottomline,"SIR%dB:%d",side_ir_index+1,get_background_raw_ir_value(side_ir_index));
break;
case 7:
store_illuminated_raw_ir_values();
sprintf(bottomline,"SIR%dR:%d",side_ir_index+1,get_illuminated_raw_ir_value(side_ir_index));
break;
case 8:
sprintf(bottomline,"SIR%dD:%3.1f",side_ir_index+1,0.0);
break;
case 9:
if(ultrasonic_distance_updated == 1) {
sprintf(bottomline,"USONIC:%3dcm",ultrasonic_distance);
} else sprintf(bottomline,"USONIC:---------");
update_ultrasonic_measure();
break;
case 10:
sprintf(bottomline,"EXIT");
break;
}
break;
case 2:
strcpy(topline,"--MOTORS MENU---");
switch(sub_menu) {
case 0:
sprintf(bottomline,"LEFT: %d%%", left_speed);
break;
case 1:
sprintf(bottomline,"RIGHT: %d%%", right_speed);
break;
case 2:
char both_mode_string[16];
switch(both_motor_mode) {
case 0:
strcpy(both_mode_string,"OFF");
break;
case 1:
strcpy(both_mode_string,"BRAKE");
break;
case 2:
strcpy(both_mode_string,"+50%");
break;
case 3:
strcpy(both_mode_string,"+100%");
break;
case 4:
strcpy(both_mode_string,"-50%");
break;
case 5:
strcpy(both_mode_string,"-100%");
break;
}
sprintf(bottomline,"BOTH TO %s",both_mode_string);
break;
case 3:
sprintf(bottomline,"EXIT");
break;
}
break;
case 3:
strcpy(topline,"---RADIO MENU---");
switch(sub_menu) {
case 0:
sprintf(bottomline,"EXIT");
break;
}
break;
case 4:
strcpy(topline,"---INFO MENU----");
switch(sub_menu) {
case 0:
sprintf(bottomline,"ROBOT ID: %d",robot_id);
break;
case 1:
sprintf(bottomline,"SOFTWARE: %1.2f",SOFTWARE_VERSION_CODE);
break;
case 2:
if(firmware_version > 0) sprintf(bottomline,"FIRMWARE: %1.2f",firmware_version);
else sprintf(bottomline,"FIRMWARE: ?????");
break;
case 3:
sprintf(bottomline,"EXIT");
break;
}
break;
case 5:
strcpy(topline,"---CODE DEMOS---");
switch(sub_menu) {
case 0:
sprintf(bottomline,"LINE FOLLOW");
break;
case 1:
sprintf(bottomline,"OBST. AVOID");
break;
case 2:
sprintf(bottomline,"COLOUR SPIN");
break;
case 3:
sprintf(bottomline,"STRESS TEST");
break;
case 4:
sprintf(bottomline,"EXIT");
break;
}
break;
case 6:
strcpy(topline,"");
break;
}
break;
}
display.write_string(topline);
display.set_position(1,0);
display.write_string(bottomline);
if(top_menu == 1 && level == 1) {
demo_event.attach(&demo_event_thread, 0.25);
}
}
void start_obstacle_demo()
{
display.set_backlight_brightness(0);
time_out = 0.25f;
demo_timer.start();
state = 0;
speed = 0;
led_step = 0;
demo_running = 1;
demo_timeout.attach_us(&obstacle_demo_cycle,1000);
}
void start_stress_demo()
{
display.set_backlight_brightness(0.25);
display.write_string("STRESS TEST");
display.set_position(1,0);
display.write_string("----25%----");
time_out = 0.04f;
demo_timer.start();
state = 0;
speed = 0;
stress_step = 0;
spin_step = 0;
demo_running = 1;
demo_timeout.attach_us(&stress_demo_cycle,1000);
}
void start_spinning_demo()
{
display.set_backlight_brightness(0);
time_out = 0.0f;
demo_timer.start();
state = 0;
speed = 0;
led_step = 0;
spin_step = 0;
demo_running = 1;
demo_timeout.attach_us(&spinning_demo_cycle,1000);
}
void stress_demo_cycle()
{
if(demo_timer.read() > time_out) {
float pct = 0.25 + (0.25 * stress_step);
switch(state) {
case 0:
if(spin_step % 2 == 0) {
forward(pct);
set_leds(0xFF,0xFF);
} else {
backward(pct);
set_leds(0,0xFF);
}
spin_step ++;
if(spin_step > 199) {
state ++;
spin_step = 0;
}
break;
case 1:
if(stress_step < 3) stress_step ++;
float pct = 0.25 + (0.25 * stress_step);
display.set_backlight_brightness(pct);
display.set_position(1,0);
switch(stress_step) {
case 1:
display.write_string("----50%----");
break;
case 2:
display.write_string("----75%----");
break;
case 3:
display.write_string("---100%----");
break;
}
state = 0;
break;
}
demo_timer.reset();
}
if(demo_running == 1)demo_timeout.attach_us(&stress_demo_cycle,500);
else {
stop();
display.set_backlight_brightness(bl_brightness * 0.01f);
}
}
void spinning_demo_cycle()
{
if(demo_timer.read() > time_out) {
switch(state) {
case 0: //Robot is stopped
set_leds(0,0xFF);
set_center_led(1,1);
speed = 0.1f;
brake();
time_out = 0.5;
state = 1;
led_step = 0;
break;
case 1: //Motor is turning right, accelerating
time_out = 0.1;
set_center_led(2,1);
switch(led_step) {
case 0:
set_leds(0x01,0);
break;
case 1:
set_leds(0x02,0);
break;
case 2:
set_leds(0x04,0);
break;
case 3:
set_leds(0x08,0);
break;
case 4:
set_leds(0x10,0);
break;
case 5:
set_leds(0x20,0);
break;
case 6:
set_leds(0x40,0);
break;
case 7:
set_leds(0x80,0);
break;
}
led_step ++;
if(led_step == 8) led_step =0;
if(speed < 1) {
speed += 0.0125;
turn(speed);
} else {
state = 2;
spin_step = 0;
led_step =0;
}
break;
case 2: //Motor is turning right, full speed
set_center_led(3,1);
switch(led_step) {
case 0:
set_leds(0x33,0x33);
break;
case 1:
set_leds(0x66,0x66);
break;
case 2:
set_leds(0xCC,0xCC);
break;
case 3:
set_leds(0x99,0x99);
break;
}
led_step ++;
if(led_step == 4) led_step = 0;
spin_step ++;
if(spin_step == 40) {
state = 3;
led_step = 0;
}
break;
case 3: //Motor is turning right, decelerating
set_center_led(2,1);
switch(led_step) {
case 0:
set_leds(0x01,0);
break;
case 1:
set_leds(0x02,0);
break;
case 2:
set_leds(0x04,0);
break;
case 3:
set_leds(0x08,0);
break;
case 4:
set_leds(0x10,0);
break;
case 5:
set_leds(0x20,0);
break;
case 6:
set_leds(0x40,0);
break;
case 7:
set_leds(0x80,0);
break;
}
if(led_step == 0) led_step =8;
led_step --;
if(speed > 0.1) {
speed -= 0.025;
turn(speed);
} else {
state = 4;
spin_step = 0;
led_step =0;
}
break;
case 4: //Robot is stopped
set_leds(0,0xFF);
set_center_led(1,1);
speed = 0.1f;
brake();
time_out = 0.5;
led_step =0;
state = 5;
break;
case 5: //Motor is turning left, accelerating
time_out = 0.1;
set_center_led(2,1);
switch(led_step) {
case 0:
set_leds(0x01,0);
break;
case 1:
set_leds(0x02,0);
break;
case 2:
set_leds(0x04,0);
break;
case 3:
set_leds(0x08,0);
break;
case 4:
set_leds(0x10,0);
break;
case 5:
set_leds(0x20,0);
break;
case 6:
set_leds(0x40,0);
break;
case 7:
set_leds(0x80,0);
break;
}
if(led_step == 0) led_step =8;
led_step --;
if(speed < 1) {
speed += 0.0125;
turn(-speed);
} else {
state = 6;
spin_step = 0;
led_step = 0;
}
break;
case 6: //Motor is turning left, full speed
set_center_led(3,1);
switch(led_step) {
case 0:
set_leds(0x33,0x33);
break;
case 1:
set_leds(0x66,0x66);
break;
case 2:
set_leds(0xCC,0xCC);
break;
case 3:
set_leds(0x99,0x99);
break;
}
if(led_step == 0) led_step = 4;
led_step --;
spin_step ++;
if(spin_step == 40) {
state = 7;
led_step = 0;
}
break;
case 7: //Motor is turning left, decelerating
set_center_led(2,1);
switch(led_step) {
case 0:
set_leds(0x01,0);
break;
case 1:
set_leds(0x02,0);
break;
case 2:
set_leds(0x04,0);
break;
case 3:
set_leds(0x08,0);
break;
case 4:
set_leds(0x10,0);
break;
case 5:
set_leds(0x20,0);
break;
case 6:
set_leds(0x40,0);
break;
case 7:
set_leds(0x80,0);
break;
}
led_step ++;
if(led_step == 8) led_step =0;
if(speed > 0.1) {
speed -= 0.025;
turn(-speed);
} else {
state = 0;
spin_step = 0;
led_step = 0;
}
break;
}
demo_timer.reset();
}
if(demo_running == 1)demo_timeout.attach_us(&spinning_demo_cycle,500);
else {
stop();
display.set_backlight_brightness(bl_brightness * 0.01f);
}
}
void obstacle_demo_cycle()
{
if(demo_timer.read() > time_out) {
switch(state) {
case 0: //Robot is stopped
set_leds(0,0xFF);
set_center_led(1,0.4);
speed = 0.3f;
forward(speed);
time_out = 0.05;
state = 1;
break;
case 1: { //Motor is moving forward
store_ir_values();
int front_right = read_illuminated_raw_ir_value(0);
int front_left = read_illuminated_raw_ir_value(7);
if(front_left > 400 || front_right > 400) {
brake();
time_out = 0.04;
if(front_left > front_right)state=2;
else state=3;
} else {
if(speed < 0.5) {
speed += 0.03;
forward(speed);
}
switch(led_step) {
case 0:
set_leds(0x01,0);
break;
case 1:
set_leds(0x38,0);
break;
case 2:
set_leds(0x6C,0);
break;
case 3:
set_leds(0xC6,0);
break;
case 4:
set_leds(0x83,0);
break;
}
set_center_led(2, 0.6);
led_step ++;
if(led_step == 5) led_step = 0;
}
break;
}
case 2: //Turn right
set_left_motor_speed(0.85);
set_right_motor_speed(-0.85);
time_out = 0.4;
state = 0;
set_leds(0x0E,0x0E);
set_center_led(3,0.5);
break;
case 3: //Turn left
set_left_motor_speed(-0.85);
set_right_motor_speed(0.85);
time_out = 0.4;
state = 0;
set_leds(0xE0,0xE0);
set_center_led(3,0.5);
break;
}
demo_timer.reset();
}
if(demo_running == 1)demo_timeout.attach_us(&obstacle_demo_cycle,200);
else {
stop();
display.set_backlight_brightness(bl_brightness * 0.01f);
}
}
void demo_update_leds()
{
char red = 0;
char green = 0;
for(int i=0; i<8; i++) {
if(led_state[i]==1 || led_state[i]==3) red+=(1<<i);
if(led_state[i]==2 || led_state[i]==3) green+=(1<<i);
}
set_leds(green,red);
float brightness_f = brightness / 100.0f;
set_center_led(led_state[8], brightness_f);
set_base_led(base_led_state);
}
