#define THRESH_1 8 #define THRESH_2 23 #define FACTOR_2 31 #define THRESH_4 55 #define FACTOR_4 64 #define THRESH_8 117 #define FACTOR_8 124 int leftOutside, leftInside, rightInside, rightOutside; int skip; task main() { SetSensorType(SENSOR_1, SENSOR_TYPE_TOUCH); //Turn off light power SetSensorType(SENSOR_2, SENSOR_TYPE_TOUCH); //4 bit DtoA converter SetSensorMode(SENSOR_2, SENSOR_MODE_RAW); //Raw mode SetSensorType(SENSOR_3, SENSOR_TYPE_TOUCH); //Turn off light power while (true) { Off(OUT_A + OUT_C); //Stop do //Wait until feet touch ground { ReadSensors(); } until (leftOutside + leftInside + rightOutside + rightInside < 4); skip = 0; OnRev(OUT_A + OUT_C); //Reverse to back edge of traverse WaitWatching(60); if (skip != 0) continue; Off(OUT_A + OUT_C); //Stop WaitWatching(5); if (skip != 0) continue; OnFwd(OUT_A + OUT_C); //Forward to front edge of traverse WaitWatching(120); if (skip != 0) continue; Off(OUT_A + OUT_C); //Stop WaitWatching(5); if (skip != 0) continue; OnRev(OUT_A + OUT_C); //Reverse to center of traverse WaitWatching(60); if (skip != 0) continue; Off(OUT_A + OUT_C); //Stop WaitWatching(5); if (skip != 0) continue; OnFwd(OUT_A); //Turn right in place to face right OnRev(OUT_C); WaitWatching(100); if (skip != 0) continue; Off(OUT_A + OUT_C); //Stop WaitWatching(5); if (skip != 0) continue; OnFwd(OUT_A + OUT_C); //Forward to right edge of traverse WaitWatching(60); if (skip != 0) continue; Off(OUT_A + OUT_C); //Stop WaitWatching(5); if (skip != 0) continue; OnRev(OUT_A + OUT_C); //Reverse to left edge of traverse WaitWatching(120); if (skip != 0) continue; Off(OUT_A + OUT_C); //Stop WaitWatching(5); if (skip != 0) continue; OnFwd(OUT_A + OUT_C); //Forward to center of traverse WaitWatching(60); if (skip != 0) continue; Off(OUT_A + OUT_C); //Stop WaitWatching(5); if (skip != 0) continue; OnRev(OUT_A); //Turn left in place to face forward OnFwd(OUT_C); WaitWatching(100); if (skip != 0) continue; Off(OUT_A + OUT_C); //Stop WaitWatching(5); if (skip != 0) continue; break; //Quit } } void WaitWatching(int time) //Wait time 10ths of a second { ClearTimer(0); while (Timer(0) < time) { continue; //Ignore the sensors for now ReadSensors(); if (leftOutside + leftInside + rightOutside + rightInside > 3) { skip = 1; break; } } } int sensor, level; sub ReadSensors() { sensor = SENSOR_2; level = sensor * 32 / (1024 - sensor); if (level < THRESH_8) rightOutside = 0; else { rightOutside = 1; level = level - FACTOR_8; } if (level < THRESH_4) rightInside = 0; else { rightInside = 1; level = level - FACTOR_4; } if (level < THRESH_2) leftInside = 0; else { leftInside = 1; level = level - FACTOR_2; } if (level < THRESH_1) leftOutside = 0; else leftOutside = 1; }