#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
 bool Vibrgyro;
  // СПІЛЬНІ КОНСТАНТИ ПІД ХОД ДЛЯ БАГ ФУНК
  #define no_action 0 // НЕМА ДІЇ
  #define no_data 0 // немає даних
  #define no_indication 0   // немає вказівки
  #define off 0 
  #define get_status 1               // получити настройки
  #define yes 1
  #define save_settings 4           // зберехти настройки
  #define reset 11
  #define on 12
  #define click 13
  #define execute_code 14// execution without comman - виконання без команди
  #define gyro 15
  #define profil 16
  
  #define melody_start 1
  #define melody_off_power 2

  #define x_axis_hor 1
  #define y_axis_ver 2
  #define z_axis_ver 3


  #define get_y 2
  #define get_z 3
  #define get_vibr 4
  
   //Піни карта
  //#define b_mein 25
  #define b_triger 33
  #define b_analog 32
  #define b_on_off 14
  #define b_emul_dpad 26
  #define b_sw 4
  #define p_dt 3
  #define p_clk 2
 
  #define thandle_touch_button 27

  //Mf_EncoderButton();
   //#define click 13
   #define press 20
   #define hol_but 21
   #define released 22
   #define released_const 23
   #define press_const 24
   #define hol_const 25
   #define hol_released 26
   #define status_button 27
  
  //Md_Display(byte Receiving) {
    #define reminder_display_on 20
    #define info_display_on 21
    #define menu_on 22 
    #define finishing_work 23 
    #define finishing_work_reset 24

    #define lang_eng 25
    #define lang_ukr 26 
    #define click_in_dis_on 27
  
   //Md_MainDisplayENG();
    #define menu_off 21
    #define menu_start 22
   
   //byte Md_addres();
    //#define click 13
    #define back 23
    #define address_entered 24
    #define delete_last 27
    #define get_add 29
    #define int_add 30 //introduction введення
    #define int_last 31 //introduction введення
    #define previous_address 32
    #define backpoint 33
    #define deselect 34
    
    //int Md_cursor();
    //#define reset 11
    #define selection_inversion 21
    #define freeze_position 22
    #define get_pos 23
    #define return_pos 24
    
   
    //Ae_InterruptReadPinDtEncoder()
    //Mf_Encoder();
     #define rotated_rights 20
     #define rotated_left 21
    
    
    //Mf_consenDisplay()
    //#define gyro 15
    //#define profil 16
    #define click_mod 21
    #define hold_mod 22
    
    
    //Mf_changeInspector();
    //#define gyro 15
    //#define profil 16
    #define copy_profile 21
    #define gyro_check 22
    #define return_save 23
    #define doesnt_match 24//не збігається
    #define data_match 25//збіг даних
    #define profilSp 26
    #define profilMp 27

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
  
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

//char ProfileName(char Letter);
//char LetterSelect();

void setup() {
 
  pinMode(b_sw, INPUT_PULLUP);
  
  Serial.begin(115200);

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
 display.clearDisplay();
 display.setTextSize(1);
 display.setTextColor(WHITE); 
 attachInterrupt(digitalPinToInterrupt(p_dt), Ae_InterruptReadPinDtEncoder, CHANGE);
}

void loop() {
 display.clearDisplay();
 
 MdAf_confirmYesNo(); //принимаєм получ бук
 
 display.display();

}
 //String NameTest = "Y           fddfgdf  ";
 String NameTest = "                     ";
 byte buttonArray[] = {0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};


void MdAf_confirmYesNo(){
  
  static int8_t flagChoice;
  
  switch (Mf_encoderActionStorage(get_status)) {
    
    case 0: 
     
     break;
    
    case rotated_rights: 
      
      flagChoice = !flagChoice;

     break;
    
    case rotated_left: 
      
      flagChoice = !flagChoice;
     
     break;   
  
  }
  
  if ( Mf_EncoderButton(500) == click) {
        
    if (flagChoice) {
     
     const byte defaultButton[] = {0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
     
     for (int i = 0; i < sizeof(defaultButton); i++) {
      
      buttonArray[i] = defaultButton[i];
     
     }
    
    }
   
   Md_addres(4, back); 
   flagChoice = 0;     
  
  }
  
  MdAf_p_confirmYesNo(flagChoice, 37, 46);
}  
  
byte MdAf_p_confirmYesNo(byte acceptedFlag, byte azixX, byte azixY) { 
 
  display.setCursor(0, 40);
  display.println(" Move buttons");
  display.println(" Reset");      
  display.println(" Back");
  
  display.setCursor(41, 50);
  display.println("NO   YES");
  
  if(!acceptedFlag) {
   
   display.drawRect(azixX+2, azixY+2, 15, 11, WHITE);//NO
  
  }else{
   
   display.drawRect(azixX+32, azixY+2, 21, 11, WHITE);//YES
  
  }
  
  display.drawRect(37, 46, 55, 15, WHITE);//рамка навколо так ні

 reset 0;

}

void Ae_InterruptReadPinDtEncoder() {  //дивитися на початку в void setup працюэ разом з attachInterrupt(digitalPinToInterrupt(p_dt), Ae_InterruptReadPinDtEncoder, CHANGE);

  static int8_t clkStateCurrent;
  static int8_t clkStateLast;

  clkStateCurrent = digitalRead(p_clk);

    if ((clkStateLast == LOW) && (clkStateCurrent == HIGH)) {

      if (digitalRead(p_dt) == HIGH) {      
        Mf_encoderActionStorage(rotated_rights);
                  
      } else {
        Mf_encoderActionStorage(rotated_left);
                  
      }
    }

    clkStateLast = clkStateCurrent;       
}
  
int8_t Mf_encoderActionStorage(int8_t acceptedCommand) {

  static int8_t operationRetention;//збереження спрацювання

  if (acceptedCommand == rotated_left || acceptedCommand == rotated_rights) {
  operationRetention = acceptedCommand;
  }
  else if (acceptedCommand == get_status ) {
    acceptedCommand = operationRetention;
    operationRetention = 0;
    return acceptedCommand;
  }
  return 0;
}
int Mf_EncoderButton(int retentionAfter) {
  
  static byte buttonState = released_const;
  static uint32_t tmr;
  
  if (Ae_BatR(b_sw)){
    
    if (buttonState == released_const) {
      buttonState = press_const; 
      tmr = millis() + retentionAfter; 
      return press;
    }
    else if (tmr && tmr < millis()) {
      buttonState = hol_const; 
      tmr = 0; 
      return hol_but;
    }
  }
  
  else if (!Ae_BatR(b_sw)){
    if (buttonState == hol_const) {buttonState = released_const; return hol_released;}
    else if (buttonState == press_const) {buttonState = released_const; return click;}
  }
    
 return buttonState;
  
}
byte Ae_BatR(byte Taking) {
 return !digitalRead(Taking); 
}