#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);

int tempActual = 40;

int arriba = 31;
int abajo = 35;
int set = 33;

int p; //contador de pagina
int pAnt = 0;
int p1; //contador pagina1
int p2; //contador pagina2
int p3; //contador pagina3
int p4; //contador pagina4
int p6;

void menuIni(); //pagina1
void menuTemp(); //pagina2
void menuDes(); //pagina3
void menuAjustes(); //pagina4
void temp(); //pagina5
void des(); //pagina6
//void ajustes(); //pagina7

void (*pages[])() = { menuIni, menuTemp, menuDes, menuAjustes, temp, des } ; //, ajustes
int stateUp;
int stateDw;
int stateSet;
int stateUpAnt  = 0, 
    stateDwAnt  = 0,
    stateSetAnt = 0;

void setup() {
  u8g.setFont(u8g_font_unifont);
  u8g.setColorIndex(1);
  p  = 0;
  p1 = 0;
  p2 = 0;
  p3 = 0;
  p4 = 0;
  p6 = 0;
  Serial.begin(9600);
}

void loop() {
  char buffer[20];
  u8g.firstPage();
  do {  
    (*pages[p])();
  } while( u8g.nextPage());
  if (p != pAnt) 
    Serial.println(p);
  pAnt = p;
}

void moverseMenu(int &cont, int cant){
  stateUp = digitalRead(arriba);
  stateDw = digitalRead(abajo);

  if(stateUp && !stateUpAnt ){
    if(cont>0)
      cont--;
  }
  if(stateDw && !stateDwAnt){
    if(cont<cant)
      cont++;
  }
  stateUpAnt = stateUp;
  stateDwAnt = stateDw;
  return cont;
}

void temp(){
  stateUp = digitalRead(arriba);
  stateDw = digitalRead(abajo);
  
  int textWidth1 = u8g.getStrWidth("Temperatura"); // Obtener la longitud del texto
  int textWidth2 = u8g.getStrWidth(String(tempActual).c_str()); // Obtener la longitud del texto
  int xPos = (u8g.getWidth() - textWidth1) / 2; // Calcular la posición horizontal centrada
  u8g.drawStr(xPos, 30, "Temperatura"); // Imprimir el texto centrado
  u8g.drawStr(xPos, 55, String(tempActual).c_str()); // Imprimir el texto centrado
  if(digitalRead(set)==HIGH){
    p = 1;
    delay(20);
  }
  
  if (stateUp && !stateUpAnt)
      tempActual++;
  if (stateDw && !stateDwAnt)
    tempActual--;
  
  stateUpAnt = stateUp;
  stateDwAnt = stateDw;
  return 0;
}

void des(){
  stateSet = digitalRead(set);

  moverseMenu(p6, 1);
  int textWidth1 = u8g.getStrWidth("Activar?"); // Obtener la longitud del texto
  int xPos = (u8g.getWidth() - textWidth1) / 2; // Calcular la posición horizontal centrada
  u8g.drawStr(xPos, 30, "Activar?"); // Imprimir el texto centrado

  if(p6==0){
    int textWidth = u8g.getStrWidth("No"); // Obtener la longitud del texto
    int xPos = (u8g.getWidth() - textWidth) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos, 55, "  ");
    u8g.drawStr(xPos, 55, "No"); // Imprimir el texto centrado
    if (stateSet && !stateSetAnt) 
      p = 2;
  }else if(p6==1){
    int textWidth1 = u8g.getStrWidth("Si"); // Obtener la longitud del texto
    int xPos1 = (u8g.getWidth() - textWidth1) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos1, 55, "  ");
    u8g.drawStr(xPos1, 55, "Si"); // Imprimir el texto centrado
  }
  stateSetAnt = stateSet;
  return 0;
}

void menuAjustes(){
  stateSet = digitalRead(set);

  moverseMenu(p4, 3);
  if(p4==0){
    int textWidth = u8g.getStrWidth("Config. Term."); // Obtener la longitud del texto
    int xPos = (u8g.getWidth() - textWidth) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos, 50, "Config. Term."); // Imprimir el texto centrado
     if (stateSet && !stateSetAnt)
         p = 1;
  }else if(p4==1){
    int textWidth1 = u8g.getStrWidth("Fecha y Hora"); // Obtener la longitud del texto
    int xPos1 = (u8g.getWidth() - textWidth1) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos1, 50, "Fecha y Hora"); // Imprimir el texto centrado

    if (stateSet && !stateSetAnt)
        p = 2;
  } else if(p4==2){
    int textWidth2 = u8g.getStrWidth("Config. Wi-Fi"); // Obtener la longitud del texto
    int xPos2 = (u8g.getWidth() - textWidth2) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos2, 50, "Config. Wi-Fi"); // Imprimir el texto centrado
    if (stateSet && !stateSetAnt)
        p = 3;
  } else if(p4==3){
    int textWidth1 = u8g.getStrWidth("Volver"); // Obtener la longitud del texto
    int xPos1 = (u8g.getWidth() - textWidth1) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos1, 50, "Volver"); // Imprimir el texto centrado
    if (stateSet && !stateSetAnt)
        p = 0;
  }
  stateSetAnt = stateSet;
  return 0;
}

void menuDes(){
  stateSet = digitalRead(set);

  moverseMenu(p3, 1);
  if(p3==0){
    int textWidth = u8g.getStrWidth("Activar?"); // Obtener la longitud del texto
    int xPos = (u8g.getWidth() - textWidth) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos, 50, "Activar?"); // Imprimir el texto centrado
    if (stateSet && !stateSetAnt)
        p = 5;
  } else if(p3==1){
    int textWidth1 = u8g.getStrWidth("Volver"); // Obtener la longitud del texto
    int xPos1 = (u8g.getWidth() - textWidth1) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos1, 50, "Volver"); // Imprimir el texto centrado
    if (stateSet && !stateSetAnt)
        p = 0;
  }
  stateSetAnt = stateSet;
  return 0;
}

void menuTemp(){
  stateSet = digitalRead(set);
  
  moverseMenu(p2, 1);
  if (p2==0){
    String txtTemp = "T. Actual: ";
    txtTemp.concat(tempActual);
    int textWidth = u8g.getStrWidth(String(txtTemp).c_str()); // Obtener la longitud del texto
    int xPos = (u8g.getWidth() - textWidth) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos, 50, String(txtTemp).c_str()); // Imprimir el texto centrado
    if (stateSet && !stateSetAnt)
      p = 4;
  } else if(p2==1){
    int textWidth1 = u8g.getStrWidth("Volver"); // Obtener la longitud del texto
    int xPos1 = (u8g.getWidth() - textWidth1) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos1, 50, "Volver"); // Imprimir el texto centrado
    if (stateSet && !stateSetAnt)
        p = 0;
  }
  stateSetAnt = stateSet;
  return 0;
}

void menuIni(){
  stateSet = digitalRead(set);

  moverseMenu(p1, 2);
  if(p1==0){
    int textWidth = u8g.getStrWidth("MENU1"); // Obtener la longitud del texto
    int xPos = (u8g.getWidth() - textWidth) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos, 50, "MENU1"); // Imprimir el texto centrado
    if (stateSet && !stateSetAnt)
      p = 1;

  } else if(p1==1){
    int textWidth1 = u8g.getStrWidth("MENU2"); // Obtener la longitud del texto
    int xPos1 = (u8g.getWidth() - textWidth1) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos1, 50, "MENU2"); // Imprimir el texto centrado
    if (stateSet && !stateSetAnt)
      p = 2;

  }else if(p1==2){
    int textWidth2 = u8g.getStrWidth("MENU3"); // Obtener la longitud del texto
    int xPos2 = (u8g.getWidth() - textWidth2) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos2, 50, "MENU3"); // Imprimir el texto centrado
    if (stateSet && !stateSetAnt)
       p = 3;
  }
  stateSetAnt = stateSet;
  return 0;
}
//https://github.com/olikraus/u8glib/wiki/userreference#begin
$abcdeabcde151015202530fghijfghij