/* MioRobot1.nqc      Dicembre 2005
/* Questo programma utilizza:
   Morore_A per far muovere il braccio di lancio
   Morore_B per far accendere la LEGOlamp (luce per sensore di prossimità)
   Morore_C per andare avanti e girare andando indietro
   Sensore_1 (contatto) per la mano da stringere
   Sensore_2 (luce) per leggere la luce riflessa (sensore di prossimità)
   Sensore_3 (contatto) per controllare il paraurti
*/

// Definizioni delle costanti del programma
#define LANCIO 227            // tempo di lancio
#define RETROMARCIA 300       // tempo di retromarcia
#define LUCE_BASSA 600        // valore basso della luce letta
#define LUCE_ALTA 720         // valore alto della luce letta
   
task main()
{
// Task principale. Configurazione sensori
  SetSensorType(SENSOR_1, SENSOR_TYPE_TOUCH);
  SetSensorMode (SENSOR_1, SENSOR_MODE_BOOL);
  SetSensorType(SENSOR_2, SENSOR_TYPE_LIGHT);
  SetSensorMode(SENSOR_2, SENSOR_MODE_RAW);
  SetSensorType(SENSOR_3, SENSOR_TYPE_TOUCH);
  SetSensorMode (SENSOR_3, SENSOR_MODE_BOOL);
// Task principale. Il robot inizia ad avanzare
  OnFwd(OUT_C);
// Task principale. Chiamata dei task
  start verifica_paraurti;
  start verifica_sensore_prossimita;
  start verifica_stretta_di_mano;
}

task verifica_paraurti()
/* Questo task verifica il paraurti.
   Il programma controlla in continuazione l'INPUT 3,
   se viene premuto il paraurti, il robot emette 4 beep
   e inverte la marcia per il tempo di RETROMARCIA
*/
{
  while(true)
  {
    if(SENSOR_3 == 1)
    {
      PlaySound (SOUND_DOUBLE_BEEP);
      PlaySound (SOUND_DOUBLE_BEEP);
      OnRev(OUT_C); Wait(RETROMARCIA);
      OnFwd(OUT_C);
    }
  }
}

task verifica_sensore_prossimita()
/* Questo task permette di realizzare un sensore di prossimità
   utilizzando un sensore di luce e LegoLamp.
   Il programma controlla in continuazione l'INPUT 2 (valore RAW)
   il valore della luce emesso da LegoLamp e letto dal sensore di
   luce; quando il valore RAW è compreso tra LUCE_BASSA e LUCE_ALTA
   (valori da impostare in ogni situazione), il robot emette 2 beep
   e inverte la marcia per il tempo di RETROMARCIA
      N.B. Per far funzionare il sensore di prossimità è necessario che
           l'illuminazione nel locale sia uniforme e i valori LUCE_BASSA
           e LUCE_ALTA siano impostati correttamente.
           In caso di malfunzionamenti, scollegare l'INPUT 2
           e l'OUTPUT B.
*/
{
  while(true)
  {
    OnFwd(OUT_B);
    // Se letto un valore compreso tra LUCE_BASSA e LUCE_ALTA
    // (ostacolo in avvicinamento)
    if ((SENSOR_2 >= LUCE_BASSA) && (SENSOR_2 <= LUCE_ALTA))
    {
      PlaySound (SOUND_DOUBLE_BEEP);
      OnRev(OUT_C); Wait(RETROMARCIA);
      OnFwd(OUT_C);
    }
  }
}

task verifica_stretta_di_mano()
/* Questo task verifica il braccio da stringere.
   Il programma controlla in continuazione l'INPUT 1,
   se viene stretta la mano, il robot emette un suono e effettua
   un 1° lancio; dopo 2 sec. effettua il 2° lancio
*/
{
  while(true)
  {
    if(SENSOR_1 == 0)
    {
      PlaySound (SOUND_UP);
      PlaySound (SOUND_DOWN);
      OnFwd(OUT_A); Wait(LANCIO);
      Off(OUT_A); Wait(100);
      PlaySound (SOUND_CLICK); Wait(100);
      PlaySound (SOUND_CLICK); Wait(100);
      PlaySound (SOUND_CLICK);
      OnFwd(OUT_A); Wait(LANCIO);
      Off(OUT_A);
    }
  }
}


