/** ****************************************************************************************
* \mainpage FSM_Pulsante_OOP_v10
*
* @brief Esempio di implementazione FSM per la gestione 
* di un pulsante
*
* https://wokwi.com/projects/422171332361372673
* https://www.planttext.com/?text=XLNBRjim4BmRy3_iBIs2G8g1N5AaY6EfZL4vJlr0qPF1M5jvKPeqHCf0ypKzzZ_oOoMfXqN5JawITsTdPsT9-LPfbkjYo_kzCnWMMcuPC311JV2B19b7Ig1f9s4YPOwmmnmuWmoL9YdGPWi1ku8h9ZHQbhKK5h6JIj4JST8lVoqg9uvxPXboD1af2BO5DymSeHtaXSWsbiXoVI-OI2Ke0XGwPo2GS-daITWJclweC2j8C-1dxDafiiW_jjWGcngXwDaHCmwYaFkwN4aX0JMjDwXD06lTvf5IoMHIbeHfJNjc6HM2CAYNVqwlQOHcUA_441nweaKoPwhfmwgPhCivNiCNuytE-7f7dEMfjAc8QNODbs4G3e91EBYgAgBuRhfy6CMhA4w6F-46hi9F40GmCtERIkjkYa-o46i44h0bpacXKsNBa-d3rzNZB9xFLujxyxYV9f4XkGp3acOkCqwitcoz2NIROCS8Hybuz6sr64_YwN9HCZcY1MrH5jen4OSrf_Nlr_Nzdd9-ZwCahj-TkZXQpOO_Eg7wvs68GsooJ1RZbLDp2CxY91vs2njClsVRmdLvIY0eHOwCT_ech98N5v_RWWoOrADr1LDBuATg7ZjxFhUNwSD77zEYSrHHjQg6iWkk59AQ8KVcTtslOpkVKvPXxjh4UnDz4pRQC97XAvmlFWZQejeORnNUcCVnxNKwU295rZAvapy-yobGEL73s0pbuHiLRui-NlE6yguJhm_Q-VbfLALzOh-C8rlHYFShh9B3IU_twlUkLx587KtZsJ5WsREQkMbu6javAmtmtPFk8LlyzbmT1pLtmKrHVM2Q0tBIFxiJtxuJUF_wUw2knRSeKlT7-Hy0
*
*
TODO aggiungere i metodi click, longPress, ...
 
* @author Filippo Bilardo
* @version 1.0 10/02/25 Versione iniziale
*/
#include "Pulsante.h"
#include "Led.h"
//-----------------------------------------------------------------------------
//Istanze degli oggetti Led e Pulsante
LED ledRed(13);
LED ledYellow(11);
LED ledGreen(9);
LED ledBlue(7);
Pulsante pRed(12);
Pulsante pYellow(10);
Pulsante pGreen(8);
Pulsante pBlue(2);
//-----------------------------------------------------------------------------
// Implementazione delle funzioni di callback per i vari eventi.
void onPress(Pulsante& button) {Serial.println("Press Event Triggered");}
void onChange(Pulsante& button) {Serial.println("Change Event Triggered");}
void onLongPress(Pulsante& button) {Serial.println("Long Press Event Triggered");}
void onMultiClick(Pulsante& button) {
    int clickCount = button.getClickCount();
    if (clickCount == 1) {
        Serial.println("Single Click Event Triggered");
    } else if (clickCount == 2) {
        Serial.println("Double Click Event Triggered");
    } else if (clickCount == 3) {
        Serial.println("Triple Click Event Triggered");
    } else if (clickCount > 3) {
        Serial.print(clickCount);
        Serial.println(" Click Event Triggered");
    }
}
void onRelease(Pulsante& button) {Serial.println("Release Event Triggered");}
void onLongClick(Pulsante& button) {Serial.println("Long Click Event Triggered");}
void toggleLedRed(Pulsante& button) {ledRed.inverti();}
void LedRedBlink(Pulsante& button) {
  int clickCount = button.getClickCount();
  if(clickCount>1) ledRed.lampeggia(clickCount*3, 200);
}
void toggleLedYellow(Pulsante& button) {ledYellow.inverti();}
void toggleLedGreen(Pulsante& button) {ledGreen.inverti();}
void setup() {
    Serial.begin(9600);
    ledRed.lampeggia(4,100);
    ledYellow.lampeggia(4,50);
    ledGreen.test(4);
    ledBlue.test(4);
    pRed.setLongPressCallback(toggleLedRed);
    pRed.setMultiClickCallback(LedRedBlink);
    pYellow.setMultiClickCallback(toggleLedYellow);
    pGreen.setChangeCallback(toggleLedGreen);
    pBlue.setPressCallback(onPress);
    pBlue.setChangeCallback(onChange);
    pBlue.setLongPressCallback(onLongPress);
    pBlue.setMultiClickCallback(onMultiClick);
    pBlue.setReleaseCallback(onRelease);
    pBlue.setLongClickCallback(onLongClick);
}
void loop() {
    pRed.update();
    pYellow.update();
    pGreen.update();
    pBlue.update();
}