#include <Button_SL.hpp>

//////////////////////////////////////////////////
// Global constants and variables
//////////////////////////////////////////////////
constexpr uint8_t BUTTON_PIN1{2};
constexpr uint8_t LED1_PIN{4};
constexpr uint8_t LED2_PIN{6};
constexpr unsigned long TIMEOUT {3000};

using namespace Btn; 

ButtonSL btn{BUTTON_PIN1, 5000};  // 5000ms for long press
unsigned long timeStamp;

//////////////////////////////////////////////////
// Function forward declaration
//////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
/// @brief Initialize the program.
///
//////////////////////////////////////////////////////////////////////////////
void setup() {
  Serial.begin(115200);
  Serial.println("Start");
  // Initialize Buttons
  pinMode(LED1_PIN,OUTPUT);
  pinMode(LED2_PIN,OUTPUT);

  btn.begin();
  btn.setDebounceTime_ms(20);
  btn.releaseOn();  // Autorelease if long press detected
}

//////////////////////////////////////////////////////////////////////////////
/// @brief Check Buttons.
///
//////////////////////////////////////////////////////////////////////////////
void loop() {
  static bool isLedOn {false};

  switch (btn.tick()) {
    case ButtonState::shortPressed:
      digitalWrite(LED1_PIN,HIGH);
      digitalWrite(LED2_PIN,LOW);
      timeStamp = millis();
      isLedOn = true;
      Serial.print("B1 . ");
      Serial.print(btn.getDuration_ms());
      Serial.println(" ms");
      break;
    case ButtonState::longPressed:
      digitalWrite(LED1_PIN,LOW);
      digitalWrite(LED2_PIN,HIGH);
      timeStamp = millis();
      isLedOn = true;
      Serial.print("B1 + ");
      Serial.print(btn.getDuration_ms());
      Serial.println(" ms");
      break;
    default: break;
  }

  if (millis() - timeStamp > TIMEOUT && true == isLedOn) {
    Serial.println("Switch LED off");
    digitalWrite(LED1_PIN,LOW);
    digitalWrite(LED2_PIN,LOW);
    isLedOn = false;
  }
}