/*
 *
 *    Copyright (c) 2020 Project CHIP Authors
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

#include "Button.h"
#include "AppTask.h"

#include "AppConfig.h"

esp_err_t Button::Init(gpio_num_t gpioNum, uint16_t debouncePeriod)
{
    mGPIONum         = gpioNum;
    mDebouncePeriod  = debouncePeriod / portTICK_PERIOD_MS;
    mState           = false;
    mLastPolledState = false;

    return gpio_set_direction(gpioNum, GPIO_MODE_INPUT);
}

bool Button::Poll()
{
    uint32_t now = xTaskGetTickCount();

    bool newState = gpio_get_level(mGPIONum);

    if (newState != mLastPolledState)
    {
        mLastPolledState = newState;
        mLastReadTime    = now;
    }

    else if (newState != mState && (now - mLastReadTime) >= mDebouncePeriod)
    {
        mState          = newState;
        mPrevStateDur   = now - mStateStartTime;
        mStateStartTime = now;
        return true;
    }

    return false;
}

uint32_t Button::GetStateDuration()
{
    return (xTaskGetTickCount() - mStateStartTime) * portTICK_PERIOD_MS;
}
