Subversion Repositories svnkaklik

Rev

Go to most recent revision | Blame | Last modification | View Log | Download

#define THRESHOLD  44     // rozhodovaci uroven mezi cernou a bilou
#define RED_WHITE  60     // maximum bile na cervenem senzoru
#define MLEFT     OUT_A
#define MRIGHT    OUT_C
#define BLUE      SENSOR_3
#define RED       SENSOR_2
#define BBUMPER   SENSOR_1
#define START_ALL start blue_bumper; start cara_cervena; start cara_modra;

int semafor;

task main()
{
  PlaySound (SOUND_DOUBLE_BEEP);
  Wait(500); // 5s podle pravidel
  SetSensor(BLUE,SENSOR_LIGHT);   // senzor na caru modry
  SetSensor(RED,_SENSOR_CFG(SENSOR_TYPE_LIGHT, SENSOR_MODE_RAW)); // senzor na caru cerveny
  SetSensor(BBUMPER, SENSOR_TOUCH);  // naraznik modry
  SetSensorMode (BBUMPER, SENSOR_MODE_BOOL); // koncak bude ...
  SetPower (MLEFT,OUT_FULL);
  SetPower (MRIGHT,OUT_FULL);
  SetDirection(MLEFT, OUT_FWD);
  SetDirection(MRIGHT, OUT_FWD);
  SetTxPower(TX_POWER_HI);    // aby daleko videl

  OnFwd (MLEFT);         // cuknuti na shozeni radlic
  OnFwd (MRIGHT);
  Wait(20);
  OnRev (MLEFT);
  OnRev (MRIGHT);
  Wait(70);
  Off(MLEFT);
  Off(MRIGHT);

  Wait(20);  // pockej na ustaleni narazniku

  // rozjed tasky
  start blue_bumper;
  start cervena;
  start cara_modra;
  start stochastika;
}

task stochastika()        // nahodne otaceni
{
  while(true) Zatoc();
}

void GoBlue()       // pojezd ve smeru modreho senzoru
{
  OnFwd (MLEFT);
  OnFwd (MRIGHT);
  Wait(300);              // popojed kus
  Off(MLEFT);
  Off(MRIGHT);
}

void GoRed()         // pojezd ve smeru cerveneho senzoru
{
  OnRev (MLEFT);
  OnRev (MRIGHT);
  Wait(300);              // popojed kus
  Off(MLEFT);
  Off(MRIGHT);
}

void Obrat()         // obrat o 180 stupnu
{
  OnRev (MLEFT);
  OnFwd (MRIGHT);
  Wait(125);              // popojed kus
  Off(MLEFT);
  Off(MRIGHT);
}

void Zatoc()  // nahodne zatoceni, nebo popojeti
{
  switch (Random(1))
  {
    case 0:
     OnRev (MLEFT);
     OnFwd (MRIGHT);
     Wait(50);
     break;
    case 1:
     OnFwd (MLEFT);
     OnRev (MRIGHT);
     Wait(50);
     break;
    case 2:
     OnRev (MLEFT);
     OnRev (MRIGHT);
     Wait(70);
     break;
    case 3:
     OnFwd (MLEFT);
     OnFwd (MRIGHT);
     Wait(70);
     break;
  }
}

task blue_bumper() // naraznik na modre strane
{
  while(true)
  {
    if (1 == BBUMPER) // utoc, kdyz neco narazi do narazniku
    {
      stop stochastika;
      PlaySound (SOUND_FAST_UP);
      OnFwd (MLEFT);
      OnFwd (MRIGHT);
      Wait(50);
    }
  }
}

task cervena() // dalkovy sensor
{
  int lastlevel;

  lastlevel = 0;
  while(true)
  {
    SendMessage(0);
    if(lastlevel > SENSOR_2)
    {
      PlaySound(SOUND_FAST_UP);
      stop stochastika;
      OnRev (MLEFT);
      OnRev (MRIGHT);
      Wait(10);              // popojed kus
      Off(MLEFT);
      Off(MRIGHT);
      Obrat();
      GoBlue();
      start stochastika;
    }
    lastlevel = SENSOR_2;
    lastlevel -= THRESHOLD;
  }
}

task cara_modra()    // hlidani cary
{
  while(true)
  {
     if (BLUE < THRESHOLD)    // cekej na caru
     {
        PlaySound (SOUND_DOUBLE_BEEP);
        stop blue_bumper;
        stop stochastika;
        stop cervena;
        GoRed();
        start cervena;
        start blue_bumper;
        start stochastika;
     }
  }
}