//https://create.arduino.cc/projecthub/electropeak/using-1602-lcd-keypad-shield-w-arduino-w-examples-e02d95
#include <LiquidCrystal.h>
#include <string.h>
//#include <TimerOne.h>"
const uint8_t  PARAM_SZAM      =15;       // paraméterek száma 
const uint8_t  TERMOSZT        =A4;       // láb  a termosztáthoz
const uint32_t SOHA            =0UL-1;    // végtelen idő. Ha egy időpont nem érdekes, ezt kapja, 

#define     VENTI_KESES    400            // Ne csigával egyszerre induljon
#define     CSIGABE        1              //A csiga erre indul el [0/1]
#define     CSIGAKI        !CSIGABE       //A CSIGABE ellentettje
#define     TERMOSZBE      0              // A termosz fűtést kér
#define     TERMOSZKI      !TERMOSZBE     // Termosz kikapcsolást kér
#define     ALLAPOTIR         Serial<<"    >T(3) : "<<termoszJel<<"      CS(7) : " <<digitalRead(CSIGA)<< "     VENTI :  \n"
uint8_t     termoszJel      ;              //A Termoszláb értéke (0/1);
uint8_t     termoszMult    =255;           //A Termoszláb előző értéke ;
uint32_t    ventiGyorsLesz =0;             //be/kikapcsolási időpontok  (millis)
uint32_t    ventiLassuLesz =SOHA;
uint32_t    csigaBeLesz    =0;            //időpont Millis()
uint32_t    csigaKiLesz    =0;            //Időpont Millis
uint32_t    most;                         //aktuális idő  (millis)
volatile uint32_t nyomva  =SOHA;         

//LCD lábak 
  const int pin_RS = 8;
  const int pin_EN = 9;
  const int pin_d4 = 4;
  const int pin_d5 = 5;
  const int pin_d6 = 6;
  const int pin_d7 = 7;
  const int pin_BL = 10;
LiquidCrystal lcd( pin_RS,  pin_EN,  pin_d4,  pin_d5,  pin_d6,  pin_d7);

enum gombok {ENTER,LEFT,DOWN,UP,RIGHT};
enum szint  {FOKEP,MENU,ALLITO};
szint     menu_Szint=0;

typedef struct {
  int16_t   x;                  //Paraméter értéke
  uint8_t   oszl;               //oszlop a főképen
  uint8_t   sor;                //sor  a főképen
  uint8_t   lab;                //Mikrokontroller láb száma
  int16_t   oszto;              //kiírás nagyságrendje
  uint8_t  irhato_e;           //fix-vagy írható?
  char      txt[17];            //megnevezés
  char      egyseg[4];          //Mértékegység
} param;
// 12334567890123456 KezdőképAlapállapot
//╔════════════════╗  Jelmagyarázat:
//║79°78%12s 45 198║   |előre:79°|ventifűt:78%pwm||adagszünet_Füt:12|adagidő:0,45 mp|Kémény:198°
//║61 35%30  65 125║   |visszaág:61°|VEntitart35%pwm||adagszünet_tart:30 Szivattyú be:65°|Lambda 125 |
//╚════════════════╝
char kepsor[4][17]=
{ "     %  s   \'   ",
  "                ",
  "Ld     SzivKi   ",
  "    p-re_megy  ",
};
//          x, érték, oszl, sor, lab,oszto, irhato, txt          , egység
param X[PARAM_SZAM]= //                          0123456789012345
            { {78,     4,    0,  0,  1,      2, "PWM % futes:"   ,"%" },//PWM% Fűtéskor
              {35,     4,    1,  0,  1,      2, "PWM % Tuz.tart:","%" },//PWM% Tűztartáskor
              {11000,  7,    0,  0,  1000,   2, "Cs.szunet fut:" ,"ms"},//msec csigaszünet Fűtéskor
              {30000,  7,    1,  0,  1000,   2, "Cs.szunet tart:","ms"},//msec csigaszünet tűztartáskor
              {450,   11,    0,  0,  10,     3, "Csigamenetido:" ,"ms"},//msec Csiga menetidő
              {65,    11,    1,  0,  1,      2, "Sziv bekapcs :" ,"C" },//C°   Szivattyú bekapcsolási hőm.
              {55,    12,    2,  0,  1,      2, "Sziv kikapcs :" ,"C" },//C°   Sziv kikapcsolási hőm.
              {65,     2,    3,  0,  1,      2, "Tisztitaskoz"   ,"min"},//prc Időköz nagyadag tisztításkor
              {65,    15,    3,  0,  1,      2, "Tisztitas ido"  ,"sec"},//ms  Menetidő nagyadag tisztításkor
              {90,    0,     0,  0,  1,      2, "Vesz homers."   ,"C" },//C°   Túlmelegedési küszöb
              {76,     1,    0,  0,  1,      0, ""               ,"C" },//c°   Előremenő víz hőm.
              {53,     1,    1,  0,  1,      0, ""               ,"C" },//C°   Viszzajövő hőm.
              {198,   15,    0,  0,  1,      0, ""               ,"C" },//C°   Kémény hőm.
              {125,   15,    1,  0,  1,      0, "Lambda"         ,"Lam"},//    Lambda érték
              {  2,   15,    2,  0,  1,      0, ""               ,"C" },//C°   Külső hőmérséklet            
};

enum param_t {venti_Fut, venti_Tart,  csigaSz_Fut, csigaSz_Tart,  csiga_Megy, t_SzivBe, \
              t_SzivKi,  tiszt_Koz, tiszt_Tartam, t_Vesz, t_Elore , t_Vissza, t_Kemeny, Lambda, t_Kinti };
/*void xprintx(char* cel, const int32_t valtozo, uint8_t m )
 { uint8_t x=0;
  if   ( valtozo < 0)  x++;
  if   (abs(valtozo)<10) ;
  else (abs(valtozo)<100) ? x++ :  x +=2;
  memccopy(&cel,&puff,x);
  lcd.setCursor(oszl,sor);
  lcd.print(valtozo);
 }

void printx(int16_t valtozo, uint8_t oszl, uint8_t sor )
 { if   (valtozo<0)  oszl--;
  if   (abs(valtozo)<10) ;
  else (abs(valtozo)<100) ? oszl-- : oszl -=2;
  lcd.setCursor(oszl,sor);
  lcd.print(valtozo);
 }
*/

 
void beilleszt(param *adat)
{ char tar[]="     ";
  itoa(adat->x/adat->oszto, tar, DEC);
  uint8_t hossz=strlen(tar);
  memcpy(&kepsor[adat->sor][adat->oszl-hossz+1], tar, hossz);
}

void fkep()
{ for( uint8_t i=0 ; i<t_Kinti ;  ( i== t_SzivBe) ? i=t_Elore : i++ ) beilleszt(&X[i]);
  lcd.setCursor(0, 0);  lcd.print(kepsor[0]);
  lcd.setCursor(0, 1);  lcd.print(kepsor[1]);
}
void nyomas(void) 
{ nyomva=millis()+50;
}

void akcio_Menu(gombok gomb)
{ static uint8_t aktiv_Sor;
  switch (menu_Szint)
  { case FOKEP:     ////////////////////  Főkép
      aktiv_Sor=0;
      if (gomb==ENTER || gomb==RIGHT)
      {  menu_Szint=MENU;
        lcd.clear();
        lcd.noCursor();
        lcd.print(X[venti_Fut].txt);
        lcd.setCursor(0,1);
        lcd.print(X[venti_Fut].x);lcd.print("  ");lcd.print(X[venti_Fut].egyseg);lcd.print("  ");
      } 
    break;

    case MENU:      //////////////////  Menü
      switch (gomb)
      { case RIGHT:
        case ENTER:
          menu_Szint=ALLITO;
          lcd.setCursor(1,1);lcd.cursor(); lcd.blink();
        break;
        case LEFT:
          menu_Szint=FOKEP;
          fkep();
         break;
        case UP:
          if (aktiv_Sor>0) 
          { aktiv_Sor--;
            lcd.clear(); 
            lcd.print(X[aktiv_Sor].txt);
            lcd.setCursor(0,1);lcd.noBlink();
            lcd.print(X[aktiv_Sor].x);lcd.print("  ");lcd.print(X[aktiv_Sor].egyseg);lcd.print("  ");
          }
        break;
        case DOWN:
          if (aktiv_Sor<t_Vesz) 
          { aktiv_Sor++;
            lcd.clear(); 
            lcd.print(X[aktiv_Sor].txt);
            lcd.setCursor(0,1);lcd.noBlink();
            lcd.print(X[aktiv_Sor].x);lcd.print("  ");lcd.print(X[aktiv_Sor].egyseg);lcd.print("  ");
          }
        break;
      }
    break;
    
    case ALLITO:
      int8_t elojel=1;
      switch (gomb)
      {
        case LEFT:
        case ENTER:
          menu_Szint=MENU;
          lcd.noBlink();lcd.noCursor();
        break;
        case DOWN:
          elojel=-1;
        case UP:
          (aktiv_Sor!=csiga_Megy) ? X[aktiv_Sor].x += X[aktiv_Sor].oszto*elojel  : X[aktiv_Sor].x += 25*elojel  ;
          lcd.setCursor(0,1);
          lcd.print(X[aktiv_Sor].x)/X[aktiv_Sor].oszto;lcd.print("  ");lcd.print(X[aktiv_Sor].egyseg);lcd.print("  ");
          lcd.setCursor(1,1);
        break;
      }
    break;  
  }
}

gombok gomb_Olvas()
 { uint16_t x = analogRead (A0);
  if      (x < 160)  return ENTER; 
  else if (x < 400)  return LEFT;  
  else if (x < 650)  return DOWN;  
  else if (x < 850)  return UP;    
  else if (x < 1024) return RIGHT; 
}

void setup() 
{ //  Timer1.intialize(10,40000);  //láb, microsec
  pinMode(3, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(3), nyomas, RISING);
  lcd.begin(16, 2);
  //fokep();
  fkep();
  Serial.begin(9600);
  Serial.println(0ul-1);
}

void loop() 
  { int x, k;
    delay(500);
    //Serial.println(analogRead(A0));
    uint8_t bill;
    uint16_t X;
    if (nyomva < millis()) 
    { nyomva=SOHA;
      gombok nyomott_Gomb=gomb_Olvas();
      akcio_Menu(nyomott_Gomb);
      if (nyomva < millis()) 
        Serial.println(nyomott_Gomb);
    }
  }
// 12334567890123456 KezdőképAlapállapot
//╔════════════════╗  Jelmagyarázat:
//║79°45%12s 40 198║   |előre:79°|ventifűt:45%pwm||adagszünet_Füt:30|adagidő:0,4 mp|Kémény:198°
//║61 28%30  65 -10║   |visszaág:61°|VEntitart28%pwm||adagszünet_tart:30 Szivattyú be:65°|Külső:-10° |
//╚════════════════╝

//12334567890123456 Motor
//------------------
//V 45% 300
//| 25%
//------------------