/* PneumaticRobot1.nqc      Gennaio 2007
   Questo programma utilizza:
   Morore_A per ruotare il braccio del Robot
   Morore_B per azionare la pompa e l'interruttore pneumatico
     (Apertura e chiusura Mano)
   Morore_C per alzare e abbassare il braccio del Robot
   Sensore_1 (contatto) per controllare il braccio (2 sensori in parallelo)
   Sensore_2 (Angle Sensor My Creation) per controllare la rotazione del braccio
                   Angle Sensor 50K
   Sensore_3 (rotazione) per controllare l'interruttore pneumatico
*/

// Definizioni delle costanti del programma
#define CENTER 0             // posizione centrale sensore di rotazione
#define ROTDX -45            // posizione destra sensore di rotazione
#define ROTSX 45             // posizione sinistra sensore di rotazione
#define ROTSWOPEN 250        // rotazione interruttore pneumatico apertura
#define ROTSWCLOSE -250      // rotazione interruttore pneumatico chiusura
// Definizioni delle variabili del programma
int angolo;                  // Angolo calcolato partendo dal valore RAW letto
int temp1;                   // Variabile temporanea per calcolo angolo

task main()
{
// *************************  CONFIGURAZIONE SENSORI  *************************
  SetSensorType(SENSOR_1, SENSOR_TYPE_TOUCH);    // sensori contatto braccio
  SetSensorMode(SENSOR_1, SENSOR_MODE_BOOL);
  SetSensorType(SENSOR_2, SENSOR_TYPE_TOUCH);    // sensore angolo rotazione
  SetSensorMode (SENSOR_2, SENSOR_MODE_RAW);    
  SetSensor (SENSOR_3, SENSOR_ROTATION);         // sensore rotaz. int. pneum.

// ****************************  INIZIO PROGRAMMA  ****************************
  start angle_sensor;                 // Avvia il task per lettura rotazione
  open();                             // Vai alla SUB per aprire la mano
  ClearSensor (SENSOR_3);                        // Reset iniziale rotazione
  OnRev(OUT_C); Wait(200);                       // Braccio su per 2 sec.
  OnRev(OUT_C);                                  // Braccio su fino a ...
  until (SENSOR_1 == 1);                         // ... posizione braccio alto
  Off(OUT_C);                                    // Stop braccio su
  OnFwd(OUT_C); Wait(100);                       // Braccio giu per 1 sec.
  OnFwd(OUT_C);                                  // Braccio giu fino a ...
  until (SENSOR_1 == 1);                         // ... posizione braccio basso
  Off(OUT_C);                                    // Stop braccio giu
  close();                            // Vai alla SUB per chiudere la mano
  rotatedx();                         // Vai alla SUB per ruotare a destra
  open();                             // Vai alla SUB per aprire la mano
  rotatesx();                         // Vai alla SUB per ruotare a sinistra
  OnFwd(OUT_C);                                  // Braccio giu fino a NON ...
  until (SENSOR_1 == 0);                         // ... posizione braccio alto
  OnFwd(OUT_C); Wait(200);                       // Braccio giu per 2 sec.
  Off(OUT_C);                                    // Stop braccio giu
  PlaySound (SOUND_FAST_UP);                     // Suono di fine programma
  StopAllTasks ();                               // ... FINE PROGRAMMA
}
// *****************************  FINE PROGRAMMA  *****************************

// ******  TASK Lettura rotazione braccio (My creation Angle Sensor)  *********
task angle_sensor()
{
while(true)
  {
    // Calcolo della posizione del sensore di rotazione
    // (N.B. per la formula di calcolo vedi la documentazione)
    temp1 = ((27 * SENSOR_2)/(1023 - SENSOR_2) * 2) - 135 ;
    angolo = temp1;
    // Visualizza la posizione del sensore ad Angolo
    //SetUserDisplay(angolo, 0);
   }
}

// **********************  SUB PER CHIUDERE LA MANO  **************************
// Questa sub permette al Robot di chiudere la mano e prelevare il pezzo
sub close()
{
  OnRev(OUT_B);                                  // On motore pompa ...
  // Visualizza la posizione del sensore di rotazione
  SetUserDisplay(SENSOR_3, 0);
  until (SENSOR_3 < ROTSWCLOSE);                 // ... fino a mano chiusa
  Toggle(OUT_B);                                 // Inverti motore pompa ...
  until (SENSOR_3 >= 0);                         // ... fino a 0
  Off(OUT_B);                                    // Stop motore pompa
}

// ***********************  SUB PER APRIRE LA MANO  **************************
// Questa sub permette al Robot di aprire la mano e posizionare il pezzo
sub open()
{
  OnFwd(OUT_B);                                  // On motore pompa ...
  // Visualizza la posizione del sensore di rotazione
  SetUserDisplay(SENSOR_3, 0);
  until (SENSOR_3 > ROTSWOPEN);                  // ... fino a mano aperta
  Toggle(OUT_B);                                 // Inverti motore pompa ...
  until (SENSOR_3 <= 0);                         // ... fino a 0
  Off(OUT_B);                                    // Stop motore pompa
}

// *******************  SUB PER RUOTARE A DESTRA IL ROBOT  ********************
// Questa sub permette al Robot di ruotare a destra
sub rotatedx()
{
  SetUserDisplay(angolo, 0);  // Visualizza la posizione del sensore ad Angolo

  OnRev(OUT_C); Wait(400);                       // Braccio su per 4 sec.
  Off(OUT_C);                                    // Stop braccio su

  OnFwd(OUT_A);                                  // Braccio a Dx fino a ...
  until (angolo < ROTDX);                        // ... posizione destra
  PlayTone(247,40);                              // Suono posizione destra
  Off (OUT_A);                                   // Stop rotazione braccio

  OnFwd(OUT_C);                                  // Braccio giu fino a ...
  until (SENSOR_1 == 1);                         // ... posizione braccio basso
  Off(OUT_C);                                    // Stop braccio giu
}

// *********  SUB PER RUOTARE A SINISTRA (FINO AL CENTRO) IL ROBOT  ***********
// Questa sub permette al Robot di ruotare a sinistra (fino al centro)
sub rotatesx()
{
  SetUserDisplay(angolo, 0);  // Visualizza la posizione del sensore ad Angolo

  OnRev(OUT_C); Wait(400);                       // Braccio su per 4 sec.
  Off(OUT_C);                                    // Stop braccio su

  OnRev(OUT_A);                                  // Braccio a Sx fino a ...
  until (angolo > CENTER);                       // ... posizione centrale
  PlayTone(247,40);                              // Suono posizione centrale
  Off (OUT_A);                                   // Stop rotazione braccio

  OnRev(OUT_C);                                  // Braccio su fino a ...
  until (SENSOR_1 == 1);                         // ... posizione braccio alto
  Off(OUT_C);                                    // Stop braccio su
}

