/////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////   EncButton  /////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////

//#include <Arduino.h>
// #define EB_NO_FOR           // отключить поддержку pressFor/holdFor/stepFor и счётчик степов (экономит 2 байта оперативки)
// #define EB_NO_CALLBACK      // отключить обработчик событий attach (экономит 2 байта оперативки)
// #define EB_NO_COUNTER       // отключить счётчик энкодера (экономит 4 байта оперативки)
// #define EB_NO_BUFFER        // отключить буферизацию энкодера (экономит 1 байт оперативки)

// #define EB_DEB_TIME 50      // таймаут гашения дребезга кнопки (кнопка)
// #define EB_CLICK_TIME 500   // таймаут ожидания кликов (кнопка)
// #define EB_HOLD_TIME 600    // таймаут удержания (кнопка)
// #define EB_STEP_TIME 200    // таймаут импульсного удержания (кнопка)
// #define EB_FAST_TIME 30     // таймаут быстрого поворота (энкодер)

#include <EncButton.h>

#define EncButton_Pin_CLK 32
#define EncButton_Pin_DT 33
#define EncButton_Pin_SW 35
EncButton eb(EncButton_Pin_CLK, EncButton_Pin_DT, EncButton_Pin_SW); //eb(2, 3, 4);  // CLK, DT, SW
// EncButton eb(2, 3, 4, INPUT); // + режим пинов энкодера
// EncButton eb(2, 3, 4, INPUT, INPUT_PULLUP); // + режим пинов кнопки


/////////////////////////////////////////////////////////////////////////////////////////
// управление тремя переменными при помощи энкодера:
// - нащёлкай кнопкой нужную переменную (1, 2 или 3 клика)
// - 1 переменная просто изменяется с постоянным шагом
// - 2 переменная: шаг 1, при зажатой кнопке - шаг 5
// - 3 переменная: шаг 1, при быстром вращении - шаг 5

int var1 = 0;
int var2 = 0;
int var3 = 0;
uint8_t EncButton_select = 1;  // выбранная переменная
/////////////////////////////////////////////////////////////////////////////////////////


IRAM_ATTR void isr() { // esp8266/esp32
//void isr() {
  eb.tickISR();
}

void EncButton_Read_setup() {
  // показаны значения по умолчанию
  eb.setBtnLevel(LOW);
  eb.setClickTimeout(500);
  eb.setDebTimeout(50);
  eb.setHoldTimeout(600);
  eb.setStepTimeout(200);

  eb.setEncReverse(0);
  eb.setEncType(EB_STEP4_LOW);  //EB_STEP4_LOW - активный низкий сигнал (подтяжка к VCC). Полный период (4 фазы) за один щелчок. Установлен по умолчанию
  //EB_STEP4_HIGH - активный высокий сигнал (подтяжка к GND). Полный период (4 фазы) за один щелчок
  //EB_STEP2 - половина периода (2 фазы) за один щелчок
  //EB_STEP1 - четверть периода (1 фаза) за один щелчок, а также энкодеры без фиксации
  eb.setFastTimeout(30);

  eb.counter = 0;  // сбросить счётчик энкодера
  /////////////////////////////////////////////////////////////////////////
  //btn.tick();
  //if (btn.press()) Serial.println("Кнопка нажата при старте");
  //// btn.setBtnLevel(LOW); // можно настроить уровень
  //// if (btn.read()) Serial.println("Кнопка нажата при старте");

  //eb.tick();
  //if (eb.press()) Serial.println("Кнопка нажата при старте");
  ////////////////////////////////////////////////////////////////////////
  attachInterrupt(EncButton_Pin_CLK, isr, CHANGE);  //Подкючаем аппаратное прерывание по изменению состояния пина
  attachInterrupt(EncButton_Pin_DT, isr, CHANGE);   //Подкючаем аппаратное прерывание по изменению состояния пина
  eb.setEncISR(true);
}
void EncButton_Read_loop() {
  eb.tick();   // Опрос энкодера
  //if (eb.action()) {
    //Led_Action_Start(Led_Action_Millis_Interval);

    
  //}
  EncButton_Serial_loop();
}


void EncButton_Serial_loop() {
  //////////////////////////////////////////////////////////////////////////
  // обработка поворота общая
  if (eb.turn()) {
    Serial.print("turn: dir ");
    Serial.print(eb.dir());
    Serial.print(", fast ");
    Serial.print(eb.fast());
    Serial.print(", hold ");
    Serial.print(eb.pressing());
    Serial.print(", counter ");
    Serial.print(eb.counter);
    Serial.print(", clicks ");
    Serial.println(eb.getClicks());
  }

  // обработка поворота раздельная
  if (eb.left()) Serial.println("left");
  if (eb.right()) Serial.println("right");
  if (eb.leftH()) Serial.println("leftH");
  if (eb.rightH()) Serial.println("rightH");

  // кнопка
  if (eb.press()) Serial.println("press");
  if (eb.click()) Serial.println("click");

  if (eb.release()) {
    Serial.println("release");

    Serial.print("clicks: ");
    Serial.print(eb.getClicks());
    Serial.print(", steps: ");
    Serial.print(eb.getSteps());
    Serial.print(", press for: ");
    Serial.print(eb.pressFor());
    Serial.print(", hold for: ");
    Serial.print(eb.holdFor());
    Serial.print(", step for: ");
    Serial.println(eb.stepFor());
  }

  // состояния
  // Serial.println(eb.pressing());
  // Serial.println(eb.holding());
  // Serial.println(eb.busy());
  // Serial.println(eb.waiting());

  // таймаут
  if (eb.timeout(1000)) Serial.println("timeout!");

  // удержание
  if (eb.hold()) Serial.println("hold");
  if (eb.hold(3)) Serial.println("hold 3");

  // импульсное удержание
  if (eb.step()) Serial.println("step");
  if (eb.step(3)) Serial.println("step 3");

  // отпущена после импульсного удержания
  if (eb.releaseStep()) Serial.println("release step");
  if (eb.releaseStep(3)) Serial.println("release step 3");

  // отпущена после удержания
  if (eb.releaseHold()) Serial.println("release hold");
  if (eb.releaseHold(2)) Serial.println("release hold 2");

  // проверка на количество кликов
  if (eb.hasClicks(3)) Serial.println("has 3 clicks");

  // вывести количество кликов
  if (eb.hasClicks()) {
    Serial.print("has clicks: ");
    Serial.println(eb.getClicks());
  }

  /////////////////////////////////////////////////////////////////////////////////////
  // выбор переменной для изменения
  if (eb.hasClicks()) {
    EncButton_select = eb.getClicks();
    Serial.println(String("Select: ") + EncButton_select);
  }

  if (eb.turn()) { // меняем переменную
    switch (EncButton_select) {
      case 1:
        //var1 += 5 * eb.dir();  // изменение с шагом 5
        var1 += eb.dir();  // изменение с шагом 1
        break;
      case 2:
        //var2 += (eb.pressing() ? 5 : 1) * eb.dir();  // изменение с шагом 1, при зажатой кнопке шаг 5
        var2 += eb.dir();  // изменение с шагом 1
        break;
      case 3:
        //var3 += (eb.fast() ? 5 : 1) * eb.dir();  // изменение с шагом 1, при быстром вращении шаг 5
        var3 += (eb.fast() ? 10 : 1) * eb.dir();  // изменение с шагом 1, при быстром вращении шаг 10
        //var3 += eb.dir();  // изменение с шагом 1
        break;
    }
    Serial.println(String("vars ") + var1 + ',' + var2 + ',' + var3);
  }
  ///////////////////////////////////////////////////////////////////////////////////

}

/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////

int Radio_volume, Radio_volumeOld = 5;
int Radio_frequency, Radio_frequencyOld;

boolean Radio_bass = 0;

#define Radio_MAXmenu  4
//#define Radio_ledPin 13
//#define Radio_blPin 7

//boolean Radio_dspl = 0, 
//boolean Radio_memdisplay = 0, 
//boolean Radio_mempress = 0, 
//boolean Radio_adj = 0;
//boolean Radio_ledPin_state;
//boolean Radio_Power_State;

//int Radio_txtl = 0, Radio_temparray = 0;
//int Radio_samples[5];
//unsigned int Radio_status[6];
//unsigned long Radio_timeprevious = 0, Radio_timeprev = 0;

#define Radio_MAXmenu  4
//int Radio_menu;
/////////////////////////////////////////////////////////////////////////////////////////
int presetIndexMax = 12; // 
//uint16_t presetIndex = 0;  ///< Start at Station with index = 1
int presetIndex = 0;  ///< Start at Station with index = 1

////////////////////////////////////////////////////////////////////////////////////////
unsigned int Radio_Signal;
unsigned int Radio_Power_AKM;
/////////////////////////////////////////////////////////////
int potentiometer_value = 0;
int value_min = 0;
int value_max = 1000;
//float angle = 0;

int frequency_value = 0;
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
boolean Radio_Power_State;  //не включене устройство (режим ожидания) при подключенном источнике питания //don't "power-on" of the unit (stand by mode) when power supply is connected
boolean Radio_Lights_State;


void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println("Hello, ESP32!");

  EncButton_Read_setup();
  OLED_setup();

}

void loop() {
  // put your main code here, to run repeatedly:
  potentiometer_value = constrain(map(analogRead(A0), 0, 1023, value_min, value_max / 10), value_min, value_max / 10);
  frequency_value = constrain(map(analogRead(A0), 0, 1023, value_min, value_max), value_min, value_max);

  EncButton_Read_loop();  // RotaryEncoder  // проверка нажатия клавиши  // check for key press
  OLED_loop();


  //delay(10); // this speeds up the simulation
}