/****  import des biblioteques ****/ 
        
#include <SPI.h>
#include <RF24.h>

        /**** definition des constantes et variables ****/ 

  // pour le pad et les boutons du joystick \\
  
#define PAD_X A0
#define PAD_Y A1
#define BOUTON_PAD 8
#define BOUTON_A 2
#define BOUTON_B 3
#define BOUTON_C 4
#define BOUTON_D 5
#define BOUTON_E 6
#define BOUTON_F 7

//#define DELAY 25    // pour debug

enum { STOP, AVANT1, ARRIERE1, AVANT2, ARRIERE2, DROITE, GAUCHE,
       AV1_DROITE, AV1_GAUCHE , AR1_DROITE, AR1_GAUCHE,          
       AV2_DROITE, AV2_GAUCHE , AR2_DROITE, AR2_GAUCHE,        
       PAD, A, B, C, D, E, F };


const uint64_t addresse = 0x1111111111;
int message;

int x_direction = 0;
int y_direction = 0;

int YseuilvitAV1AV2 = 1022;
int Yseuil0Min = 525;
int Yseuil0Max = 535;
int YseuilvitAR1AR2 = 1;

int Xseuil0Max = 505;
int Xseuil0Min = 500;

RF24 radio(9, 10);

          /**** le setup ****/

void setup(void)
{
  //Serial.begin(115200);      // pour debug
  //Serial.println("Joystick shield demo");   // pour debug
  radio.begin();
  radio.openWritingPipe(addresse);
  for (int GPIO = 0; GPIO <= 8; GPIO++) {
    pinMode(GPIO, INPUT);
    digitalWrite(GPIO, HIGH);
  }
}

          /**** La fonction "envoi(xxx)"  qui envoi la commande ***/

void envoi(const byte com)
{           
  switch (com) {
    case STOP : message = 0 ; // "STOP"   
    break; 
    case AVANT1 : message = 1; // "AVANT1"; 
    break; 
    case ARRIERE1 : message = -1; // "ARRIERE"; 
    break;
    case AVANT2 : message = 2; // "AVANT2"; 
    break;
    case ARRIERE2 : message = -2; // "ARRIERE2"; 
    break;
    case DROITE : message = 3; // "DROITE"; 
    break;
    case GAUCHE : message = 4; // "GAUCHE"; 
    break;
    case AV1_DROITE : message = 13; // "AV1_DROITE"; 
    break;
    case AV1_GAUCHE : message = 14; // "AV1_GAUCHE"; 
    break;
    case AR1_DROITE : message = -13; // "AR1_DROITE"; 
    break;
    case AR1_GAUCHE : message = -14; // "AR1_GAUCHE"; 
    break;
    case AV2_DROITE : message = 23; // "AV2_DROITE"; 
    break;
    case AV2_GAUCHE : message = 24; // "AV2_GAUCHE"; 
    break; 
    case AR2_DROITE : message = -23; // "AR2_DROITE"; 
    break;
    case AR2_GAUCHE : message = -24; // "AR2_GAUCHE";
    break; 
    case PAD : message = 5 ; // "PAD"   
    break;
    case A : message = 6 ; // "A"   
    break;
    case B : message = 7 ; // "B"   
    break;
    case C : message = 8 ; // "C"   
    break;
    case D : message = 9 ; // "D"   
    break;
    case E : message = 10 ; // "E"   
    break;
    case F : message = 11 ; // "F"   
    break;    
}   
    //Serial.println(int(message));  // pour debug
    radio.powerUp(); //alimente le module nrf24l01+
    delay(10);
    // transmition du buffer vers l'arduino recepteur
    radio.write(&message, sizeof(message));  
    delay(50);
    radio.powerDown(); // arrêt de l’alimentation du module nrf24l01+ 
}

          /*****  la boucle ****/

void loop () {

  int axeX = analogRead(PAD_X);
  int axeY = analogRead(PAD_Y);

   //Serial.println(axeX);   // pour debug
   //Serial.println(axeY);   // pour debug

  ////////////////////////// DEFINITION DES POSITION SUR X EN FONCTION DES SEUILS \\\\\\\\\\\\\\\\\\\\\\\\\\\

  if ( axeX < Xseuil0Min )
  {
    //Serial.println("à gauche (135°)");  // pour debug
    x_direction = 1;
  }
  else if ( axeX > Xseuil0Max )
  {
    //Serial.println("à droite (45°)");  // pour debug
    x_direction = -1;
  }   
  else
  {
    //Serial.println("tout droit (90°)");  // pour debug
    x_direction = 0;
  }

  ////////////////////////// DEFINITION DES POSITION SUR Y EN FONCTION DES SEUILS \\\\\\\\\\\\\\\\\\\\\\\\\\\

  if ( axeY > YseuilvitAV1AV2 )
  {
    //Serial.println("en avant vitesse 2");  // pour debug
    y_direction = 2;
  }
  else if ( axeY > Yseuil0Max && axeY <= YseuilvitAV1AV2 )
  {
    //Serial.println("en avant vitesse 1");  // pour debug
    y_direction = 1;
  }
  else if ( axeY < Yseuil0Min && axeY >= YseuilvitAR1AR2 )
  {
    //Serial.println("en arriere vitesse 1");  // pour debug
    y_direction = -1;
  }
  else if ( axeY < YseuilvitAR1AR2 )
  {
    //Serial.println("en arriere vitesse 2");  // pour debug
    y_direction = -2;
  }
  else
  {
    //Serial.println("arret");  // pour debug
    y_direction = 0;
  }

  ////////////////////////// ENVOI DES COMMANDES EN FONCTION DES POSITION SUR X ET Y \\\\\\\\\\\\\\\\\\\\\\\\\\\


  if ( y_direction == 0 and x_direction == 0 ) {
    //Serial.println("ARRET TOUT DROIT");   // pour debug
    envoi(STOP); 
  }  
  else if  ( y_direction == 0 and  x_direction == -1 ) {
    //Serial.println("A DROITE");     // pour debug
    envoi(DROITE); 
  }
  else if ( y_direction == 0 and x_direction == 1 ) {
    //Serial.println("A GAUCHE");   // pour debug
    envoi(GAUCHE);
  }  
  else if ( y_direction == -1 and x_direction == 0 ) {
    //Serial.println("EN ARRIERE VITESSE 1");   // pour debug
    envoi(ARRIERE1);   
  }
  else if ( y_direction == 1 and  x_direction == 0 ) {
    //Serial.println("EN AVANT VITESSE 1");    // pour debug
    envoi(AVANT1); 
  }
  else if ( y_direction == -2 and x_direction == 0 ) {
    //Serial.println("EN ARRIERE VITESSE 2");  // pour debug
    envoi(ARRIERE2);    
  }
  else if ( y_direction == 2 and  x_direction == 0 ) {
    //Serial.println("EN AVANT VITESSE 2");    // pour debug
    envoi(AVANT2); 
  }  
  else if ( y_direction == -1  and  x_direction == -1 ) {
    //Serial.println("EN ARRIERE VITESSE 1 A DROITE");  // pour debug
    envoi(AR1_DROITE);  
  }
  else if ( y_direction == -1 and  x_direction == 1 ) {
    //Serial.println("EN ARRIERE VITESSE 1 A GAUCHE");    // pour debug
    envoi(AR1_GAUCHE);
  }    
  else if ( y_direction == -2  and  x_direction == -1 ) {
    //Serial.println("EN ARRIERE VITESSE 2 A DROITE");    // pour debug
    envoi(AR2_DROITE);
  }
  else if ( y_direction == -2 and  x_direction == 1 ) {
    //Serial.println("EN ARRIERE VITESSE 2 A GAUCHE");    // pour debug
    envoi(AR2_GAUCHE);
  } 
  else if ( y_direction == 1  and  x_direction == -1 ) {
    //Serial.println("EN AVANT VITESSE 1 A DROITE");    // pour debug
    envoi(AV1_DROITE);
  }
  else if ( y_direction == 1 and  x_direction == 1 ) {
    //Serial.println("EN AVANT VITESSE 1 A GAUCHE");    // pour debug
    envoi(AV1_GAUCHE);
  }    
  else if ( y_direction == 2  and  x_direction == -1 ) {
    //Serial.println("EN AVANT VITESSE 2 A DROITE");    // pour debug
    envoi(AV2_DROITE);
  }
  else if ( y_direction == 2 and  x_direction == 1 ) {
    //Serial.println("EN AVANT VITESSE 2 A GAUCHE");    // pour debug
    envoi(AV2_GAUCHE);
  }  

  ////////////////////////// ENVOI DES COMMANDES EN FONCTION DES BOUTONS \\\\\\\\\\\\\\\\\\\\\\\\\\\

  if (digitalRead(BOUTON_PAD) == LOW) {
    //Serial.println(" BOUTON PAD ");    // pour debug
    envoi(PAD);
    //delay(DELAY);               // pour debug
  }
  else if (digitalRead(BOUTON_A) == LOW) {
    //Serial.println(" BOUTON A ");    // pour debug
    envoi(A);
    //delay(DELAY);               // pour debug
  }
  else if (digitalRead(BOUTON_B) == LOW) {
   //Serial.println(" BOUTON B ");     // pour debug
   envoi(B);
   //delay(DELAY);
  }
  else if(digitalRead(BOUTON_C) == LOW) {
   //Serial.println(" BOUTON C ");     // pour debug
   envoi(C);
   //delay(DELAY);
   }  
  else if(digitalRead(BOUTON_D) == LOW) {  
    //Serial.println(" BOUTON D ");    // pour debug
    envoi(D);
    //delay(DELAY);             // pour debug
  }  
  else if(digitalRead(BOUTON_E) == LOW) {  
    //Serial.println(" BOUTON E ");    // pour debug
    envoi(E);
    //delay(DELAY);              // pour debug
  }  
  else if(digitalRead(BOUTON_F) == LOW) {  
    //Serial.println(" BOUTON F ");    // pour debug
    envoi(F);
    //delay(DELAY);             // pour debug
  } 
  //delay(500); // pour debug  
}