blob: 2e3aafa4db21166c57f9b2a59dfe89411ea79d58 [file] [log] [blame]
/*
*
* 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 <lock/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;
gpio_config_t io_conf = {};
io_conf.intr_type = GPIO_INTR_NEGEDGE;
io_conf.pin_bit_mask = 1ULL << gpioNum;
io_conf.mode = GPIO_MODE_INPUT;
io_conf.pull_down_en = GPIO_PULLDOWN_ENABLE;
gpio_config(&io_conf);
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;
}