#include "button.h"

#define DEBOUNCETIME 20 //time to not check for inputs after key press
#define BUTTONTIMEHOLD 750 //time for button hold
#define BUTTONTIMEHOLDLONG 3000 //time for button long hold

Button::Button() {

}

void Button::update(long millis, boolean state)
{
    //example: state=!digitalRead(PIN_BTNLEFT)
    //Short press (true when button short pressed, on release)
    _button=false;

    //long press (true when button is held down for BUTTONTIMEHOLD, on time elapsed)
    _button_hold=false;

    if (millis-_millis_lastinput>DEBOUNCETIME) //Button debouncing
    {
        if (_timebuttonpressed == 0 && state){ //first time pressed down. (low when pressed)
            _timebuttonpressed=millis; //set time of button press
            _millis_lastinput=millis; //for debouncing
        }else if(_timebuttonpressed != 0 && !state){ //button released (was pressed)
            if (millis-_timebuttonpressed < BUTTONTIMEHOLD){ //short press
                _button=true;
            }
            _timebuttonpressed=0; //re-enable after short press and release from hold
            _millis_lastinput=millis; //for debouncing
        }else if(millis-_timebuttonpressed >= BUTTONTIMEHOLD && _timebuttonpressed>0){ //held down long enough and not already hold triggered
            _button_hold=true;
            _timebuttonpressed=-1; //-1 as flag for hold triggered
        }
    }

    if ( _button ) {
        _millis_lastinput=millis; //for debouncing
    }

}

boolean Button::buttonPressed()
{
    return _button;
}
boolean Button::buttonHold()
{
    return _button_hold;
}
