int B_Rechts = 0b010; int B_Links = 0b001; int B_Heck = 0b100; int frei = 0; int crash_rechts = 1; int crash_links = 2; int crash_vorn = 3; int crash_hinten = 4; int crash_hinten_rechts = 5; int crash_hinten_links = 6; int robbi_explodiert = 7; /* Liest aus welche Bumper ausgeloest haben und */ /* ermittelt daraus die "Unfallstelle". */ int crash() { int bumpers = bumper(); if (bumpers == 0) return frei; else if (bumpers == (B_Rechts | B_Links)) return crash_vorn; else if (bumpers == B_Rechts) return crash_rechts; else if (bumpers == B_Links) return crash_links; else if (bumpers == B_Heck) return crash_hinten; else if (bumpers == (B_Heck | B_Rechts)) return crash_hinten_rechts; else if (bumpers == (B_Heck | B_Links)) return crash_hinten_links; else return robbi_explodiert; } /* Berechnet Zufallswert im Bereich [0..range-1] */ int rand(int range) { int rnd = (int)mseconds(); if (rnd >= 0) return (rnd % range); else return (-rnd % range); } void main() { int i, error, cli, action = 0; /* int mode ist global als persistente Variable deklariert. */ /* Zwischen den Modi 1 und 2 wird durch druecken des */ /* Reset-Knopfes gewechselt. */ if ( mode == 1 ) { mode = 2; /* Mode nach dem naechsten Reset wechseln. */ while (1) /* bis zum naechsten Reset */ { msleep(1000L); /* 1 Sekunde warten ... */ Stosse_ins_Horn(rand(8)); /* ... und schon wieder ein Signal! */ } } else if ( mode == 2 ) { mode = 1; /* Mode nach dem naechsten Reset wechseln. */ while(1) /* bis zum naechsten Reset */ { /* Hinten antippen zum ausloesen des Signals */ if(crash() == crash_hinten) { /* Schalterprellen abfangen */ msleep(100L); while(crash()); /* Troeh-Roeh */ Stosse_ins_Horn(action); } /* Rechts antippen zum hochzaehlen */ if(crash() == crash_rechts) { /* Schalterprellen abfangen ... */ msleep(100L); while(crash()); /* ... und raufzaehlen */ printf("%d\n",++action); } /* Links antippen zum runterzaehlen */ if(crash() == crash_links) { /* Schalterprellen abfangen ... */ msleep(100L); while(crash()); /* und runterzaehlen */ printf("%d\n",--action); } } } else mode = 2; /* Init der Variable mode beim ersten Durchlauf */ }