Psi Swarm robot library version 0.9

Fork of PsiSwarmV9 by Psi Swarm Robot

Committer:
jah128
Date:
Sun Jun 04 13:11:09 2017 +0000
Revision:
17:bf614e28668f
Parent:
16:50686c07ad07
Child:
18:9204f74069b4
Updated calibration menus, fixed some bugs in demo, create new store_line_position routine using calibrated values

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jah128 0:d6269d17c8cf 1 /* University of York Robotics Laboratory PsiSwarm Library: Demo Mode Source File
jah128 15:66be5ec52c3b 2 *
jah128 14:2f1ad77d281e 3 * Copyright 2017 University of York
jah128 6:b340a527add9 4 *
jah128 15:66be5ec52c3b 5 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
jah128 6:b340a527add9 6 * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
jah128 6:b340a527add9 7 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS
jah128 15:66be5ec52c3b 8 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
jah128 6:b340a527add9 9 * See the License for the specific language governing permissions and limitations under the License.
jah128 0:d6269d17c8cf 10 *
jah128 0:d6269d17c8cf 11 * File: demo.cpp
jah128 0:d6269d17c8cf 12 *
jah128 0:d6269d17c8cf 13 * (C) Dept. Electronics & Computer Science, University of York
jah128 0:d6269d17c8cf 14 * James Hilder, Alan Millard, Alexander Horsfield, Homero Elizondo, Jon Timmis
jah128 0:d6269d17c8cf 15 *
jah128 14:2f1ad77d281e 16 * PsiSwarm Library Version: 0.9
jah128 0:d6269d17c8cf 17 *
jah128 16:50686c07ad07 18 * Version 0.9 : Added colour sensor functions, colour sensor demo and self-test mode
jah128 8:6c92789d5f87 19 * Version 0.8 : Rewritten as OO\C++
jah128 5:3cdd1a37cdd7 20 * Version 0.7 : Updated for new MBED API
jah128 4:1c621cb8cf0d 21 * Version 0.5 : Added motor calibration menu
jah128 0:d6269d17c8cf 22 * Version 0.4 : Added PsiSwarmBasic menu
jah128 0:d6269d17c8cf 23 * Version 0.2 : Remove most the functionality from center-button push to allow all operations to be accessable from
jah128 0:d6269d17c8cf 24 * four directions alone.
jah128 0:d6269d17c8cf 25 * Added extra sensor information, added various testing demos
jah128 0:d6269d17c8cf 26 *
jah128 2:c6986ee3c7c5 27 *
jah128 14:2f1ad77d281e 28 * June 2017
jah128 0:d6269d17c8cf 29 *
jah128 0:d6269d17c8cf 30 */
jah128 0:d6269d17c8cf 31
jah128 0:d6269d17c8cf 32
jah128 0:d6269d17c8cf 33 #include "psiswarm.h"
jah128 0:d6269d17c8cf 34
jah128 0:d6269d17c8cf 35 // PID terms
jah128 0:d6269d17c8cf 36 #define LF_P_TERM 0.2
jah128 0:d6269d17c8cf 37 #define LF_I_TERM 0
jah128 0:d6269d17c8cf 38 #define LF_D_TERM 4
jah128 0:d6269d17c8cf 39
jah128 15:66be5ec52c3b 40 char quick_test = 0;
jah128 0:d6269d17c8cf 41 char top_menu = 0;
jah128 0:d6269d17c8cf 42 char sub_menu = 0;
jah128 0:d6269d17c8cf 43 char level = 0;
jah128 0:d6269d17c8cf 44 char started = 0;
jah128 0:d6269d17c8cf 45 char topline[17];
jah128 0:d6269d17c8cf 46 char bottomline[17];
jah128 0:d6269d17c8cf 47 char led_state[9];
jah128 0:d6269d17c8cf 48 char all_led_state = 0;
jah128 0:d6269d17c8cf 49 char base_led_state = 0;
jah128 0:d6269d17c8cf 50 char brightness = 20;
jah128 0:d6269d17c8cf 51 char bl_brightness = 100;
jah128 0:d6269d17c8cf 52 char base_ir_index = 0;
jah128 0:d6269d17c8cf 53 char side_ir_index = 0;
jah128 0:d6269d17c8cf 54 signed short left_speed = 0;
jah128 0:d6269d17c8cf 55 signed short right_speed = 0;
jah128 0:d6269d17c8cf 56 char both_motor_mode = 0;
jah128 0:d6269d17c8cf 57 char last_switch_pressed;
jah128 0:d6269d17c8cf 58 Timeout demo_event;
jah128 0:d6269d17c8cf 59 char handling_event = 0;
jah128 0:d6269d17c8cf 60
jah128 0:d6269d17c8cf 61 Timeout demo_timeout;
jah128 0:d6269d17c8cf 62 char demo_running = 0;
jah128 0:d6269d17c8cf 63 Timer demo_timer;
jah128 0:d6269d17c8cf 64 float time_out;
jah128 0:d6269d17c8cf 65 float speed;
jah128 0:d6269d17c8cf 66 char state;
jah128 0:d6269d17c8cf 67 char led_step = 0;
jah128 0:d6269d17c8cf 68 char spin_step = 0;
jah128 0:d6269d17c8cf 69 char stress_step = 0;
jah128 0:d6269d17c8cf 70
jah128 0:d6269d17c8cf 71
jah128 0:d6269d17c8cf 72 float lf_right;
jah128 0:d6269d17c8cf 73 float lf_left;
jah128 0:d6269d17c8cf 74 float lf_current_pos_of_line = 0.0;
jah128 0:d6269d17c8cf 75 float lf_previous_pos_of_line = 0.0;
jah128 0:d6269d17c8cf 76 float lf_derivative,lf_proportional,lf_integral = 0;
jah128 0:d6269d17c8cf 77 float lf_power;
jah128 0:d6269d17c8cf 78 float lf_speed = 0.4;
jah128 0:d6269d17c8cf 79
jah128 0:d6269d17c8cf 80
jah128 0:d6269d17c8cf 81
jah128 11:312663037b8c 82 void Demo::start_demo_mode()
jah128 0:d6269d17c8cf 83 {
jah128 12:878c6e9d9e60 84 psi.debug("- Starting Demo Mode\n");
jah128 17:bf614e28668f 85 if(use_flash_basic == 1) top_menu = 8;
jah128 17:bf614e28668f 86 if((has_base_ir == 1 && base_ir_calibration_set != 1) || (has_base_colour_sensor == 1 && base_colour_calibration_set != 1)) top_menu = 7;
jah128 0:d6269d17c8cf 87 demo_on = 1;
jah128 0:d6269d17c8cf 88 display.set_backlight_brightness(bl_brightness * 0.01f);
jah128 0:d6269d17c8cf 89 display.clear_display();
jah128 0:d6269d17c8cf 90 display.write_string("PSI SWARM SYSTEM");
jah128 0:d6269d17c8cf 91 display.set_position(1,0);
jah128 0:d6269d17c8cf 92 display.write_string(" DEMO MODE");
jah128 0:d6269d17c8cf 93 wait(0.5);
jah128 0:d6269d17c8cf 94 display.clear_display();
jah128 0:d6269d17c8cf 95 display.write_string("Use cursor to");
jah128 0:d6269d17c8cf 96 display.set_position(1,0);
jah128 0:d6269d17c8cf 97 display.write_string("navigate menus");
jah128 0:d6269d17c8cf 98 char step = 0;
jah128 0:d6269d17c8cf 99 while(demo_on) {
jah128 0:d6269d17c8cf 100 if(demo_running == 0) {
jah128 0:d6269d17c8cf 101 switch(step) {
jah128 0:d6269d17c8cf 102 case 0:
jah128 0:d6269d17c8cf 103 mbed_led1 = 1;
jah128 0:d6269d17c8cf 104 mbed_led2 = 0;
jah128 0:d6269d17c8cf 105 break;
jah128 0:d6269d17c8cf 106 case 1:
jah128 0:d6269d17c8cf 107 mbed_led2 = 1;
jah128 0:d6269d17c8cf 108 mbed_led1 = 0;
jah128 0:d6269d17c8cf 109 break;
jah128 0:d6269d17c8cf 110 }
jah128 0:d6269d17c8cf 111 step++;
jah128 0:d6269d17c8cf 112 if(step==2)step=0;
jah128 0:d6269d17c8cf 113 } else {
jah128 0:d6269d17c8cf 114 mbed_led1 = 0;
jah128 0:d6269d17c8cf 115 mbed_led2 = 0;
jah128 0:d6269d17c8cf 116 mbed_led3 = 0;
jah128 0:d6269d17c8cf 117 mbed_led4 = 0;
jah128 0:d6269d17c8cf 118 }
jah128 0:d6269d17c8cf 119 wait(0.5);
jah128 0:d6269d17c8cf 120 }
jah128 12:878c6e9d9e60 121 psi.debug("- Demo mode ended\n");
jah128 0:d6269d17c8cf 122 }
jah128 0:d6269d17c8cf 123
jah128 11:312663037b8c 124 void Demo::demo_handle_switch_event(char switch_pressed)
jah128 0:d6269d17c8cf 125 {
jah128 0:d6269d17c8cf 126 if(!handling_event) {
jah128 0:d6269d17c8cf 127 handling_event = 1;
jah128 0:d6269d17c8cf 128 last_switch_pressed = switch_pressed;
jah128 11:312663037b8c 129 demo_event.attach_us(this,&Demo::demo_event_thread, 1000);
jah128 0:d6269d17c8cf 130 }
jah128 0:d6269d17c8cf 131 }
jah128 0:d6269d17c8cf 132
jah128 11:312663037b8c 133 void Demo::demo_event_thread()
jah128 0:d6269d17c8cf 134 {
jah128 0:d6269d17c8cf 135 handling_event = 0;
jah128 0:d6269d17c8cf 136 if(started == 1) {
jah128 0:d6269d17c8cf 137 switch(last_switch_pressed) {
jah128 0:d6269d17c8cf 138 case 1: //Up pressed
jah128 0:d6269d17c8cf 139 switch(level) {
jah128 0:d6269d17c8cf 140 case 0:
jah128 15:66be5ec52c3b 141 if(top_menu != 9 && top_menu!= 0) {
jah128 0:d6269d17c8cf 142 level++;
jah128 0:d6269d17c8cf 143 sub_menu = 0;
jah128 0:d6269d17c8cf 144 } else {
jah128 15:66be5ec52c3b 145 if(top_menu == 0) {
jah128 15:66be5ec52c3b 146 toggle_quick_test();
jah128 15:66be5ec52c3b 147 } else {
jah128 15:66be5ec52c3b 148 demo_on = 0;
jah128 15:66be5ec52c3b 149 user_code_running = user_code_restore_mode;
jah128 15:66be5ec52c3b 150 }
jah128 0:d6269d17c8cf 151 }
jah128 0:d6269d17c8cf 152 break;
jah128 0:d6269d17c8cf 153 case 1:
jah128 0:d6269d17c8cf 154 switch(top_menu) {
jah128 15:66be5ec52c3b 155 case 8: // PsiBasic Menu
jah128 0:d6269d17c8cf 156 if(sub_menu == psi_basic_file_count) level = 0;
jah128 0:d6269d17c8cf 157 break;
jah128 17:bf614e28668f 158 case 1: //LED Menu
jah128 0:d6269d17c8cf 159 if(sub_menu < 9) {
jah128 0:d6269d17c8cf 160 if(led_state[sub_menu] == 0) led_state[sub_menu] = 3;
jah128 0:d6269d17c8cf 161 else led_state[sub_menu]--;
jah128 0:d6269d17c8cf 162 demo_update_leds();
jah128 0:d6269d17c8cf 163 }
jah128 0:d6269d17c8cf 164 if(sub_menu == 9) {
jah128 0:d6269d17c8cf 165 if(all_led_state == 0) all_led_state = 3;
jah128 0:d6269d17c8cf 166 else all_led_state--;
jah128 0:d6269d17c8cf 167 for(int i=0; i<9; i++) {
jah128 0:d6269d17c8cf 168 led_state[i]=all_led_state;
jah128 0:d6269d17c8cf 169 }
jah128 0:d6269d17c8cf 170 demo_update_leds();
jah128 0:d6269d17c8cf 171 }
jah128 0:d6269d17c8cf 172 if(sub_menu == 10) {
jah128 0:d6269d17c8cf 173 base_led_state = 1 - base_led_state;
jah128 0:d6269d17c8cf 174 demo_update_leds();
jah128 0:d6269d17c8cf 175 }
jah128 0:d6269d17c8cf 176 if(sub_menu == 11) {
jah128 0:d6269d17c8cf 177 switch(brightness) {
jah128 0:d6269d17c8cf 178 case 100:
jah128 0:d6269d17c8cf 179 brightness = 50;
jah128 0:d6269d17c8cf 180 break;
jah128 0:d6269d17c8cf 181 case 2:
jah128 0:d6269d17c8cf 182 brightness = 1;
jah128 0:d6269d17c8cf 183 break;
jah128 0:d6269d17c8cf 184 case 5:
jah128 0:d6269d17c8cf 185 brightness = 2;
jah128 0:d6269d17c8cf 186 break;
jah128 0:d6269d17c8cf 187 case 10:
jah128 0:d6269d17c8cf 188 brightness = 5;
jah128 0:d6269d17c8cf 189 break;
jah128 0:d6269d17c8cf 190 case 20:
jah128 0:d6269d17c8cf 191 brightness = 10;
jah128 0:d6269d17c8cf 192 break;
jah128 0:d6269d17c8cf 193 case 50:
jah128 0:d6269d17c8cf 194 brightness = 20;
jah128 0:d6269d17c8cf 195 break;
jah128 0:d6269d17c8cf 196 }
jah128 0:d6269d17c8cf 197 demo_update_leds();
jah128 0:d6269d17c8cf 198 }
jah128 0:d6269d17c8cf 199 if(sub_menu == 12) {
jah128 0:d6269d17c8cf 200 if(bl_brightness > 0) bl_brightness-=10;
jah128 0:d6269d17c8cf 201 display.set_backlight_brightness(bl_brightness * 0.01f);
jah128 0:d6269d17c8cf 202 }
jah128 0:d6269d17c8cf 203 if(sub_menu == 13) level = 0;
jah128 0:d6269d17c8cf 204 break;
jah128 15:66be5ec52c3b 205 case 2: // Sensors Menu
jah128 17:bf614e28668f 206 if(sub_menu == 4 || sub_menu == 5 || sub_menu==6) {
jah128 0:d6269d17c8cf 207 if(base_ir_index == 0) base_ir_index = 4;
jah128 0:d6269d17c8cf 208 else base_ir_index --;
jah128 0:d6269d17c8cf 209 }
jah128 17:bf614e28668f 210 if(sub_menu > 6 && sub_menu < 10) {
jah128 0:d6269d17c8cf 211 if(side_ir_index == 0) side_ir_index = 7;
jah128 0:d6269d17c8cf 212 else side_ir_index --;
jah128 0:d6269d17c8cf 213 }
jah128 17:bf614e28668f 214 if(sub_menu == 13) level = 0;
jah128 0:d6269d17c8cf 215 break;
jah128 15:66be5ec52c3b 216 case 3: // Motor Menu
jah128 0:d6269d17c8cf 217 if(sub_menu == 0) {
jah128 0:d6269d17c8cf 218 left_speed += 5;
jah128 0:d6269d17c8cf 219 if(left_speed > 100) left_speed = 100;
jah128 8:6c92789d5f87 220 motors.set_left_motor_speed(left_speed / 100.0f);
jah128 0:d6269d17c8cf 221 }
jah128 0:d6269d17c8cf 222 if(sub_menu == 1) {
jah128 0:d6269d17c8cf 223 right_speed += 5;
jah128 0:d6269d17c8cf 224 if(right_speed > 100) right_speed = 100;
jah128 8:6c92789d5f87 225 motors.set_right_motor_speed(right_speed / 100.0f);
jah128 0:d6269d17c8cf 226 }
jah128 0:d6269d17c8cf 227 if(sub_menu == 2) {
jah128 0:d6269d17c8cf 228 if(both_motor_mode == 0) both_motor_mode=5;
jah128 0:d6269d17c8cf 229 else both_motor_mode--;
jah128 0:d6269d17c8cf 230 switch(both_motor_mode) {
jah128 0:d6269d17c8cf 231 case 0:
jah128 8:6c92789d5f87 232 motors.stop();
jah128 0:d6269d17c8cf 233 break;
jah128 0:d6269d17c8cf 234 case 1:
jah128 8:6c92789d5f87 235 motors.brake();
jah128 0:d6269d17c8cf 236 break;
jah128 0:d6269d17c8cf 237 case 2:
jah128 8:6c92789d5f87 238 motors.forward(0.5);
jah128 0:d6269d17c8cf 239 break;
jah128 0:d6269d17c8cf 240 case 3:
jah128 8:6c92789d5f87 241 motors.forward(1);
jah128 0:d6269d17c8cf 242 break;
jah128 0:d6269d17c8cf 243 case 4:
jah128 8:6c92789d5f87 244 motors.backward(0.5);
jah128 0:d6269d17c8cf 245 break;
jah128 0:d6269d17c8cf 246 case 5:
jah128 8:6c92789d5f87 247 motors.backward(1.0);
jah128 0:d6269d17c8cf 248 break;
jah128 0:d6269d17c8cf 249 }
jah128 0:d6269d17c8cf 250 }
jah128 0:d6269d17c8cf 251 if(sub_menu == 3) {
jah128 0:d6269d17c8cf 252 level = 0;
jah128 0:d6269d17c8cf 253 }
jah128 0:d6269d17c8cf 254 break;
jah128 15:66be5ec52c3b 255 case 4: // Radio Menu
jah128 0:d6269d17c8cf 256 if(sub_menu == 0) level = 0;
jah128 0:d6269d17c8cf 257 break;
jah128 15:66be5ec52c3b 258 case 5: // Info Menu
jah128 0:d6269d17c8cf 259 if(sub_menu == 6) level = 0;
jah128 0:d6269d17c8cf 260 break;
jah128 17:bf614e28668f 261 case 7: // Calibration Menu
jah128 17:bf614e28668f 262 if(sub_menu == 0) sensors.calibrate_base_sensors();
jah128 17:bf614e28668f 263 if(sub_menu == 2) level = 0;
jah128 17:bf614e28668f 264 break;
jah128 15:66be5ec52c3b 265 case 6: // Demo Menu
jah128 0:d6269d17c8cf 266 if(sub_menu == 0) {
jah128 0:d6269d17c8cf 267 if(demo_running == 0) {
jah128 0:d6269d17c8cf 268 start_line_demo();
jah128 0:d6269d17c8cf 269 } else {
jah128 0:d6269d17c8cf 270 demo_running = 0;
jah128 0:d6269d17c8cf 271 display.set_backlight_brightness(bl_brightness * 0.01f);
jah128 8:6c92789d5f87 272 motors.stop();
jah128 0:d6269d17c8cf 273 }
jah128 0:d6269d17c8cf 274 }
jah128 0:d6269d17c8cf 275 if(sub_menu == 1) {
jah128 0:d6269d17c8cf 276 if(demo_running == 0) {
jah128 0:d6269d17c8cf 277 start_obstacle_demo();
jah128 0:d6269d17c8cf 278 } else {
jah128 0:d6269d17c8cf 279 demo_running = 0;
jah128 0:d6269d17c8cf 280 display.set_backlight_brightness(bl_brightness * 0.01f);
jah128 8:6c92789d5f87 281 motors.stop();
jah128 0:d6269d17c8cf 282 }
jah128 0:d6269d17c8cf 283 }
jah128 0:d6269d17c8cf 284 if(sub_menu == 2) {
jah128 0:d6269d17c8cf 285 if(demo_running == 0) {
jah128 0:d6269d17c8cf 286 start_spinning_demo();
jah128 0:d6269d17c8cf 287 } else {
jah128 0:d6269d17c8cf 288 demo_running = 0;
jah128 0:d6269d17c8cf 289 display.set_backlight_brightness(bl_brightness * 0.01f);
jah128 8:6c92789d5f87 290 motors.stop();
jah128 0:d6269d17c8cf 291 }
jah128 0:d6269d17c8cf 292 }
jah128 0:d6269d17c8cf 293 if(sub_menu == 3) {
jah128 0:d6269d17c8cf 294 if(demo_running == 0) {
jah128 0:d6269d17c8cf 295 start_stress_demo();
jah128 0:d6269d17c8cf 296 } else {
jah128 0:d6269d17c8cf 297 demo_running = 0;
jah128 0:d6269d17c8cf 298 display.set_backlight_brightness(bl_brightness * 0.01f);
jah128 8:6c92789d5f87 299 motors.stop();
jah128 0:d6269d17c8cf 300 }
jah128 0:d6269d17c8cf 301 }
jah128 16:50686c07ad07 302 if(sub_menu == 4) {
jah128 16:50686c07ad07 303 if(demo_running == 0) {
jah128 16:50686c07ad07 304 start_colour_demo();
jah128 16:50686c07ad07 305 } else {
jah128 16:50686c07ad07 306 demo_running = 0;
jah128 16:50686c07ad07 307 display.set_backlight_brightness(bl_brightness * 0.01f);
jah128 16:50686c07ad07 308 motors.stop();
jah128 16:50686c07ad07 309 }
jah128 16:50686c07ad07 310 }
jah128 16:50686c07ad07 311 if(sub_menu == 5) level = 0;
jah128 0:d6269d17c8cf 312 break;
jah128 0:d6269d17c8cf 313 }
jah128 0:d6269d17c8cf 314 break;
jah128 0:d6269d17c8cf 315 }
jah128 0:d6269d17c8cf 316 break;
jah128 0:d6269d17c8cf 317 case 2: //Down pressed
jah128 0:d6269d17c8cf 318 switch(level) {
jah128 0:d6269d17c8cf 319 case 0:
jah128 15:66be5ec52c3b 320 if(top_menu != 9 && top_menu != 0) {
jah128 0:d6269d17c8cf 321 level++;
jah128 0:d6269d17c8cf 322 sub_menu = 0;
jah128 0:d6269d17c8cf 323 } else {
jah128 15:66be5ec52c3b 324 if(top_menu == 0) {
jah128 15:66be5ec52c3b 325 toggle_quick_test();
jah128 15:66be5ec52c3b 326 } else {
jah128 15:66be5ec52c3b 327 demo_on = 0;
jah128 15:66be5ec52c3b 328 user_code_running = user_code_restore_mode;
jah128 15:66be5ec52c3b 329 }
jah128 0:d6269d17c8cf 330 }
jah128 0:d6269d17c8cf 331 break;
jah128 0:d6269d17c8cf 332 case 1:
jah128 0:d6269d17c8cf 333 switch(top_menu) {
jah128 15:66be5ec52c3b 334 case 8: // PsiBasic Menu
jah128 0:d6269d17c8cf 335 if(sub_menu == psi_basic_file_count) level = 0;
jah128 0:d6269d17c8cf 336 break;
jah128 15:66be5ec52c3b 337 case 1: //LED Menu
jah128 0:d6269d17c8cf 338 if(sub_menu < 9) {
jah128 0:d6269d17c8cf 339 led_state[sub_menu]++;
jah128 0:d6269d17c8cf 340 if(led_state[sub_menu] == 4) led_state[sub_menu] = 0;
jah128 0:d6269d17c8cf 341 demo_update_leds();
jah128 0:d6269d17c8cf 342 }
jah128 0:d6269d17c8cf 343 if(sub_menu == 9) {
jah128 0:d6269d17c8cf 344 all_led_state++;
jah128 0:d6269d17c8cf 345 if(all_led_state == 4) all_led_state = 0;
jah128 0:d6269d17c8cf 346 for(int i=0; i<9; i++) {
jah128 0:d6269d17c8cf 347 led_state[i]=all_led_state;
jah128 0:d6269d17c8cf 348 }
jah128 0:d6269d17c8cf 349 demo_update_leds();
jah128 0:d6269d17c8cf 350 }
jah128 0:d6269d17c8cf 351 if(sub_menu == 10) {
jah128 0:d6269d17c8cf 352 base_led_state = 1 - base_led_state;
jah128 0:d6269d17c8cf 353 demo_update_leds();
jah128 0:d6269d17c8cf 354 }
jah128 0:d6269d17c8cf 355 if(sub_menu == 11) {
jah128 0:d6269d17c8cf 356 switch(brightness) {
jah128 0:d6269d17c8cf 357 case 1:
jah128 0:d6269d17c8cf 358 brightness = 2;
jah128 0:d6269d17c8cf 359 break;
jah128 0:d6269d17c8cf 360 case 2:
jah128 0:d6269d17c8cf 361 brightness = 5;
jah128 0:d6269d17c8cf 362 break;
jah128 0:d6269d17c8cf 363 case 5:
jah128 0:d6269d17c8cf 364 brightness = 10;
jah128 0:d6269d17c8cf 365 break;
jah128 0:d6269d17c8cf 366 case 10:
jah128 0:d6269d17c8cf 367 brightness = 20;
jah128 0:d6269d17c8cf 368 break;
jah128 0:d6269d17c8cf 369 case 20:
jah128 0:d6269d17c8cf 370 brightness = 50;
jah128 0:d6269d17c8cf 371 break;
jah128 0:d6269d17c8cf 372 case 50:
jah128 0:d6269d17c8cf 373 brightness = 100;
jah128 0:d6269d17c8cf 374 break;
jah128 0:d6269d17c8cf 375 }
jah128 0:d6269d17c8cf 376 demo_update_leds();
jah128 0:d6269d17c8cf 377 }
jah128 0:d6269d17c8cf 378
jah128 0:d6269d17c8cf 379 if(sub_menu == 12) {
jah128 0:d6269d17c8cf 380 if(bl_brightness < 100) bl_brightness+=10;
jah128 0:d6269d17c8cf 381 display.set_backlight_brightness(bl_brightness * 0.01f);
jah128 0:d6269d17c8cf 382 }
jah128 0:d6269d17c8cf 383 if(sub_menu == 13) level = 0;
jah128 0:d6269d17c8cf 384
jah128 0:d6269d17c8cf 385 break;
jah128 15:66be5ec52c3b 386 case 2: // Sensors Menu
jah128 17:bf614e28668f 387 if(sub_menu == 4 || sub_menu == 5 || sub_menu == 6) {
jah128 0:d6269d17c8cf 388 if(base_ir_index == 4) base_ir_index = 0;
jah128 0:d6269d17c8cf 389 else base_ir_index ++;
jah128 0:d6269d17c8cf 390 }
jah128 17:bf614e28668f 391 if(sub_menu > 6 && sub_menu < 10) {
jah128 0:d6269d17c8cf 392 if(side_ir_index == 7) side_ir_index = 0;
jah128 0:d6269d17c8cf 393 else side_ir_index ++;
jah128 0:d6269d17c8cf 394 }
jah128 17:bf614e28668f 395 if(sub_menu == 13) level = 0;
jah128 0:d6269d17c8cf 396 break;
jah128 15:66be5ec52c3b 397 case 3: // Motor Menu
jah128 0:d6269d17c8cf 398 if(sub_menu == 0) {
jah128 0:d6269d17c8cf 399 left_speed -= 5;
jah128 0:d6269d17c8cf 400 if(left_speed < -100) left_speed = -100;
jah128 8:6c92789d5f87 401 motors.set_left_motor_speed(left_speed / 100.0f);
jah128 0:d6269d17c8cf 402 }
jah128 0:d6269d17c8cf 403 if(sub_menu == 1) {
jah128 0:d6269d17c8cf 404 right_speed -= 5;
jah128 0:d6269d17c8cf 405 if(right_speed < -100) right_speed = -100;
jah128 8:6c92789d5f87 406 motors.set_right_motor_speed(right_speed / 100.0f);
jah128 0:d6269d17c8cf 407 }
jah128 0:d6269d17c8cf 408 if(sub_menu == 2) {
jah128 0:d6269d17c8cf 409 both_motor_mode++;
jah128 0:d6269d17c8cf 410 if(both_motor_mode == 6) both_motor_mode=0;
jah128 0:d6269d17c8cf 411 switch(both_motor_mode) {
jah128 0:d6269d17c8cf 412 case 0:
jah128 8:6c92789d5f87 413 motors.stop();
jah128 0:d6269d17c8cf 414 break;
jah128 0:d6269d17c8cf 415 case 1:
jah128 8:6c92789d5f87 416 motors.brake();
jah128 0:d6269d17c8cf 417 break;
jah128 0:d6269d17c8cf 418 case 2:
jah128 8:6c92789d5f87 419 motors.forward(0.5);
jah128 0:d6269d17c8cf 420 break;
jah128 0:d6269d17c8cf 421 case 3:
jah128 8:6c92789d5f87 422 motors.forward(1);
jah128 0:d6269d17c8cf 423 break;
jah128 0:d6269d17c8cf 424 case 4:
jah128 8:6c92789d5f87 425 motors.backward(0.5);
jah128 0:d6269d17c8cf 426 break;
jah128 0:d6269d17c8cf 427 case 5:
jah128 8:6c92789d5f87 428 motors.backward(1.0);
jah128 0:d6269d17c8cf 429 break;
jah128 0:d6269d17c8cf 430 }
jah128 0:d6269d17c8cf 431 }
jah128 0:d6269d17c8cf 432 if(sub_menu == 3) {
jah128 0:d6269d17c8cf 433 level = 0;
jah128 0:d6269d17c8cf 434 }
jah128 0:d6269d17c8cf 435 break;
jah128 15:66be5ec52c3b 436 case 4: // Radio Menu
jah128 0:d6269d17c8cf 437 if(sub_menu == 0) level = 0;
jah128 0:d6269d17c8cf 438 break;
jah128 15:66be5ec52c3b 439 case 5: // Info Menu
jah128 0:d6269d17c8cf 440 if(sub_menu == 6) level = 0;
jah128 0:d6269d17c8cf 441 break;
jah128 17:bf614e28668f 442 case 7: // Calibration Menu
jah128 17:bf614e28668f 443 if(sub_menu == 0) sensors.calibrate_base_sensors();
jah128 17:bf614e28668f 444 if(sub_menu == 2) level = 0;
jah128 17:bf614e28668f 445 break;
jah128 15:66be5ec52c3b 446 case 6: // Demo Menu
jah128 0:d6269d17c8cf 447 if(sub_menu == 0) {
jah128 0:d6269d17c8cf 448 if(demo_running == 0) {
jah128 0:d6269d17c8cf 449 start_line_demo();
jah128 0:d6269d17c8cf 450 } else {
jah128 0:d6269d17c8cf 451 demo_running = 0;
jah128 0:d6269d17c8cf 452 display.set_backlight_brightness(bl_brightness * 0.01f);
jah128 8:6c92789d5f87 453 motors.stop();
jah128 0:d6269d17c8cf 454 }
jah128 0:d6269d17c8cf 455 }
jah128 0:d6269d17c8cf 456 if(sub_menu == 1) {
jah128 0:d6269d17c8cf 457 if(demo_running == 0) {
jah128 0:d6269d17c8cf 458 start_obstacle_demo();
jah128 0:d6269d17c8cf 459 } else {
jah128 0:d6269d17c8cf 460 demo_running = 0;
jah128 0:d6269d17c8cf 461 display.set_backlight_brightness(bl_brightness * 0.01f);
jah128 8:6c92789d5f87 462 motors.stop();
jah128 0:d6269d17c8cf 463
jah128 0:d6269d17c8cf 464 }
jah128 0:d6269d17c8cf 465 }
jah128 0:d6269d17c8cf 466 if(sub_menu == 2) {
jah128 0:d6269d17c8cf 467 if(demo_running == 0) {
jah128 0:d6269d17c8cf 468 start_spinning_demo();
jah128 0:d6269d17c8cf 469 } else {
jah128 0:d6269d17c8cf 470 demo_running = 0;
jah128 0:d6269d17c8cf 471 display.set_backlight_brightness(bl_brightness * 0.01f);
jah128 8:6c92789d5f87 472 motors.stop();
jah128 0:d6269d17c8cf 473 }
jah128 0:d6269d17c8cf 474 }
jah128 0:d6269d17c8cf 475 if(sub_menu == 3) {
jah128 0:d6269d17c8cf 476 if(demo_running == 0) {
jah128 0:d6269d17c8cf 477 start_stress_demo();
jah128 0:d6269d17c8cf 478 } else {
jah128 0:d6269d17c8cf 479 demo_running = 0;
jah128 0:d6269d17c8cf 480 display.set_backlight_brightness(bl_brightness * 0.01f);
jah128 8:6c92789d5f87 481 motors.stop();
jah128 0:d6269d17c8cf 482 }
jah128 0:d6269d17c8cf 483 }
jah128 16:50686c07ad07 484 if(sub_menu == 4) {
jah128 16:50686c07ad07 485 if(demo_running == 0) {
jah128 16:50686c07ad07 486 start_colour_demo();
jah128 16:50686c07ad07 487 } else {
jah128 16:50686c07ad07 488 demo_running = 0;
jah128 16:50686c07ad07 489 display.set_backlight_brightness(bl_brightness * 0.01f);
jah128 16:50686c07ad07 490 motors.stop();
jah128 16:50686c07ad07 491 }
jah128 16:50686c07ad07 492 }
jah128 16:50686c07ad07 493 if(sub_menu == 5) level = 0;
jah128 0:d6269d17c8cf 494 break;
jah128 0:d6269d17c8cf 495 }
jah128 0:d6269d17c8cf 496 break;
jah128 0:d6269d17c8cf 497 }
jah128 0:d6269d17c8cf 498 break;
jah128 0:d6269d17c8cf 499 case 4: //Left pressed
jah128 0:d6269d17c8cf 500 switch(level) {
jah128 0:d6269d17c8cf 501 case 0:
jah128 0:d6269d17c8cf 502 if(top_menu == 0) {
jah128 15:66be5ec52c3b 503 top_menu = 9;
jah128 15:66be5ec52c3b 504 } else {
jah128 17:bf614e28668f 505 top_menu --;
jah128 15:66be5ec52c3b 506 if(use_flash_basic == 0 && top_menu == 8) top_menu = 7;
jah128 4:1c621cb8cf0d 507 }
jah128 0:d6269d17c8cf 508 break;
jah128 0:d6269d17c8cf 509 case 1:
jah128 0:d6269d17c8cf 510 switch(top_menu) {
jah128 15:66be5ec52c3b 511 case 1: //LED Menu
jah128 0:d6269d17c8cf 512 if(sub_menu == 0) sub_menu = 13;
jah128 0:d6269d17c8cf 513 else sub_menu --;
jah128 0:d6269d17c8cf 514 break;
jah128 15:66be5ec52c3b 515 case 2: //Sensors Menu
jah128 17:bf614e28668f 516 if(sub_menu == 0) sub_menu = 13;
jah128 0:d6269d17c8cf 517 else sub_menu --;
jah128 0:d6269d17c8cf 518 break;
jah128 0:d6269d17c8cf 519
jah128 15:66be5ec52c3b 520 case 3: //Motor Menu
jah128 0:d6269d17c8cf 521 if(sub_menu == 0) sub_menu = 3;
jah128 0:d6269d17c8cf 522 else sub_menu --;
jah128 0:d6269d17c8cf 523 break;
jah128 15:66be5ec52c3b 524 case 5: //Info Menu
jah128 0:d6269d17c8cf 525 if(sub_menu == 0) sub_menu = 6;
jah128 0:d6269d17c8cf 526 else sub_menu --;
jah128 0:d6269d17c8cf 527 break;
jah128 15:66be5ec52c3b 528 case 6: //Demo Menu
jah128 16:50686c07ad07 529 if(sub_menu == 0) sub_menu = 5;
jah128 0:d6269d17c8cf 530 else sub_menu --;
jah128 0:d6269d17c8cf 531 break;
jah128 15:66be5ec52c3b 532 case 7: //Calibrate Menu
jah128 4:1c621cb8cf0d 533 if(sub_menu == 0) sub_menu = 2;
jah128 4:1c621cb8cf0d 534 else sub_menu --;
jah128 4:1c621cb8cf0d 535 break;
jah128 15:66be5ec52c3b 536 case 8: //PsiBasic Menu
jah128 0:d6269d17c8cf 537 if(sub_menu == 0) sub_menu = psi_basic_file_count;
jah128 0:d6269d17c8cf 538 else sub_menu --;
jah128 0:d6269d17c8cf 539 }
jah128 0:d6269d17c8cf 540 break;
jah128 0:d6269d17c8cf 541
jah128 0:d6269d17c8cf 542 }
jah128 0:d6269d17c8cf 543 break;
jah128 0:d6269d17c8cf 544 case 8: //Right pressed
jah128 0:d6269d17c8cf 545 switch(level) {
jah128 0:d6269d17c8cf 546 case 0:
jah128 0:d6269d17c8cf 547 top_menu ++;
jah128 17:bf614e28668f 548 if(top_menu == 8 && use_flash_basic == 0) top_menu = 9;
jah128 17:bf614e28668f 549 if((top_menu) > 9) top_menu = 0;
jah128 0:d6269d17c8cf 550 break;
jah128 0:d6269d17c8cf 551 case 1:
jah128 0:d6269d17c8cf 552 switch(top_menu) {
jah128 15:66be5ec52c3b 553 case 1: //LED Menu
jah128 0:d6269d17c8cf 554 if(sub_menu == 13) sub_menu = 0;
jah128 0:d6269d17c8cf 555 else sub_menu ++;
jah128 0:d6269d17c8cf 556 break;
jah128 15:66be5ec52c3b 557 case 2: //Sensors Menu
jah128 17:bf614e28668f 558 if(sub_menu == 13) sub_menu = 0;
jah128 0:d6269d17c8cf 559 else sub_menu ++;
jah128 0:d6269d17c8cf 560 break;
jah128 15:66be5ec52c3b 561 case 3: //Motor Menu
jah128 0:d6269d17c8cf 562 if(sub_menu == 3) sub_menu = 0;
jah128 0:d6269d17c8cf 563 else sub_menu ++;
jah128 0:d6269d17c8cf 564 break;
jah128 15:66be5ec52c3b 565 case 5: //Info Menu
jah128 0:d6269d17c8cf 566 if(sub_menu == 6) sub_menu = 0;
jah128 0:d6269d17c8cf 567 else sub_menu ++;
jah128 0:d6269d17c8cf 568 break;
jah128 15:66be5ec52c3b 569 case 6: //Demo Menu
jah128 16:50686c07ad07 570 if(sub_menu == 5) sub_menu = 0;
jah128 0:d6269d17c8cf 571 else sub_menu ++;
jah128 0:d6269d17c8cf 572 break;
jah128 15:66be5ec52c3b 573 case 7: //Calibrate Menu
jah128 4:1c621cb8cf0d 574 if(sub_menu == 2) sub_menu = 0;
jah128 4:1c621cb8cf0d 575 else sub_menu ++;
jah128 4:1c621cb8cf0d 576 break;
jah128 15:66be5ec52c3b 577 case 8: //PsiBasic Menu
jah128 0:d6269d17c8cf 578 if(sub_menu == psi_basic_file_count) sub_menu = 0;
jah128 0:d6269d17c8cf 579 else sub_menu ++;
jah128 0:d6269d17c8cf 580 }
jah128 0:d6269d17c8cf 581 break;
jah128 0:d6269d17c8cf 582 }
jah128 0:d6269d17c8cf 583 break;
jah128 0:d6269d17c8cf 584 }
jah128 0:d6269d17c8cf 585 } else started = 1;
jah128 0:d6269d17c8cf 586 display.clear_display();
jah128 0:d6269d17c8cf 587 switch(level) {
jah128 0:d6269d17c8cf 588 case 0:
jah128 0:d6269d17c8cf 589 //Top level menu
jah128 0:d6269d17c8cf 590 switch(top_menu) {
jah128 0:d6269d17c8cf 591 case 0:
jah128 15:66be5ec52c3b 592 strcpy(topline,"---QUICK TEST---");
jah128 15:66be5ec52c3b 593 break;
jah128 15:66be5ec52c3b 594 case 1:
jah128 0:d6269d17c8cf 595 strcpy(topline,"---TEST LEDS----");
jah128 0:d6269d17c8cf 596 break;
jah128 15:66be5ec52c3b 597 case 2:
jah128 0:d6269d17c8cf 598 strcpy(topline,"--TEST SENSORS--");
jah128 0:d6269d17c8cf 599 break;
jah128 15:66be5ec52c3b 600 case 3:
jah128 0:d6269d17c8cf 601 strcpy(topline,"--TEST MOTORS---");
jah128 0:d6269d17c8cf 602 break;
jah128 0:d6269d17c8cf 603 case 4:
jah128 15:66be5ec52c3b 604 strcpy(topline,"---TEST RADIO---");
jah128 0:d6269d17c8cf 605 break;
jah128 0:d6269d17c8cf 606 case 5:
jah128 15:66be5ec52c3b 607 strcpy(topline,"------INFO------");
jah128 0:d6269d17c8cf 608 break;
jah128 0:d6269d17c8cf 609 case 6:
jah128 15:66be5ec52c3b 610 strcpy(topline,"---CODE DEMOS---");
jah128 0:d6269d17c8cf 611 break;
jah128 0:d6269d17c8cf 612 case 7:
jah128 17:bf614e28668f 613 strcpy(topline,"---CALIBRATION--");
jah128 15:66be5ec52c3b 614 break;
jah128 15:66be5ec52c3b 615 case 8:
jah128 0:d6269d17c8cf 616 strcpy(topline,"---PSI BASIC----");
jah128 0:d6269d17c8cf 617 break;
jah128 15:66be5ec52c3b 618 case 9:
jah128 4:1c621cb8cf0d 619 strcpy(topline,"------EXIT------");
jah128 4:1c621cb8cf0d 620 break;
jah128 0:d6269d17c8cf 621 }
jah128 0:d6269d17c8cf 622 strcpy(bottomline,"");
jah128 0:d6269d17c8cf 623 break;
jah128 0:d6269d17c8cf 624 case 1:
jah128 0:d6269d17c8cf 625 //Sub level menu
jah128 0:d6269d17c8cf 626 switch(top_menu) {
jah128 15:66be5ec52c3b 627 case 8:
jah128 0:d6269d17c8cf 628 strcpy(topline,"-PSI BASIC MENU-");
jah128 0:d6269d17c8cf 629 if(sub_menu == psi_basic_file_count) strcpy(bottomline,"EXIT");
jah128 0:d6269d17c8cf 630 else strcpy(bottomline,basic_filenames.at(sub_menu).c_str());
jah128 0:d6269d17c8cf 631 break;
jah128 15:66be5ec52c3b 632 case 1:
jah128 0:d6269d17c8cf 633 strcpy(topline,"----LED MENU----");
jah128 0:d6269d17c8cf 634 char led_status[7];
jah128 0:d6269d17c8cf 635 if(sub_menu<9) {
jah128 0:d6269d17c8cf 636 switch(led_state[sub_menu]) {
jah128 0:d6269d17c8cf 637 case 0:
jah128 0:d6269d17c8cf 638 strcpy(led_status,"OFF");
jah128 0:d6269d17c8cf 639 break;
jah128 0:d6269d17c8cf 640 case 1:
jah128 0:d6269d17c8cf 641 strcpy(led_status,"RED");
jah128 0:d6269d17c8cf 642 break;
jah128 0:d6269d17c8cf 643 case 2:
jah128 0:d6269d17c8cf 644 strcpy(led_status,"GREEN");
jah128 0:d6269d17c8cf 645 break;
jah128 0:d6269d17c8cf 646 case 3:
jah128 0:d6269d17c8cf 647 strcpy(led_status,"YELLOW");
jah128 0:d6269d17c8cf 648 break;
jah128 0:d6269d17c8cf 649 }
jah128 0:d6269d17c8cf 650 }
jah128 0:d6269d17c8cf 651 if(sub_menu < 8) sprintf(bottomline,"OUTER %d: %s",(sub_menu + 1),led_status);
jah128 0:d6269d17c8cf 652 if(sub_menu == 8) sprintf(bottomline,"CENTER: %s",led_status);
jah128 0:d6269d17c8cf 653 if(sub_menu == 9) {
jah128 0:d6269d17c8cf 654 switch(all_led_state) {
jah128 0:d6269d17c8cf 655 case 0:
jah128 0:d6269d17c8cf 656 strcpy(led_status,"OFF");
jah128 0:d6269d17c8cf 657 break;
jah128 0:d6269d17c8cf 658 case 1:
jah128 0:d6269d17c8cf 659 strcpy(led_status,"RED");
jah128 0:d6269d17c8cf 660 break;
jah128 0:d6269d17c8cf 661 case 2:
jah128 0:d6269d17c8cf 662 strcpy(led_status,"GREEN");
jah128 0:d6269d17c8cf 663 break;
jah128 0:d6269d17c8cf 664 case 3:
jah128 0:d6269d17c8cf 665 strcpy(led_status,"YELLOW");
jah128 0:d6269d17c8cf 666 break;
jah128 0:d6269d17c8cf 667 }
jah128 0:d6269d17c8cf 668 sprintf(bottomline,"SET ALL %s", led_status);
jah128 0:d6269d17c8cf 669 }
jah128 0:d6269d17c8cf 670 if(sub_menu == 10) {
jah128 0:d6269d17c8cf 671 if(base_led_state == 0) strcpy(led_status,"OFF");
jah128 0:d6269d17c8cf 672 else strcpy(led_status,"ON");
jah128 0:d6269d17c8cf 673 sprintf(bottomline,"BASE: %s",led_status);
jah128 0:d6269d17c8cf 674 }
jah128 0:d6269d17c8cf 675 if(sub_menu == 11) sprintf(bottomline,"CLED BNESS %d%%", brightness);
jah128 0:d6269d17c8cf 676 if(sub_menu == 12) sprintf(bottomline,"DISP BNESS %d%%", bl_brightness);
jah128 0:d6269d17c8cf 677 if(sub_menu == 13) strcpy(bottomline,"EXIT");
jah128 0:d6269d17c8cf 678 break;
jah128 0:d6269d17c8cf 679
jah128 15:66be5ec52c3b 680 case 2:
jah128 0:d6269d17c8cf 681 strcpy(topline,"--SENSORS MENU--");
jah128 0:d6269d17c8cf 682 switch(sub_menu) {
jah128 0:d6269d17c8cf 683 case 0: {
jah128 10:e58323951c08 684 float battery = sensors.get_battery_voltage ();
jah128 0:d6269d17c8cf 685 sprintf(bottomline,"BATTERY: %1.3fV",battery);
jah128 0:d6269d17c8cf 686 break;
jah128 0:d6269d17c8cf 687 }
jah128 0:d6269d17c8cf 688 case 1: {
jah128 10:e58323951c08 689 float dc = sensors.get_dc_voltage ();
jah128 0:d6269d17c8cf 690 sprintf(bottomline,"DC: %1.3fV",dc);
jah128 0:d6269d17c8cf 691 break;
jah128 0:d6269d17c8cf 692 }
jah128 0:d6269d17c8cf 693 case 2: {
jah128 10:e58323951c08 694 float current = sensors.get_current ();
jah128 0:d6269d17c8cf 695 sprintf(bottomline,"CURRENT: %1.3fA",current);
jah128 0:d6269d17c8cf 696 break;
jah128 0:d6269d17c8cf 697 }
jah128 0:d6269d17c8cf 698 case 3: {
jah128 10:e58323951c08 699 float temperature = sensors.get_temperature();
jah128 0:d6269d17c8cf 700 sprintf(bottomline,"TEMP: %3.2fC", temperature);
jah128 0:d6269d17c8cf 701 break;
jah128 0:d6269d17c8cf 702 }
jah128 0:d6269d17c8cf 703 case 4:
jah128 10:e58323951c08 704 sensors.store_background_base_ir_values();
jah128 10:e58323951c08 705 sprintf(bottomline,"BIR%dB:%d",base_ir_index+1,sensors.get_background_base_ir_value(base_ir_index));
jah128 0:d6269d17c8cf 706 break;
jah128 0:d6269d17c8cf 707 case 5:
jah128 10:e58323951c08 708 sensors.store_illuminated_base_ir_values();
jah128 10:e58323951c08 709 sprintf(bottomline,"BIR%dR:%d",base_ir_index+1,sensors.get_illuminated_base_ir_value(base_ir_index));
jah128 0:d6269d17c8cf 710 break;
jah128 0:d6269d17c8cf 711 case 6:
jah128 17:bf614e28668f 712 sensors.store_illuminated_base_ir_values();
jah128 17:bf614e28668f 713 sprintf(bottomline,"BIC%dR:%1.3f",base_ir_index+1,sensors.get_calibrated_base_ir_value(base_ir_index));
jah128 17:bf614e28668f 714 break;
jah128 17:bf614e28668f 715 case 7:
jah128 10:e58323951c08 716 sensors.store_background_raw_ir_values();
jah128 10:e58323951c08 717 sprintf(bottomline,"SIR%dB:%d",side_ir_index+1,sensors.get_background_raw_ir_value(side_ir_index));
jah128 0:d6269d17c8cf 718 break;
jah128 17:bf614e28668f 719 case 8:
jah128 10:e58323951c08 720 sensors.store_illuminated_raw_ir_values();
jah128 10:e58323951c08 721 sprintf(bottomline,"SIR%dR:%d",side_ir_index+1,sensors.get_illuminated_raw_ir_value(side_ir_index));
jah128 0:d6269d17c8cf 722 break;
jah128 17:bf614e28668f 723 case 9:
jah128 0:d6269d17c8cf 724 sprintf(bottomline,"SIR%dD:%3.1f",side_ir_index+1,0.0);
jah128 0:d6269d17c8cf 725 break;
jah128 17:bf614e28668f 726 case 10:
jah128 0:d6269d17c8cf 727 if(ultrasonic_distance_updated == 1) {
jah128 0:d6269d17c8cf 728 sprintf(bottomline,"USONIC:%3dcm",ultrasonic_distance);
jah128 0:d6269d17c8cf 729 } else sprintf(bottomline,"USONIC:---------");
jah128 10:e58323951c08 730 sensors.update_ultrasonic_measure();
jah128 0:d6269d17c8cf 731 break;
jah128 17:bf614e28668f 732 case 11:
jah128 10:e58323951c08 733 sensors.store_line_position();
jah128 0:d6269d17c8cf 734 if(line_found == 1)sprintf(bottomline,"LINE:%1.3f",line_position);
jah128 0:d6269d17c8cf 735 else sprintf(bottomline,"LINE:---------");
jah128 0:d6269d17c8cf 736 break;
jah128 17:bf614e28668f 737
jah128 17:bf614e28668f 738 case 12:
jah128 16:50686c07ad07 739 sprintf(bottomline,"COLOUR: %s",colour.get_colour_string(colour.detect_colour_once()));
jah128 16:50686c07ad07 740 break;
jah128 17:bf614e28668f 741 case 13:
jah128 0:d6269d17c8cf 742 sprintf(bottomline,"EXIT");
jah128 0:d6269d17c8cf 743 break;
jah128 0:d6269d17c8cf 744 }
jah128 0:d6269d17c8cf 745 break;
jah128 15:66be5ec52c3b 746 case 3:
jah128 0:d6269d17c8cf 747 strcpy(topline,"--MOTORS MENU---");
jah128 0:d6269d17c8cf 748 switch(sub_menu) {
jah128 0:d6269d17c8cf 749 case 0:
jah128 0:d6269d17c8cf 750 sprintf(bottomline,"LEFT: %d%%", left_speed);
jah128 0:d6269d17c8cf 751 break;
jah128 0:d6269d17c8cf 752 case 1:
jah128 0:d6269d17c8cf 753 sprintf(bottomline,"RIGHT: %d%%", right_speed);
jah128 0:d6269d17c8cf 754 break;
jah128 0:d6269d17c8cf 755 case 2:
jah128 0:d6269d17c8cf 756 char both_mode_string[16];
jah128 0:d6269d17c8cf 757 switch(both_motor_mode) {
jah128 0:d6269d17c8cf 758 case 0:
jah128 0:d6269d17c8cf 759 strcpy(both_mode_string,"OFF");
jah128 0:d6269d17c8cf 760 break;
jah128 0:d6269d17c8cf 761 case 1:
jah128 0:d6269d17c8cf 762 strcpy(both_mode_string,"BRAKE");
jah128 0:d6269d17c8cf 763 break;
jah128 0:d6269d17c8cf 764 case 2:
jah128 0:d6269d17c8cf 765 strcpy(both_mode_string,"+50%");
jah128 0:d6269d17c8cf 766 break;
jah128 0:d6269d17c8cf 767 case 3:
jah128 0:d6269d17c8cf 768 strcpy(both_mode_string,"+100%");
jah128 0:d6269d17c8cf 769 break;
jah128 0:d6269d17c8cf 770 case 4:
jah128 0:d6269d17c8cf 771 strcpy(both_mode_string,"-50%");
jah128 0:d6269d17c8cf 772 break;
jah128 0:d6269d17c8cf 773 case 5:
jah128 0:d6269d17c8cf 774 strcpy(both_mode_string,"-100%");
jah128 0:d6269d17c8cf 775 break;
jah128 0:d6269d17c8cf 776 }
jah128 0:d6269d17c8cf 777 sprintf(bottomline,"BOTH TO %s",both_mode_string);
jah128 0:d6269d17c8cf 778 break;
jah128 0:d6269d17c8cf 779 case 3:
jah128 0:d6269d17c8cf 780 sprintf(bottomline,"EXIT");
jah128 0:d6269d17c8cf 781 break;
jah128 0:d6269d17c8cf 782 }
jah128 0:d6269d17c8cf 783 break;
jah128 15:66be5ec52c3b 784 case 4:
jah128 0:d6269d17c8cf 785 strcpy(topline,"---RADIO MENU---");
jah128 0:d6269d17c8cf 786 switch(sub_menu) {
jah128 0:d6269d17c8cf 787
jah128 0:d6269d17c8cf 788 case 0:
jah128 0:d6269d17c8cf 789 sprintf(bottomline,"EXIT");
jah128 0:d6269d17c8cf 790 break;
jah128 0:d6269d17c8cf 791 }
jah128 0:d6269d17c8cf 792 break;
jah128 15:66be5ec52c3b 793 case 5:
jah128 0:d6269d17c8cf 794 strcpy(topline,"---INFO MENU----");
jah128 0:d6269d17c8cf 795 switch(sub_menu) {
jah128 0:d6269d17c8cf 796 case 0:
jah128 0:d6269d17c8cf 797 sprintf(bottomline,"ROBOT ID: %d",robot_id);
jah128 0:d6269d17c8cf 798 break;
jah128 0:d6269d17c8cf 799 case 1:
jah128 0:d6269d17c8cf 800 sprintf(bottomline,"SOFTWARE: %1.2f",SOFTWARE_VERSION_CODE);
jah128 0:d6269d17c8cf 801 break;
jah128 0:d6269d17c8cf 802 case 2:
jah128 0:d6269d17c8cf 803 if(firmware_version > 0) sprintf(bottomline,"FIRMWARE: %1.2f",firmware_version);
jah128 0:d6269d17c8cf 804 else sprintf(bottomline,"FIRMWARE: ?????");
jah128 0:d6269d17c8cf 805 break;
jah128 0:d6269d17c8cf 806 case 3:
jah128 0:d6269d17c8cf 807 sprintf(bottomline,"PROG:%s",program_name);
jah128 0:d6269d17c8cf 808 break;
jah128 0:d6269d17c8cf 809 case 4:
jah128 0:d6269d17c8cf 810 sprintf(bottomline,"AUTH:%s",author_name);
jah128 0:d6269d17c8cf 811 break;
jah128 0:d6269d17c8cf 812 case 5:
jah128 0:d6269d17c8cf 813 sprintf(bottomline,"VER:%s",version_name);
jah128 0:d6269d17c8cf 814 break;
jah128 0:d6269d17c8cf 815 case 6:
jah128 0:d6269d17c8cf 816 sprintf(bottomline,"EXIT");
jah128 0:d6269d17c8cf 817 break;
jah128 0:d6269d17c8cf 818 }
jah128 0:d6269d17c8cf 819 break;
jah128 15:66be5ec52c3b 820 case 6:
jah128 0:d6269d17c8cf 821 strcpy(topline,"---CODE DEMOS---");
jah128 0:d6269d17c8cf 822 switch(sub_menu) {
jah128 0:d6269d17c8cf 823 case 0:
jah128 0:d6269d17c8cf 824 sprintf(bottomline,"LINE FOLLOW");
jah128 0:d6269d17c8cf 825 break;
jah128 0:d6269d17c8cf 826 case 1:
jah128 0:d6269d17c8cf 827 sprintf(bottomline,"OBST. AVOID");
jah128 0:d6269d17c8cf 828 break;
jah128 0:d6269d17c8cf 829 case 2:
jah128 0:d6269d17c8cf 830 sprintf(bottomline,"COLOUR SPIN");
jah128 0:d6269d17c8cf 831 break;
jah128 0:d6269d17c8cf 832 case 3:
jah128 0:d6269d17c8cf 833 sprintf(bottomline,"STRESS TEST");
jah128 0:d6269d17c8cf 834 break;
jah128 0:d6269d17c8cf 835 case 4:
jah128 16:50686c07ad07 836 sprintf(bottomline,"COLOUR WALK");
jah128 16:50686c07ad07 837 break;
jah128 16:50686c07ad07 838 case 5:
jah128 0:d6269d17c8cf 839 sprintf(bottomline,"EXIT");
jah128 0:d6269d17c8cf 840 break;
jah128 0:d6269d17c8cf 841 }
jah128 0:d6269d17c8cf 842 break;
jah128 15:66be5ec52c3b 843 case 7:
jah128 17:bf614e28668f 844 strcpy(topline,"---CALIB. MENU--");
jah128 4:1c621cb8cf0d 845 switch(sub_menu) {
jah128 4:1c621cb8cf0d 846 case 0:
jah128 17:bf614e28668f 847 sprintf(bottomline,"BASE SENSOR");
jah128 4:1c621cb8cf0d 848 break;
jah128 4:1c621cb8cf0d 849 case 1:
jah128 17:bf614e28668f 850 sprintf(bottomline,"MOTOR");
jah128 15:66be5ec52c3b 851 break;
jah128 4:1c621cb8cf0d 852 case 2:
jah128 4:1c621cb8cf0d 853 sprintf(bottomline,"EXIT");
jah128 4:1c621cb8cf0d 854 break;
jah128 4:1c621cb8cf0d 855 }
jah128 0:d6269d17c8cf 856 break;
jah128 0:d6269d17c8cf 857 }
jah128 0:d6269d17c8cf 858 break;
jah128 0:d6269d17c8cf 859 }
jah128 0:d6269d17c8cf 860 display.write_string(topline);
jah128 0:d6269d17c8cf 861 display.set_position(1,0);
jah128 0:d6269d17c8cf 862 display.write_string(bottomline);
jah128 16:50686c07ad07 863 // Periodically update when on sensors menu
jah128 16:50686c07ad07 864 if(top_menu == 2 && level == 1) {
jah128 11:312663037b8c 865 demo_event.attach(this,&Demo::demo_event_thread, 0.25);
jah128 0:d6269d17c8cf 866 }
jah128 0:d6269d17c8cf 867 }
jah128 0:d6269d17c8cf 868
jah128 15:66be5ec52c3b 869 char test_step = 0;
jah128 15:66be5ec52c3b 870 char test_substep = 0;
jah128 15:66be5ec52c3b 871 char test_warnings = 0;
jah128 15:66be5ec52c3b 872
jah128 15:66be5ec52c3b 873
jah128 15:66be5ec52c3b 874 void Demo::quick_test_cycle()
jah128 15:66be5ec52c3b 875 {
jah128 15:66be5ec52c3b 876 char next_step [] = {4,5,8,3};
jah128 15:66be5ec52c3b 877 char test_message [17];
jah128 15:66be5ec52c3b 878 int wait_period = SELF_TEST_PERIOD * 10;
jah128 15:66be5ec52c3b 879
jah128 15:66be5ec52c3b 880 if(test_substep == 0) {
jah128 15:66be5ec52c3b 881 display.clear_display();
jah128 15:66be5ec52c3b 882 switch(test_step) {
jah128 15:66be5ec52c3b 883 case 0:
jah128 15:66be5ec52c3b 884 display.write_string("01 - Power ");
jah128 15:66be5ec52c3b 885 pc.printf("\nTest 01: Power quick tests [%f]\n",psi.get_uptime());
jah128 15:66be5ec52c3b 886 break;
jah128 15:66be5ec52c3b 887 case 1:
jah128 15:66be5ec52c3b 888 display.write_string("02 - Base IR ");
jah128 15:66be5ec52c3b 889 pc.printf("\nTest 02: Base infrared tests [%f]\n",psi.get_uptime());
jah128 15:66be5ec52c3b 890 break;
jah128 15:66be5ec52c3b 891 case 2:
jah128 15:66be5ec52c3b 892 display.write_string("03 - Side IR ");
jah128 15:66be5ec52c3b 893 pc.printf("\nTest 03: Side infrared tests [%f]\n",psi.get_uptime());
jah128 15:66be5ec52c3b 894 break;
jah128 15:66be5ec52c3b 895 case 3:
jah128 15:66be5ec52c3b 896 display.write_string("04 - LEDs ");
jah128 15:66be5ec52c3b 897 pc.printf("\nTest 04: LED quick tests [%f]\n",psi.get_uptime());
jah128 15:66be5ec52c3b 898 break;
jah128 15:66be5ec52c3b 899 }
jah128 15:66be5ec52c3b 900 }
jah128 15:66be5ec52c3b 901 if(test_step == 0) {
jah128 15:66be5ec52c3b 902 // Power self-test
jah128 15:66be5ec52c3b 903 switch(test_substep) {
jah128 15:66be5ec52c3b 904 case 0: { // Battery Voltage
jah128 15:66be5ec52c3b 905 float battery_voltages [SAMPLE_SIZE];
jah128 15:66be5ec52c3b 906 float mean_battery_voltage = 0;
jah128 15:66be5ec52c3b 907 float sd_battery_voltage = 0;
jah128 15:66be5ec52c3b 908 for(int i=0; i<SAMPLE_SIZE; i++) {
jah128 15:66be5ec52c3b 909 battery_voltages[i]=sensors.get_battery_voltage ();
jah128 15:66be5ec52c3b 910 mean_battery_voltage += battery_voltages[i];
jah128 15:66be5ec52c3b 911 wait_us(SELF_TEST_PERIOD);
jah128 15:66be5ec52c3b 912 }
jah128 15:66be5ec52c3b 913 mean_battery_voltage /= SAMPLE_SIZE;
jah128 15:66be5ec52c3b 914 for(int i=0; i<SAMPLE_SIZE; ++i) sd_battery_voltage += pow(battery_voltages[i] - mean_battery_voltage, 2);
jah128 15:66be5ec52c3b 915 sd_battery_voltage = sqrt(sd_battery_voltage/SAMPLE_SIZE);
jah128 15:66be5ec52c3b 916
jah128 15:66be5ec52c3b 917 sprintf(test_message,"BATTERY: %1.3fV",mean_battery_voltage);
jah128 15:66be5ec52c3b 918 pc.printf(" - Battery Voltage : %1.4fV [SD = % 1.4f]\n",mean_battery_voltage,sd_battery_voltage);
jah128 15:66be5ec52c3b 919 if(mean_battery_voltage < 3.6) {
jah128 15:66be5ec52c3b 920 pc.printf(" - WARNING : Battery voltage low\n");
jah128 15:66be5ec52c3b 921 test_warnings++;
jah128 15:66be5ec52c3b 922 }
jah128 15:66be5ec52c3b 923 break;
jah128 15:66be5ec52c3b 924 }
jah128 15:66be5ec52c3b 925 case 1: {// DC Voltage
jah128 15:66be5ec52c3b 926 float dc_voltages [SAMPLE_SIZE];
jah128 15:66be5ec52c3b 927 float mean_dc_voltage = 0;
jah128 15:66be5ec52c3b 928 float sd_dc_voltage = 0;
jah128 15:66be5ec52c3b 929 for(int i=0; i<SAMPLE_SIZE; i++) {
jah128 15:66be5ec52c3b 930 dc_voltages[i]=sensors.get_dc_voltage ();
jah128 15:66be5ec52c3b 931 mean_dc_voltage += dc_voltages[i];
jah128 15:66be5ec52c3b 932 wait_us(SELF_TEST_PERIOD);
jah128 15:66be5ec52c3b 933 }
jah128 15:66be5ec52c3b 934 mean_dc_voltage /= SAMPLE_SIZE;
jah128 15:66be5ec52c3b 935 for(int i=0; i<SAMPLE_SIZE; ++i) sd_dc_voltage += pow(dc_voltages[i] - mean_dc_voltage, 2);
jah128 15:66be5ec52c3b 936 sd_dc_voltage = sqrt(sd_dc_voltage/SAMPLE_SIZE);
jah128 15:66be5ec52c3b 937
jah128 15:66be5ec52c3b 938 sprintf(test_message,"DC : %1.3fV",mean_dc_voltage);
jah128 15:66be5ec52c3b 939 pc.printf(" - DC Input Voltage : %1.4fV [SD = % 1.4f]\n",mean_dc_voltage,sd_dc_voltage);
jah128 15:66be5ec52c3b 940 if(mean_dc_voltage < 0.5) {
jah128 15:66be5ec52c3b 941 pc.printf(" - WARNING : DC voltage low - check charging resistor\n");
jah128 15:66be5ec52c3b 942 test_warnings++;
jah128 15:66be5ec52c3b 943 }
jah128 15:66be5ec52c3b 944 break;
jah128 15:66be5ec52c3b 945 }
jah128 15:66be5ec52c3b 946
jah128 15:66be5ec52c3b 947
jah128 15:66be5ec52c3b 948 case 2: { // Current
jah128 15:66be5ec52c3b 949 float currents [SAMPLE_SIZE];
jah128 15:66be5ec52c3b 950 float mean_current = 0;
jah128 15:66be5ec52c3b 951 float sd_current = 0;
jah128 15:66be5ec52c3b 952 for(int i=0; i<SAMPLE_SIZE; i++) {
jah128 15:66be5ec52c3b 953 currents[i]=sensors.get_current ();
jah128 15:66be5ec52c3b 954 mean_current += currents[i];
jah128 15:66be5ec52c3b 955 wait_us(SELF_TEST_PERIOD);
jah128 15:66be5ec52c3b 956 }
jah128 15:66be5ec52c3b 957 mean_current /= SAMPLE_SIZE;
jah128 15:66be5ec52c3b 958 for(int i=0; i<SAMPLE_SIZE; ++i) sd_current += pow(currents[i] - mean_current, 2);
jah128 15:66be5ec52c3b 959 sd_current = sqrt(sd_current/SAMPLE_SIZE);
jah128 15:66be5ec52c3b 960
jah128 15:66be5ec52c3b 961 sprintf(test_message,"CURRENT: %1.3fV",mean_current);
jah128 15:66be5ec52c3b 962 pc.printf(" - Load Current : %1.4fA [SD = % 1.4f]\n",mean_current,sd_current);
jah128 15:66be5ec52c3b 963 if(mean_current > 0.2) {
jah128 15:66be5ec52c3b 964 pc.printf(" - WARNING : Higher than expected load current\n");
jah128 15:66be5ec52c3b 965 test_warnings++;
jah128 15:66be5ec52c3b 966 }
jah128 15:66be5ec52c3b 967 break;
jah128 15:66be5ec52c3b 968 }
jah128 15:66be5ec52c3b 969
jah128 15:66be5ec52c3b 970 case 3: {// System temperature
jah128 15:66be5ec52c3b 971 float temps[SAMPLE_SIZE];
jah128 15:66be5ec52c3b 972 float mean_temp = 0;
jah128 15:66be5ec52c3b 973 float sd_temp = 0;
jah128 15:66be5ec52c3b 974 for(int i=0; i<SAMPLE_SIZE; i++) {
jah128 15:66be5ec52c3b 975 temps[i]=sensors.get_temperature();
jah128 15:66be5ec52c3b 976 mean_temp += temps[i];
jah128 15:66be5ec52c3b 977 wait_us(SELF_TEST_PERIOD);
jah128 15:66be5ec52c3b 978 }
jah128 15:66be5ec52c3b 979 mean_temp /= SAMPLE_SIZE;
jah128 15:66be5ec52c3b 980 for(int i=0; i<SAMPLE_SIZE; ++i) sd_temp += pow(temps[i] - mean_temp, 2);
jah128 15:66be5ec52c3b 981 sd_temp = sqrt(sd_temp/SAMPLE_SIZE);
jah128 15:66be5ec52c3b 982
jah128 15:66be5ec52c3b 983 sprintf(test_message,"TEMP : %3.2fC",mean_temp);
jah128 15:66be5ec52c3b 984 pc.printf(" - System Temperature : %3.2fC [SD = % 1.4f]\n",mean_temp,sd_temp);
jah128 15:66be5ec52c3b 985 if(mean_temp > 32) {
jah128 15:66be5ec52c3b 986 pc.printf(" - WARNING : High system temperature detected\n");
jah128 15:66be5ec52c3b 987 test_warnings++;
jah128 15:66be5ec52c3b 988 }
jah128 15:66be5ec52c3b 989 if(mean_temp < 10) {
jah128 15:66be5ec52c3b 990 pc.printf(" - WARNING : Low system temperature detected\n");
jah128 15:66be5ec52c3b 991 test_warnings++;
jah128 15:66be5ec52c3b 992 }
jah128 15:66be5ec52c3b 993 break;
jah128 15:66be5ec52c3b 994 }
jah128 15:66be5ec52c3b 995 }
jah128 15:66be5ec52c3b 996 }
jah128 15:66be5ec52c3b 997
jah128 15:66be5ec52c3b 998 display.set_position(1,0);
jah128 15:66be5ec52c3b 999 display.write_string(" ");
jah128 15:66be5ec52c3b 1000 display.set_position(1,0);
jah128 15:66be5ec52c3b 1001 display.write_string(test_message);
jah128 15:66be5ec52c3b 1002 test_substep++;
jah128 15:66be5ec52c3b 1003 if(test_substep >= next_step[test_step]) {
jah128 15:66be5ec52c3b 1004 test_substep = 0;
jah128 15:66be5ec52c3b 1005 test_step ++;
jah128 15:66be5ec52c3b 1006 if(test_step == 4) test_step = 0;
jah128 15:66be5ec52c3b 1007 }
jah128 15:66be5ec52c3b 1008
jah128 15:66be5ec52c3b 1009 demo_timeout.attach_us(this,&Demo::quick_test_cycle, wait_period);
jah128 15:66be5ec52c3b 1010 }
jah128 15:66be5ec52c3b 1011
jah128 15:66be5ec52c3b 1012 void Demo::toggle_quick_test()
jah128 15:66be5ec52c3b 1013 {
jah128 15:66be5ec52c3b 1014 quick_test = 1 - quick_test;
jah128 15:66be5ec52c3b 1015 if(quick_test == 0) {
jah128 15:66be5ec52c3b 1016 pc.printf("________________________________________\n");
jah128 15:66be5ec52c3b 1017 pc.printf("Self test stopped at %f with %d warnings\n\n",psi.get_uptime(),test_warnings);
jah128 15:66be5ec52c3b 1018 demo_running = 0;
jah128 15:66be5ec52c3b 1019 demo_timeout.detach();
jah128 15:66be5ec52c3b 1020 display.set_backlight_brightness(1);
jah128 15:66be5ec52c3b 1021 display.clear_display();
jah128 15:66be5ec52c3b 1022 display.write_string("---QUICK TEST---");
jah128 15:66be5ec52c3b 1023
jah128 15:66be5ec52c3b 1024
jah128 15:66be5ec52c3b 1025 } else {
jah128 15:66be5ec52c3b 1026 // Reset all LEDs, motors, display
jah128 15:66be5ec52c3b 1027 pc.printf("\n________________________________________\n");
jah128 15:66be5ec52c3b 1028 pc.printf("Self test started at %f\n\n",psi.get_uptime(),test_warnings);
jah128 15:66be5ec52c3b 1029 display.clear_display();
jah128 15:66be5ec52c3b 1030 test_step = 0;
jah128 15:66be5ec52c3b 1031 test_substep = 0;
jah128 15:66be5ec52c3b 1032 demo_running = 1;
jah128 15:66be5ec52c3b 1033 demo_timeout.attach_us(this,&Demo::quick_test_cycle,1000);
jah128 15:66be5ec52c3b 1034 }
jah128 15:66be5ec52c3b 1035 }
jah128 15:66be5ec52c3b 1036
jah128 11:312663037b8c 1037 void Demo::start_line_demo()
jah128 0:d6269d17c8cf 1038 {
jah128 0:d6269d17c8cf 1039 display.set_backlight_brightness(0);
jah128 0:d6269d17c8cf 1040 time_out = 0.25f;
jah128 0:d6269d17c8cf 1041 demo_timer.start();
jah128 0:d6269d17c8cf 1042 state = 0;
jah128 0:d6269d17c8cf 1043 speed = 0;
jah128 0:d6269d17c8cf 1044 led_step = 0;
jah128 0:d6269d17c8cf 1045 demo_running = 1;
jah128 11:312663037b8c 1046 demo_timeout.attach_us(this,&Demo::line_demo_cycle,1000);
jah128 0:d6269d17c8cf 1047 }
jah128 0:d6269d17c8cf 1048
jah128 11:312663037b8c 1049 void Demo::start_obstacle_demo()
jah128 0:d6269d17c8cf 1050 {
jah128 0:d6269d17c8cf 1051 display.set_backlight_brightness(0);
jah128 0:d6269d17c8cf 1052 time_out = 0.25f;
jah128 0:d6269d17c8cf 1053 demo_timer.start();
jah128 0:d6269d17c8cf 1054 state = 0;
jah128 0:d6269d17c8cf 1055 speed = 0;
jah128 0:d6269d17c8cf 1056 led_step = 0;
jah128 0:d6269d17c8cf 1057 demo_running = 1;
jah128 11:312663037b8c 1058 demo_timeout.attach_us(this,&Demo::obstacle_demo_cycle,1000);
jah128 0:d6269d17c8cf 1059 }
jah128 0:d6269d17c8cf 1060
jah128 16:50686c07ad07 1061 void Demo::start_colour_demo()
jah128 16:50686c07ad07 1062 {
jah128 16:50686c07ad07 1063 display.set_backlight_brightness(0);
jah128 16:50686c07ad07 1064 time_out = 0.25f;
jah128 16:50686c07ad07 1065 demo_timer.start();
jah128 16:50686c07ad07 1066 state = 0;
jah128 16:50686c07ad07 1067 speed = 0;
jah128 16:50686c07ad07 1068 led_step = 0;
jah128 16:50686c07ad07 1069 demo_running = 1;
jah128 16:50686c07ad07 1070 colour.start_colour_ticker(100);
jah128 16:50686c07ad07 1071 demo_timeout.attach_us(this,&Demo::colour_demo_cycle,1000);
jah128 16:50686c07ad07 1072 }
jah128 16:50686c07ad07 1073
jah128 11:312663037b8c 1074 void Demo::start_stress_demo()
jah128 0:d6269d17c8cf 1075 {
jah128 0:d6269d17c8cf 1076 display.set_backlight_brightness(0.25);
jah128 0:d6269d17c8cf 1077 display.write_string("STRESS TEST");
jah128 0:d6269d17c8cf 1078 display.set_position(1,0);
jah128 0:d6269d17c8cf 1079 display.write_string("----25%----");
jah128 0:d6269d17c8cf 1080 time_out = 0.04f;
jah128 0:d6269d17c8cf 1081 demo_timer.start();
jah128 0:d6269d17c8cf 1082 state = 0;
jah128 0:d6269d17c8cf 1083 speed = 0;
jah128 0:d6269d17c8cf 1084 stress_step = 0;
jah128 0:d6269d17c8cf 1085 spin_step = 0;
jah128 0:d6269d17c8cf 1086 demo_running = 1;
jah128 11:312663037b8c 1087 demo_timeout.attach_us(this,&Demo::stress_demo_cycle,1000);
jah128 0:d6269d17c8cf 1088 }
jah128 0:d6269d17c8cf 1089
jah128 11:312663037b8c 1090 void Demo::start_spinning_demo()
jah128 0:d6269d17c8cf 1091 {
jah128 0:d6269d17c8cf 1092 display.set_backlight_brightness(0);
jah128 0:d6269d17c8cf 1093 time_out = 0.0f;
jah128 0:d6269d17c8cf 1094 demo_timer.start();
jah128 0:d6269d17c8cf 1095 state = 0;
jah128 0:d6269d17c8cf 1096 speed = 0;
jah128 0:d6269d17c8cf 1097 led_step = 0;
jah128 0:d6269d17c8cf 1098 spin_step = 0;
jah128 0:d6269d17c8cf 1099 demo_running = 1;
jah128 11:312663037b8c 1100 demo_timeout.attach_us(this,&Demo::spinning_demo_cycle,1000);
jah128 0:d6269d17c8cf 1101 }
jah128 0:d6269d17c8cf 1102
jah128 11:312663037b8c 1103 void Demo::line_demo_cycle()
jah128 0:d6269d17c8cf 1104 {
jah128 0:d6269d17c8cf 1105 if(demo_timer.read() > time_out) {
jah128 10:e58323951c08 1106 sensors.store_line_position();
jah128 0:d6269d17c8cf 1107 if(line_found) {
jah128 0:d6269d17c8cf 1108 time_out = 0.01f;
jah128 0:d6269d17c8cf 1109 state = 0;
jah128 0:d6269d17c8cf 1110 // Get the position of the line.
jah128 0:d6269d17c8cf 1111 lf_current_pos_of_line = line_position;
jah128 0:d6269d17c8cf 1112 lf_proportional = lf_current_pos_of_line;
jah128 0:d6269d17c8cf 1113
jah128 0:d6269d17c8cf 1114 // Compute the derivative
jah128 0:d6269d17c8cf 1115 lf_derivative = lf_current_pos_of_line - lf_previous_pos_of_line;
jah128 0:d6269d17c8cf 1116
jah128 0:d6269d17c8cf 1117 // Compute the integral
jah128 0:d6269d17c8cf 1118 lf_integral += lf_proportional;
jah128 0:d6269d17c8cf 1119
jah128 0:d6269d17c8cf 1120 // Remember the last position.
jah128 0:d6269d17c8cf 1121 lf_previous_pos_of_line = lf_current_pos_of_line;
jah128 0:d6269d17c8cf 1122
jah128 0:d6269d17c8cf 1123 // Compute the power
jah128 0:d6269d17c8cf 1124 lf_power = (lf_proportional * (LF_P_TERM) ) + (lf_integral*(LF_I_TERM)) + (lf_derivative*(LF_D_TERM)) ;
jah128 0:d6269d17c8cf 1125
jah128 0:d6269d17c8cf 1126 // Compute new speeds
jah128 0:d6269d17c8cf 1127 lf_right = lf_speed-lf_power;
jah128 0:d6269d17c8cf 1128 lf_left = lf_speed+lf_power;
jah128 0:d6269d17c8cf 1129
jah128 0:d6269d17c8cf 1130 // limit checks
jah128 0:d6269d17c8cf 1131 if (lf_right < 0)
jah128 0:d6269d17c8cf 1132 lf_right = 0;
jah128 0:d6269d17c8cf 1133 else if (lf_right > 1.0f)
jah128 0:d6269d17c8cf 1134 lf_right = 1.0f;
jah128 0:d6269d17c8cf 1135
jah128 0:d6269d17c8cf 1136 if (lf_left < 0)
jah128 0:d6269d17c8cf 1137 lf_left = 0;
jah128 0:d6269d17c8cf 1138 else if (lf_left > 1.0f)
jah128 0:d6269d17c8cf 1139 lf_left = 1.0f;
jah128 15:66be5ec52c3b 1140 } else {
jah128 15:66be5ec52c3b 1141 //Cannot see line: hunt for it
jah128 15:66be5ec52c3b 1142 if(lf_left > lf_right) {
jah128 15:66be5ec52c3b 1143 //Currently turning left, keep turning left
jah128 15:66be5ec52c3b 1144 state ++;
jah128 15:66be5ec52c3b 1145 float d_step = state * 0.04;
jah128 15:66be5ec52c3b 1146 lf_left = 0.2 + d_step;
jah128 15:66be5ec52c3b 1147 lf_right = -0.2 - d_step;
jah128 15:66be5ec52c3b 1148 if(state > 20) {
jah128 15:66be5ec52c3b 1149 state = 0;
jah128 15:66be5ec52c3b 1150 lf_right = 0.2;
jah128 15:66be5ec52c3b 1151 lf_left = -0.2;
jah128 15:66be5ec52c3b 1152 time_out += 0.01f;
jah128 15:66be5ec52c3b 1153 if(time_out > 0.1f) demo_running = 0;
jah128 15:66be5ec52c3b 1154 }
jah128 15:66be5ec52c3b 1155 } else {
jah128 15:66be5ec52c3b 1156 //Currently turning right, keep turning right
jah128 15:66be5ec52c3b 1157 state ++;
jah128 15:66be5ec52c3b 1158 float d_step = state * 0.04;
jah128 15:66be5ec52c3b 1159 lf_left = -0.2 - d_step;
jah128 15:66be5ec52c3b 1160 lf_right = 0.2 + d_step;
jah128 15:66be5ec52c3b 1161 if(state > 20) {
jah128 15:66be5ec52c3b 1162 state = 0;
jah128 15:66be5ec52c3b 1163 lf_right = -0.2;
jah128 15:66be5ec52c3b 1164 lf_left = 0.2;
jah128 15:66be5ec52c3b 1165 time_out += 0.01f;
jah128 15:66be5ec52c3b 1166 if(time_out > 0.1f) demo_running = 0;
jah128 15:66be5ec52c3b 1167 }
jah128 0:d6269d17c8cf 1168 }
jah128 0:d6269d17c8cf 1169 }
jah128 0:d6269d17c8cf 1170 // set speed
jah128 8:6c92789d5f87 1171 motors.set_left_motor_speed(lf_left);
jah128 8:6c92789d5f87 1172 motors.set_right_motor_speed(lf_right);
jah128 0:d6269d17c8cf 1173
jah128 0:d6269d17c8cf 1174
jah128 0:d6269d17c8cf 1175 demo_timer.reset();
jah128 0:d6269d17c8cf 1176 }
jah128 11:312663037b8c 1177 if(demo_running == 1)demo_timeout.attach_us(this,&Demo::line_demo_cycle,500);
jah128 0:d6269d17c8cf 1178 else {
jah128 8:6c92789d5f87 1179 motors.stop();
jah128 0:d6269d17c8cf 1180 display.set_backlight_brightness(bl_brightness * 0.01f);
jah128 0:d6269d17c8cf 1181 }
jah128 0:d6269d17c8cf 1182 }
jah128 0:d6269d17c8cf 1183
jah128 11:312663037b8c 1184 void Demo::stress_demo_cycle()
jah128 0:d6269d17c8cf 1185 {
jah128 0:d6269d17c8cf 1186 if(demo_timer.read() > time_out) {
jah128 0:d6269d17c8cf 1187 float pct = 0.25 + (0.25 * stress_step);
jah128 0:d6269d17c8cf 1188 switch(state) {
jah128 0:d6269d17c8cf 1189 case 0:
jah128 0:d6269d17c8cf 1190 if(spin_step % 2 == 0) {
jah128 8:6c92789d5f87 1191 motors.forward(pct);
jah128 9:dde9e21030eb 1192 led.set_leds(0xFF,0xFF);
jah128 0:d6269d17c8cf 1193 } else {
jah128 8:6c92789d5f87 1194 motors.backward(pct);
jah128 9:dde9e21030eb 1195 led.set_leds(0,0xFF);
jah128 0:d6269d17c8cf 1196 }
jah128 0:d6269d17c8cf 1197 spin_step ++;
jah128 0:d6269d17c8cf 1198 if(spin_step > 199) {
jah128 0:d6269d17c8cf 1199 state ++;
jah128 0:d6269d17c8cf 1200 spin_step = 0;
jah128 0:d6269d17c8cf 1201 }
jah128 0:d6269d17c8cf 1202 break;
jah128 0:d6269d17c8cf 1203 case 1:
jah128 0:d6269d17c8cf 1204 if(stress_step < 3) stress_step ++;
jah128 0:d6269d17c8cf 1205 float pct = 0.25 + (0.25 * stress_step);
jah128 0:d6269d17c8cf 1206 display.set_backlight_brightness(pct);
jah128 0:d6269d17c8cf 1207 display.set_position(1,0);
jah128 0:d6269d17c8cf 1208 switch(stress_step) {
jah128 0:d6269d17c8cf 1209 case 1:
jah128 0:d6269d17c8cf 1210 display.write_string("----50%----");
jah128 0:d6269d17c8cf 1211 break;
jah128 0:d6269d17c8cf 1212 case 2:
jah128 0:d6269d17c8cf 1213 display.write_string("----75%----");
jah128 0:d6269d17c8cf 1214 break;
jah128 0:d6269d17c8cf 1215 case 3:
jah128 0:d6269d17c8cf 1216 display.write_string("---100%----");
jah128 0:d6269d17c8cf 1217 break;
jah128 0:d6269d17c8cf 1218 }
jah128 0:d6269d17c8cf 1219 state = 0;
jah128 0:d6269d17c8cf 1220 break;
jah128 0:d6269d17c8cf 1221 }
jah128 0:d6269d17c8cf 1222 demo_timer.reset();
jah128 0:d6269d17c8cf 1223 }
jah128 11:312663037b8c 1224 if(demo_running == 1)demo_timeout.attach_us(this,&Demo::stress_demo_cycle,500);
jah128 0:d6269d17c8cf 1225 else {
jah128 8:6c92789d5f87 1226 motors.stop();
jah128 0:d6269d17c8cf 1227 display.set_backlight_brightness(bl_brightness * 0.01f);
jah128 0:d6269d17c8cf 1228 }
jah128 0:d6269d17c8cf 1229 }
jah128 0:d6269d17c8cf 1230
jah128 11:312663037b8c 1231 void Demo::spinning_demo_cycle()
jah128 0:d6269d17c8cf 1232 {
jah128 0:d6269d17c8cf 1233 if(demo_timer.read() > time_out) {
jah128 0:d6269d17c8cf 1234 switch(state) {
jah128 0:d6269d17c8cf 1235 case 0: //Robot is stopped
jah128 9:dde9e21030eb 1236 led.set_leds(0,0xFF);
jah128 9:dde9e21030eb 1237 led.set_center_led(1,1);
jah128 0:d6269d17c8cf 1238 speed = 0.1f;
jah128 8:6c92789d5f87 1239 motors.brake();
jah128 0:d6269d17c8cf 1240 time_out = 0.5;
jah128 0:d6269d17c8cf 1241 state = 1;
jah128 0:d6269d17c8cf 1242 led_step = 0;
jah128 0:d6269d17c8cf 1243 break;
jah128 0:d6269d17c8cf 1244 case 1: //Motor is turning right, accelerating
jah128 0:d6269d17c8cf 1245 time_out = 0.1;
jah128 9:dde9e21030eb 1246 led.set_center_led(2,1);
jah128 0:d6269d17c8cf 1247 switch(led_step) {
jah128 0:d6269d17c8cf 1248 case 0:
jah128 9:dde9e21030eb 1249 led.set_leds(0x01,0);
jah128 0:d6269d17c8cf 1250 break;
jah128 0:d6269d17c8cf 1251 case 1:
jah128 9:dde9e21030eb 1252 led.set_leds(0x02,0);
jah128 0:d6269d17c8cf 1253 break;
jah128 0:d6269d17c8cf 1254 case 2:
jah128 9:dde9e21030eb 1255 led.set_leds(0x04,0);
jah128 0:d6269d17c8cf 1256 break;
jah128 0:d6269d17c8cf 1257 case 3:
jah128 9:dde9e21030eb 1258 led.set_leds(0x08,0);
jah128 0:d6269d17c8cf 1259 break;
jah128 0:d6269d17c8cf 1260 case 4:
jah128 9:dde9e21030eb 1261 led.set_leds(0x10,0);
jah128 0:d6269d17c8cf 1262 break;
jah128 0:d6269d17c8cf 1263 case 5:
jah128 9:dde9e21030eb 1264 led.set_leds(0x20,0);
jah128 0:d6269d17c8cf 1265 break;
jah128 0:d6269d17c8cf 1266 case 6:
jah128 9:dde9e21030eb 1267 led.set_leds(0x40,0);
jah128 0:d6269d17c8cf 1268 break;
jah128 0:d6269d17c8cf 1269 case 7:
jah128 9:dde9e21030eb 1270 led.set_leds(0x80,0);
jah128 0:d6269d17c8cf 1271 break;
jah128 0:d6269d17c8cf 1272 }
jah128 0:d6269d17c8cf 1273 led_step ++;
jah128 0:d6269d17c8cf 1274 if(led_step == 8) led_step =0;
jah128 0:d6269d17c8cf 1275 if(speed < 1) {
jah128 0:d6269d17c8cf 1276 speed += 0.0125;
jah128 8:6c92789d5f87 1277 motors.turn(speed);
jah128 0:d6269d17c8cf 1278 } else {
jah128 0:d6269d17c8cf 1279 state = 2;
jah128 0:d6269d17c8cf 1280 spin_step = 0;
jah128 0:d6269d17c8cf 1281 led_step =0;
jah128 0:d6269d17c8cf 1282 }
jah128 0:d6269d17c8cf 1283 break;
jah128 0:d6269d17c8cf 1284 case 2: //Motor is turning right, full speed
jah128 9:dde9e21030eb 1285 led.set_center_led(3,1);
jah128 0:d6269d17c8cf 1286 switch(led_step) {
jah128 0:d6269d17c8cf 1287 case 0:
jah128 9:dde9e21030eb 1288 led.set_leds(0x33,0x33);
jah128 0:d6269d17c8cf 1289 break;
jah128 0:d6269d17c8cf 1290 case 1:
jah128 9:dde9e21030eb 1291 led.set_leds(0x66,0x66);
jah128 0:d6269d17c8cf 1292 break;
jah128 0:d6269d17c8cf 1293 case 2:
jah128 9:dde9e21030eb 1294 led.set_leds(0xCC,0xCC);
jah128 0:d6269d17c8cf 1295 break;
jah128 0:d6269d17c8cf 1296 case 3:
jah128 9:dde9e21030eb 1297 led.set_leds(0x99,0x99);
jah128 0:d6269d17c8cf 1298 break;
jah128 0:d6269d17c8cf 1299 }
jah128 0:d6269d17c8cf 1300 led_step ++;
jah128 0:d6269d17c8cf 1301 if(led_step == 4) led_step = 0;
jah128 0:d6269d17c8cf 1302 spin_step ++;
jah128 0:d6269d17c8cf 1303 if(spin_step == 40) {
jah128 0:d6269d17c8cf 1304 state = 3;
jah128 0:d6269d17c8cf 1305 led_step = 0;
jah128 0:d6269d17c8cf 1306 }
jah128 0:d6269d17c8cf 1307 break;
jah128 0:d6269d17c8cf 1308 case 3: //Motor is turning right, decelerating
jah128 9:dde9e21030eb 1309 led.set_center_led(2,1);
jah128 0:d6269d17c8cf 1310 switch(led_step) {
jah128 0:d6269d17c8cf 1311 case 0:
jah128 9:dde9e21030eb 1312 led.set_leds(0x01,0);
jah128 0:d6269d17c8cf 1313 break;
jah128 0:d6269d17c8cf 1314 case 1:
jah128 9:dde9e21030eb 1315 led.set_leds(0x02,0);
jah128 0:d6269d17c8cf 1316 break;
jah128 0:d6269d17c8cf 1317 case 2:
jah128 9:dde9e21030eb 1318 led.set_leds(0x04,0);
jah128 0:d6269d17c8cf 1319 break;
jah128 0:d6269d17c8cf 1320 case 3:
jah128 9:dde9e21030eb 1321 led.set_leds(0x08,0);
jah128 0:d6269d17c8cf 1322 break;
jah128 0:d6269d17c8cf 1323 case 4:
jah128 9:dde9e21030eb 1324 led.set_leds(0x10,0);
jah128 0:d6269d17c8cf 1325 break;
jah128 0:d6269d17c8cf 1326 case 5:
jah128 9:dde9e21030eb 1327 led.set_leds(0x20,0);
jah128 0:d6269d17c8cf 1328 break;
jah128 0:d6269d17c8cf 1329 case 6:
jah128 9:dde9e21030eb 1330 led.set_leds(0x40,0);
jah128 0:d6269d17c8cf 1331 break;
jah128 0:d6269d17c8cf 1332 case 7:
jah128 9:dde9e21030eb 1333 led.set_leds(0x80,0);
jah128 0:d6269d17c8cf 1334 break;
jah128 0:d6269d17c8cf 1335 }
jah128 0:d6269d17c8cf 1336 if(led_step == 0) led_step =8;
jah128 0:d6269d17c8cf 1337 led_step --;
jah128 0:d6269d17c8cf 1338 if(speed > 0.1) {
jah128 0:d6269d17c8cf 1339 speed -= 0.025;
jah128 8:6c92789d5f87 1340 motors.turn(speed);
jah128 0:d6269d17c8cf 1341 } else {
jah128 0:d6269d17c8cf 1342 state = 4;
jah128 0:d6269d17c8cf 1343 spin_step = 0;
jah128 0:d6269d17c8cf 1344 led_step =0;
jah128 0:d6269d17c8cf 1345 }
jah128 0:d6269d17c8cf 1346 break;
jah128 0:d6269d17c8cf 1347 case 4: //Robot is stopped
jah128 9:dde9e21030eb 1348 led.set_leds(0,0xFF);
jah128 9:dde9e21030eb 1349 led.set_center_led(1,1);
jah128 0:d6269d17c8cf 1350 speed = 0.1f;
jah128 8:6c92789d5f87 1351 motors.brake();
jah128 0:d6269d17c8cf 1352 time_out = 0.5;
jah128 0:d6269d17c8cf 1353 led_step =0;
jah128 0:d6269d17c8cf 1354 state = 5;
jah128 0:d6269d17c8cf 1355 break;
jah128 0:d6269d17c8cf 1356 case 5: //Motor is turning left, accelerating
jah128 0:d6269d17c8cf 1357 time_out = 0.1;
jah128 9:dde9e21030eb 1358 led.set_center_led(2,1);
jah128 0:d6269d17c8cf 1359 switch(led_step) {
jah128 0:d6269d17c8cf 1360 case 0:
jah128 9:dde9e21030eb 1361 led.set_leds(0x01,0);
jah128 0:d6269d17c8cf 1362 break;
jah128 0:d6269d17c8cf 1363 case 1:
jah128 9:dde9e21030eb 1364 led.set_leds(0x02,0);
jah128 0:d6269d17c8cf 1365 break;
jah128 0:d6269d17c8cf 1366 case 2:
jah128 9:dde9e21030eb 1367 led.set_leds(0x04,0);
jah128 0:d6269d17c8cf 1368 break;
jah128 0:d6269d17c8cf 1369 case 3:
jah128 9:dde9e21030eb 1370 led.set_leds(0x08,0);
jah128 0:d6269d17c8cf 1371 break;
jah128 0:d6269d17c8cf 1372 case 4:
jah128 9:dde9e21030eb 1373 led.set_leds(0x10,0);
jah128 0:d6269d17c8cf 1374 break;
jah128 0:d6269d17c8cf 1375 case 5:
jah128 9:dde9e21030eb 1376 led.set_leds(0x20,0);
jah128 0:d6269d17c8cf 1377 break;
jah128 0:d6269d17c8cf 1378 case 6:
jah128 9:dde9e21030eb 1379 led.set_leds(0x40,0);
jah128 0:d6269d17c8cf 1380 break;
jah128 0:d6269d17c8cf 1381 case 7:
jah128 9:dde9e21030eb 1382 led.set_leds(0x80,0);
jah128 0:d6269d17c8cf 1383 break;
jah128 0:d6269d17c8cf 1384 }
jah128 0:d6269d17c8cf 1385 if(led_step == 0) led_step =8;
jah128 0:d6269d17c8cf 1386 led_step --;
jah128 0:d6269d17c8cf 1387 if(speed < 1) {
jah128 0:d6269d17c8cf 1388 speed += 0.0125;
jah128 8:6c92789d5f87 1389 motors.turn(-speed);
jah128 0:d6269d17c8cf 1390 } else {
jah128 0:d6269d17c8cf 1391 state = 6;
jah128 0:d6269d17c8cf 1392 spin_step = 0;
jah128 0:d6269d17c8cf 1393 led_step = 0;
jah128 0:d6269d17c8cf 1394 }
jah128 0:d6269d17c8cf 1395 break;
jah128 0:d6269d17c8cf 1396 case 6: //Motor is turning left, full speed
jah128 9:dde9e21030eb 1397 led.set_center_led(3,1);
jah128 0:d6269d17c8cf 1398 switch(led_step) {
jah128 0:d6269d17c8cf 1399 case 0:
jah128 9:dde9e21030eb 1400 led.set_leds(0x33,0x33);
jah128 0:d6269d17c8cf 1401 break;
jah128 0:d6269d17c8cf 1402 case 1:
jah128 9:dde9e21030eb 1403 led.set_leds(0x66,0x66);
jah128 0:d6269d17c8cf 1404 break;
jah128 0:d6269d17c8cf 1405 case 2:
jah128 9:dde9e21030eb 1406 led.set_leds(0xCC,0xCC);
jah128 0:d6269d17c8cf 1407 break;
jah128 0:d6269d17c8cf 1408 case 3:
jah128 9:dde9e21030eb 1409 led.set_leds(0x99,0x99);
jah128 0:d6269d17c8cf 1410 break;
jah128 0:d6269d17c8cf 1411 }
jah128 0:d6269d17c8cf 1412 if(led_step == 0) led_step = 4;
jah128 0:d6269d17c8cf 1413 led_step --;
jah128 0:d6269d17c8cf 1414 spin_step ++;
jah128 0:d6269d17c8cf 1415 if(spin_step == 40) {
jah128 0:d6269d17c8cf 1416 state = 7;
jah128 0:d6269d17c8cf 1417 led_step = 0;
jah128 0:d6269d17c8cf 1418 }
jah128 0:d6269d17c8cf 1419 break;
jah128 0:d6269d17c8cf 1420 case 7: //Motor is turning left, decelerating
jah128 9:dde9e21030eb 1421 led.set_center_led(2,1);
jah128 0:d6269d17c8cf 1422 switch(led_step) {
jah128 0:d6269d17c8cf 1423 case 0:
jah128 9:dde9e21030eb 1424 led.set_leds(0x01,0);
jah128 0:d6269d17c8cf 1425 break;
jah128 0:d6269d17c8cf 1426 case 1:
jah128 9:dde9e21030eb 1427 led.set_leds(0x02,0);
jah128 0:d6269d17c8cf 1428 break;
jah128 0:d6269d17c8cf 1429 case 2:
jah128 9:dde9e21030eb 1430 led.set_leds(0x04,0);
jah128 0:d6269d17c8cf 1431 break;
jah128 0:d6269d17c8cf 1432 case 3:
jah128 9:dde9e21030eb 1433 led.set_leds(0x08,0);
jah128 0:d6269d17c8cf 1434 break;
jah128 0:d6269d17c8cf 1435 case 4:
jah128 9:dde9e21030eb 1436 led.set_leds(0x10,0);
jah128 0:d6269d17c8cf 1437 break;
jah128 0:d6269d17c8cf 1438 case 5:
jah128 9:dde9e21030eb 1439 led.set_leds(0x20,0);
jah128 0:d6269d17c8cf 1440 break;
jah128 0:d6269d17c8cf 1441 case 6:
jah128 9:dde9e21030eb 1442 led.set_leds(0x40,0);
jah128 0:d6269d17c8cf 1443 break;
jah128 0:d6269d17c8cf 1444 case 7:
jah128 9:dde9e21030eb 1445 led.set_leds(0x80,0);
jah128 0:d6269d17c8cf 1446 break;
jah128 0:d6269d17c8cf 1447 }
jah128 0:d6269d17c8cf 1448 led_step ++;
jah128 0:d6269d17c8cf 1449 if(led_step == 8) led_step =0;
jah128 0:d6269d17c8cf 1450 if(speed > 0.1) {
jah128 0:d6269d17c8cf 1451 speed -= 0.025;
jah128 8:6c92789d5f87 1452 motors.turn(-speed);
jah128 0:d6269d17c8cf 1453 } else {
jah128 0:d6269d17c8cf 1454 state = 0;
jah128 0:d6269d17c8cf 1455 spin_step = 0;
jah128 0:d6269d17c8cf 1456 led_step = 0;
jah128 0:d6269d17c8cf 1457 }
jah128 0:d6269d17c8cf 1458 break;
jah128 0:d6269d17c8cf 1459 }
jah128 0:d6269d17c8cf 1460 demo_timer.reset();
jah128 0:d6269d17c8cf 1461 }
jah128 11:312663037b8c 1462 if(demo_running == 1)demo_timeout.attach_us(this,&Demo::spinning_demo_cycle,500);
jah128 0:d6269d17c8cf 1463 else {
jah128 8:6c92789d5f87 1464 motors.stop();
jah128 0:d6269d17c8cf 1465 display.set_backlight_brightness(bl_brightness * 0.01f);
jah128 0:d6269d17c8cf 1466 }
jah128 0:d6269d17c8cf 1467 }
jah128 0:d6269d17c8cf 1468
jah128 16:50686c07ad07 1469 void Demo::colour_demo_cycle()
jah128 16:50686c07ad07 1470 {
jah128 16:50686c07ad07 1471 if(demo_timer.read() > time_out) {
jah128 16:50686c07ad07 1472 int col = colour.get_detected_colour();
jah128 16:50686c07ad07 1473 switch(col){
jah128 16:50686c07ad07 1474 case 0: led.set_leds(0,0xFF);
jah128 16:50686c07ad07 1475 led.set_center_led(1,1);
jah128 16:50686c07ad07 1476 break;
jah128 16:50686c07ad07 1477 case 1: led.set_leds(0xFF,0xFF);
jah128 16:50686c07ad07 1478 led.set_center_led(3,1);
jah128 16:50686c07ad07 1479 break;
jah128 16:50686c07ad07 1480 case 2: led.set_leds(0xFF,0);
jah128 16:50686c07ad07 1481 led.set_center_led(2,1);
jah128 16:50686c07ad07 1482 break;
jah128 16:50686c07ad07 1483 default: led.set_leds(0,0);
jah128 16:50686c07ad07 1484 led.set_center_led(0,0);
jah128 16:50686c07ad07 1485 break;
jah128 16:50686c07ad07 1486 }
jah128 16:50686c07ad07 1487 switch(state) {
jah128 16:50686c07ad07 1488 case 0: //Robot is stopped
jah128 16:50686c07ad07 1489 speed = 0.2f;
jah128 16:50686c07ad07 1490 motors.forward(speed);
jah128 16:50686c07ad07 1491 time_out = 0.05;
jah128 16:50686c07ad07 1492 state = 1;
jah128 16:50686c07ad07 1493 break;
jah128 16:50686c07ad07 1494 case 1: { //Motor is moving forward
jah128 16:50686c07ad07 1495 sensors.store_ir_values();
jah128 16:50686c07ad07 1496 int front_right = sensors.read_illuminated_raw_ir_value(0);
jah128 16:50686c07ad07 1497 int front_left = sensors.read_illuminated_raw_ir_value(7);
jah128 16:50686c07ad07 1498 if(front_left > 400 || front_right > 400) {
jah128 16:50686c07ad07 1499 motors.brake();
jah128 16:50686c07ad07 1500 time_out = 0.04;
jah128 16:50686c07ad07 1501 if(front_left > front_right)state=2;
jah128 16:50686c07ad07 1502 else state=3;
jah128 16:50686c07ad07 1503 } else {
jah128 16:50686c07ad07 1504 if(speed < 0.5) {
jah128 16:50686c07ad07 1505 speed += 0.03;
jah128 16:50686c07ad07 1506 motors.forward(speed);
jah128 16:50686c07ad07 1507 }
jah128 16:50686c07ad07 1508 }
jah128 16:50686c07ad07 1509 break;
jah128 16:50686c07ad07 1510 }
jah128 16:50686c07ad07 1511 case 2: //Turn right
jah128 16:50686c07ad07 1512 motors.set_left_motor_speed(0.35);
jah128 16:50686c07ad07 1513 motors.set_right_motor_speed(-0.35);
jah128 16:50686c07ad07 1514 time_out = 0.5;
jah128 16:50686c07ad07 1515 state = 0;
jah128 16:50686c07ad07 1516 break;
jah128 16:50686c07ad07 1517 case 3: //Turn left
jah128 16:50686c07ad07 1518 motors.set_left_motor_speed(-0.35);
jah128 16:50686c07ad07 1519 motors.set_right_motor_speed(0.35);
jah128 16:50686c07ad07 1520 time_out = 0.5;
jah128 16:50686c07ad07 1521 state = 0;
jah128 16:50686c07ad07 1522 break;
jah128 16:50686c07ad07 1523 }
jah128 16:50686c07ad07 1524 demo_timer.reset();
jah128 16:50686c07ad07 1525 }
jah128 16:50686c07ad07 1526 if(demo_running == 1)demo_timeout.attach_us(this,&Demo::colour_demo_cycle,200);
jah128 16:50686c07ad07 1527 else {
jah128 16:50686c07ad07 1528 motors.stop();
jah128 16:50686c07ad07 1529 display.set_backlight_brightness(bl_brightness * 0.01f);
jah128 16:50686c07ad07 1530 }
jah128 16:50686c07ad07 1531 }
jah128 16:50686c07ad07 1532
jah128 16:50686c07ad07 1533
jah128 11:312663037b8c 1534 void Demo::obstacle_demo_cycle()
jah128 0:d6269d17c8cf 1535 {
jah128 16:50686c07ad07 1536
jah128 0:d6269d17c8cf 1537 if(demo_timer.read() > time_out) {
jah128 0:d6269d17c8cf 1538 switch(state) {
jah128 0:d6269d17c8cf 1539 case 0: //Robot is stopped
jah128 9:dde9e21030eb 1540 led.set_leds(0,0xFF);
jah128 9:dde9e21030eb 1541 led.set_center_led(1,0.4);
jah128 0:d6269d17c8cf 1542 speed = 0.3f;
jah128 8:6c92789d5f87 1543 motors.forward(speed);
jah128 0:d6269d17c8cf 1544 time_out = 0.05;
jah128 0:d6269d17c8cf 1545 state = 1;
jah128 0:d6269d17c8cf 1546 break;
jah128 0:d6269d17c8cf 1547 case 1: { //Motor is moving forward
jah128 10:e58323951c08 1548 sensors.store_ir_values();
jah128 10:e58323951c08 1549 int front_right = sensors.read_illuminated_raw_ir_value(0);
jah128 10:e58323951c08 1550 int front_left = sensors.read_illuminated_raw_ir_value(7);
jah128 0:d6269d17c8cf 1551 if(front_left > 400 || front_right > 400) {
jah128 8:6c92789d5f87 1552 motors.brake();
jah128 0:d6269d17c8cf 1553 time_out = 0.04;
jah128 0:d6269d17c8cf 1554 if(front_left > front_right)state=2;
jah128 0:d6269d17c8cf 1555 else state=3;
jah128 0:d6269d17c8cf 1556 } else {
jah128 0:d6269d17c8cf 1557 if(speed < 0.5) {
jah128 0:d6269d17c8cf 1558 speed += 0.03;
jah128 8:6c92789d5f87 1559 motors.forward(speed);
jah128 0:d6269d17c8cf 1560 }
jah128 0:d6269d17c8cf 1561 switch(led_step) {
jah128 0:d6269d17c8cf 1562 case 0:
jah128 9:dde9e21030eb 1563 led.set_leds(0x01,0);
jah128 0:d6269d17c8cf 1564 break;
jah128 0:d6269d17c8cf 1565 case 1:
jah128 9:dde9e21030eb 1566 led.set_leds(0x38,0);
jah128 0:d6269d17c8cf 1567 break;
jah128 0:d6269d17c8cf 1568 case 2:
jah128 9:dde9e21030eb 1569 led.set_leds(0x6C,0);
jah128 0:d6269d17c8cf 1570 break;
jah128 0:d6269d17c8cf 1571 case 3:
jah128 9:dde9e21030eb 1572 led.set_leds(0xC6,0);
jah128 0:d6269d17c8cf 1573 break;
jah128 0:d6269d17c8cf 1574 case 4:
jah128 9:dde9e21030eb 1575 led.set_leds(0x83,0);
jah128 0:d6269d17c8cf 1576 break;
jah128 0:d6269d17c8cf 1577 }
jah128 9:dde9e21030eb 1578 led.set_center_led(2, 0.6);
jah128 0:d6269d17c8cf 1579 led_step ++;
jah128 0:d6269d17c8cf 1580 if(led_step == 5) led_step = 0;
jah128 0:d6269d17c8cf 1581 }
jah128 0:d6269d17c8cf 1582 break;
jah128 0:d6269d17c8cf 1583 }
jah128 0:d6269d17c8cf 1584 case 2: //Turn right
jah128 8:6c92789d5f87 1585 motors.set_left_motor_speed(0.85);
jah128 8:6c92789d5f87 1586 motors.set_right_motor_speed(-0.85);
jah128 0:d6269d17c8cf 1587 time_out = 0.4;
jah128 0:d6269d17c8cf 1588 state = 0;
jah128 9:dde9e21030eb 1589 led.set_leds(0x0E,0x0E);
jah128 9:dde9e21030eb 1590 led.set_center_led(3,0.5);
jah128 0:d6269d17c8cf 1591 break;
jah128 0:d6269d17c8cf 1592 case 3: //Turn left
jah128 8:6c92789d5f87 1593 motors.set_left_motor_speed(-0.85);
jah128 8:6c92789d5f87 1594 motors.set_right_motor_speed(0.85);
jah128 0:d6269d17c8cf 1595 time_out = 0.4;
jah128 0:d6269d17c8cf 1596 state = 0;
jah128 9:dde9e21030eb 1597 led.set_leds(0xE0,0xE0);
jah128 9:dde9e21030eb 1598 led.set_center_led(3,0.5);
jah128 0:d6269d17c8cf 1599 break;
jah128 0:d6269d17c8cf 1600 }
jah128 0:d6269d17c8cf 1601 demo_timer.reset();
jah128 0:d6269d17c8cf 1602 }
jah128 11:312663037b8c 1603 if(demo_running == 1)demo_timeout.attach_us(this,&Demo::obstacle_demo_cycle,200);
jah128 0:d6269d17c8cf 1604 else {
jah128 8:6c92789d5f87 1605 motors.stop();
jah128 0:d6269d17c8cf 1606 display.set_backlight_brightness(bl_brightness * 0.01f);
jah128 0:d6269d17c8cf 1607 }
jah128 0:d6269d17c8cf 1608 }
jah128 0:d6269d17c8cf 1609
jah128 16:50686c07ad07 1610
jah128 11:312663037b8c 1611 void Demo::demo_update_leds()
jah128 0:d6269d17c8cf 1612 {
jah128 0:d6269d17c8cf 1613 char red = 0;
jah128 0:d6269d17c8cf 1614 char green = 0;
jah128 0:d6269d17c8cf 1615 for(int i=0; i<8; i++) {
jah128 0:d6269d17c8cf 1616 if(led_state[i]==1 || led_state[i]==3) red+=(1<<i);
jah128 0:d6269d17c8cf 1617 if(led_state[i]==2 || led_state[i]==3) green+=(1<<i);
jah128 0:d6269d17c8cf 1618 }
jah128 9:dde9e21030eb 1619 led.set_leds(green,red);
jah128 0:d6269d17c8cf 1620 float brightness_f = brightness / 100.0f;
jah128 9:dde9e21030eb 1621 led.set_center_led(led_state[8], brightness_f);
jah128 9:dde9e21030eb 1622 led.set_base_led(base_led_state);
jah128 0:d6269d17c8cf 1623 }