#include "button.h" #include static const char* TAG = "Button"; #if CONFIG_SOC_ADC_SUPPORTED Button::Button(const button_adc_config_t& adc_cfg) { button_config_t button_config = { .type = BUTTON_TYPE_ADC, .long_press_time = 1000, .short_press_time = 50, .adc_button_config = adc_cfg }; button_handle_ = iot_button_create(&button_config); if (button_handle_ == NULL) { ESP_LOGE(TAG, "Failed to create button handle"); return; } } #endif Button::Button(gpio_num_t gpio_num, bool active_high) : gpio_num_(gpio_num) { if (gpio_num == GPIO_NUM_NC) { return; } button_config_t button_config = { .type = BUTTON_TYPE_GPIO, .long_press_time = 1000, .short_press_time = 50, .gpio_button_config = { .gpio_num = gpio_num, .active_level = static_cast(active_high ? 1 : 0) } }; button_handle_ = iot_button_create(&button_config); if (button_handle_ == NULL) { ESP_LOGE(TAG, "Failed to create button handle"); return; } } 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, [](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, [](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, [](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, [](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, [](void* handle, void* usr_data) { Button* button = static_cast(usr_data); if (button->on_double_click_) { button->on_double_click_(); } }, this); }