#include "button.h" #include #include #define TAG "Button" #if CONFIG_SOC_ADC_SUPPORTED AdcButton::AdcButton(const button_adc_config_t& adc_config) : Button(nullptr) { button_config_t btn_config = { .long_press_time = 2000, .short_press_time = 0, }; ESP_ERROR_CHECK(iot_button_new_adc_device(&btn_config, &adc_config, &button_handle_)); } #endif Button::Button(button_handle_t button_handle) : button_handle_(button_handle) { } Button::Button(gpio_num_t gpio_num, bool active_high, uint16_t long_press_time, uint16_t short_press_time, bool enable_power_save) : gpio_num_(gpio_num) { if (gpio_num == GPIO_NUM_NC) { return; } button_config_t button_config = { .long_press_time = long_press_time, .short_press_time = short_press_time }; button_gpio_config_t gpio_config = { .gpio_num = gpio_num, .active_level = static_cast(active_high ? 1 : 0), .enable_power_save = enable_power_save, .disable_pull = false }; ESP_ERROR_CHECK(iot_button_new_gpio_device(&button_config, &gpio_config, &button_handle_)); } Button::~Button() { if (button_handle_ != NULL) { iot_button_delete(button_handle_); } } void Button::OnPressDown(std::function callback) { if (button_handle_ == nullptr) { return; } on_press_down_ = callback; iot_button_register_cb(button_handle_, BUTTON_PRESS_DOWN, nullptr, [](void* handle, void* usr_data) { Button* button = static_cast(usr_data); if (button->on_press_down_) { button->on_press_down_(); } }, this); } void Button::OnPressUp(std::function callback) { if (button_handle_ == nullptr) { return; } on_press_up_ = callback; iot_button_register_cb(button_handle_, BUTTON_PRESS_UP, nullptr, [](void* handle, void* usr_data) { Button* button = static_cast(usr_data); if (button->on_press_up_) { button->on_press_up_(); } }, this); } void Button::OnLongPress(std::function callback) { if (button_handle_ == nullptr) { return; } on_long_press_ = callback; iot_button_register_cb(button_handle_, BUTTON_LONG_PRESS_START, nullptr, [](void* handle, void* usr_data) { Button* button = static_cast(usr_data); if (button->on_long_press_) { button->on_long_press_(); } }, this); } void Button::OnClick(std::function callback) { if (button_handle_ == nullptr) { return; } on_click_ = callback; iot_button_register_cb(button_handle_, BUTTON_SINGLE_CLICK, nullptr, [](void* handle, void* usr_data) { Button* button = static_cast(usr_data); if (button->on_click_) { button->on_click_(); } }, this); } void Button::OnDoubleClick(std::function callback) { if (button_handle_ == nullptr) { return; } on_double_click_ = callback; iot_button_register_cb(button_handle_, BUTTON_DOUBLE_CLICK, nullptr, [](void* handle, void* usr_data) { Button* button = static_cast(usr_data); if (button->on_double_click_) { button->on_double_click_(); } }, this); } void Button::OnMultipleClick(std::function callback, uint8_t click_count) { if (button_handle_ == nullptr) { return; } on_multiple_click_ = callback; button_event_args_t event_args = { .multiple_clicks = { .clicks = click_count } }; iot_button_register_cb(button_handle_, BUTTON_MULTIPLE_CLICK, &event_args, [](void* handle, void* usr_data) { Button* button = static_cast(usr_data); if (button->on_multiple_click_) { button->on_multiple_click_(); } }, this); }