//written by Martin Wewior, Sascha Germer, Mustapha Jafour

int sensorlight = 0;
int length = 0;
int abort= 0;

task main() {
  SetSensor(SENSOR_1, SENSOR_ROTATION);
  SetSensor(SENSOR_3, SENSOR_ROTATION);
  SetSensorType(SENSOR_2, SENSOR_TYPE_LIGHT);
  SetSensorMode(SENSOR_2, SENSOR_MODE_RAW);
  start light;
  start infrared;
  start rotation;
  OnFwd(OUT_A+OUT_C);
  until (abort==1);
  PlaySound(SOUND_DOUBLE_BEEP);
  stop light;
  stop infrared;
  OnFwd(OUT_A+OUT_C);
  ClearSensor(SENSOR_1);
  ClearSensor(SENSOR_3);
  until(SENSOR_1 >= abs(length+20));
  Off(OUT_A+OUT_C);
  stop rotation;
  PlaySound(SOUND_FAST_UP);
}

task light() {
  sensorlight = SENSOR_2;
  while (true) {
    if (abs(sensorlight - SENSOR_2) > 110) {
       turn();
    }
  }
}

task infrared() {
  while (true) {
    SendMessage(1);
    Wait(3);
  }
}

void turn() {
  length = SENSOR_1;
  ClearSensor(SENSOR_1);
  ClearSensor(SENSOR_3);
  OnFwd(OUT_A);
  OnRev(OUT_C);
  until (abs(SENSOR_1) > 51);
  ClearSensor(SENSOR_1);
  ClearSensor(SENSOR_3);
  stop rotation;
  OnFwd(OUT_A+OUT_C);
  Wait(10);
  start rotation;
  abort=1;
}

task rotation()
{ while(true)
  { if (abs(SENSOR_1) > abs(SENSOR_3))
    {  SetOutput(OUT_A,OUT_FLOAT);
       until (abs(SENSOR_1) <= (abs(SENSOR_3)+3));
       SetOutput(OUT_A,OUT_ON);
    }
    else if (abs(SENSOR_1) < abs(SENSOR_3))
    {  SetOutput(OUT_C,OUT_FLOAT);
       until ((abs(SENSOR_1)+3) >= abs(SENSOR_3));
       SetOutput(OUT_C,OUT_ON);
    }
    else
    { SetOutput(OUT_A+OUT_C,OUT_ON);
    }
  }
}