/* metasesns.c */ /* requires turtle.c, timer.c, avoid.c */ void random_avoid() { backward(); sleep(.4); set_beeper_pitch(1000.); beeper_on(); if (random(2) == 0) left(); else right(); sleep((float)random(100)/100. + .5); beeper_off(); } void left_avoid() { backward(); sleep(.4); right(); sleep(.4); } void right_avoid() { backward(); sleep(.4); left(); sleep(.4); } int LEFT_MOTOR= 0; int RIGHT_MOTOR= 3; void forward() { fd(LEFT_MOTOR); fd(RIGHT_MOTOR); } void backward() { bk(LEFT_MOTOR); bk(RIGHT_MOTOR); } void right() { fd(LEFT_MOTOR); bk(RIGHT_MOTOR); } void left() { fd(RIGHT_MOTOR); bk(LEFT_MOTOR); } void stop() { off(LEFT_MOTOR); off(RIGHT_MOTOR); } /* timer.c */ float _timer; void reset_timer() { _timer= seconds(); } float timer() { return seconds() - _timer; } int LEFT_TOUCH= 14; int RIGHT_TOUCH= 13; void main() { int recent_bumps= 0; reset_timer(); while (1) { forward(); if (digital (LEFT_TOUCH)) { if (timer() < 2.) /* last bump reset? */ { if (recent_bumps == 5) /* yes; many recent? */ { random_avoid(); /* yes; perform avoid */ reset_timer(); recent_bumps= 0; } else { /* normal avoid, increment, and reset */ left_avoid(); reset_timer(); recent_bumps++; } }else { /* haven't bumped for a while */ left_avoid(); reset_timer(); recent_bumps= 1; } } if (digital (RIGHT_TOUCH)) { if (timer() < 2.) /* last bump recent? */ { if (recent_bumps == 5) /* yes; many recent? */ { random_avoid(); /* yes; perform avoid */ reset_timer(); recent_bumps= 0; } else { /* normal avoid, increment, and reset */ right_avoid(); reset_timer(); recent_bumps++; } } else { right_avoid(); reset_timer(); recent_bumps= 1; } } } }