#include <LiquidCrystal_I2C.h>

uint8_t button_estate = HIGH;
int   VRx = 0;
int   VRy = 0;
const int SW  = 2;
int   btn_push, mapX, mapY, btnRead, numero_menu = 1, sub_menu = 0, sub_menu2 = 0;
int line[5]={0,1,2,3,4}, line_bk[5], line_bk2[5], index, index2;
LiquidCrystal_I2C lcd(0x27,16,3); 

void setup() {
  // placez votre code d'installation ici, à exécuter une fois.
  //  Serial.begin(9600);
    pinMode(SW, INPUT_PULLUP);
    lcd.init();
    lcd.backlight(); 
    }

uint8_t flancoSubida(){
  uint8_t nouvelle_valeur = digitalRead(SW);
  uint8_t result = button_estate != nouvelle_valeur && nouvelle_valeur == 1;
  button_estate = nouvelle_valeur;
  return result;
  }

int leeJoystick(){
  VRx = analogRead(A0); 
  VRy = analogRead(A1);
  mapX = map(VRx, 0, 1023, 0, 7); // Navigation gauche-droite [1-2]
  mapY = map(VRy, 0, 1023, 7, 0); // Navigation haut - bas    [3-4]
  btn_push = flancoSubida();      // appuyez sur Entrée       [ 5 ]
                                  // Déplacement du joystick  [ 0 ]
  if(mapX == 0){btnRead = 1;}
  else if(mapX == 7) {btnRead = 2;}
       else if( (mapY == 7) && (sub_menu2 == false)) {btnRead = 3;}
            else if( (mapY == 0) && (sub_menu2 == false)) {btnRead = 4;}
                 else if(btn_push == 1) {btnRead = 5;}
                      else btnRead = 0;
  return btnRead;                      
  }

// Menu coulissant avec joystick sur écran LCD
void selec_menu(){
  switch(btnRead){
  case 4:
        menu_top();
        numero_menu+=1;
        if(numero_menu > 5) numero_menu =1; //menu_number choisit le sous-menu.
  break;
  case 3:
        menu_bas();
        numero_menu-=1;
        if(numero_menu < 1) numero_menu =5; //menu_number choisit le sous-menu.
  break;           
  case 2:// vers la droite
      
        sub_menu=true; sub_menu2=true;
        //lcd.clear();
  break;
  case 1:// vers la gauche
       
        sub_menu=false; sub_menu2=false;
        //lcd.clear();
  break;
  case 5:
        sub_menu=true; sub_menu2=true;
        //lcd.clear();
  break;
  case 0:
       
  break;  
  }
  }
void menu_top(){
    for(int i=4; i>-1; i--) 
  {
     index = i-1;
     line_bk[i] = line[i];  
     if(index < 0) line[i] = line_bk[i+4];
     else line[i] = line[i-1];
  }
}
void menu_bas(){
    for(int j=0; j < 5; j++)
  {
      index2 = j+1;
      line_bk2[j]=line[j];
      if (index2 > 4) line[j]=line_bk2[j-4] ;
      else line[j]=line[j+1];
  }
  }  

void printMenu(){
 
  lcd.setCursor(0,0);
  lcd.print(">");
    lcd.setCursor(1,line[0]);
    lcd.print("1) M E N U    1 ");
    lcd.setCursor(1,line[1]);
    lcd.print("2) M E N U    2 ");
    lcd.setCursor(1,line[2]);
    lcd.print("3) M E N U    3 ");
    lcd.setCursor(1,line[3]);
    lcd.print("4) M E N U    4 ");
    lcd.setCursor(1,line[4]);
    lcd.print("5) M E N U    5 ");
  }
void printSubMenu(){
    lcd.setCursor(0,0);
    lcd.print(">");
      switch(numero_menu){                   
      case 1:                              
            lcd.setCursor(1,0);
            lcd.print("Temp       C    ");
            lcd.setCursor(1,1);
            lcd.print("Humidite   %    ");          
      break;
      case 2:
            lcd.setCursor(1,0);
            lcd.print("Tension efficace");
            lcd.setCursor(1,1);
            lcd.print("        ...     ");
      break;
      case 3:
            lcd.setCursor(1,0);
            lcd.print(" connexion eth0 ");
            lcd.setCursor(0,1);
            lcd.print("        ...     ");
      break;
      case 4:
            lcd.setCursor(1,0);
            lcd.print(" Porte ouverte ");
            lcd.setCursor(0,1);
            lcd.print("        ...     ");
      break;
      case 5:
            lcd.setCursor(1,0);
            lcd.print(" Alertes        ");
            lcd.setCursor(0,1);
            lcd.print("        ...     ");
      break;
      }
   }//del if
  

void loop() {
  // put your main code here, to run repeatedly:
 
 leeJoystick(); // Manette de jeu.
 selec_menu();
 if(!sub_menu)  { printMenu();}
 if(sub_menu2) { printSubMenu();}
 
 
}