#include #include "FluxButton.h" #include "driver/gpio.h" #include "ui.h" static const char *BUTTON_TAG = "button_test"; /*定义按键事件列表*/ const char *button_event_table[] = { "BUTTON_PRESS_DOWN", "BUTTON_PRESS_UP", "BUTTON_PRESS_REPEAT", "BUTTON_PRESS_REPEAT_DONE", "BUTTON_SINGLE_CLICK", "BUTTON_DOUBLE_CLICK", "BUTTON_MULTIPLE_CLICK", "BUTTON_LONG_PRESS_START", "BUTTON_LONG_PRESS_HOLD", "BUTTON_LONG_PRESS_UP", }; static void button_event_cb(void *arg, void *data) { ESP_LOGI(BUTTON_TAG, "Button event %d", (int)data); #if CONFIG_GPIO_BUTTON_SUPPORT_POWER_SAVE esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause(); if (cause != ESP_SLEEP_WAKEUP_UNDEFINED) { ESP_LOGI(BUTTON_TAG, "Wake up from light sleep, reason %d", cause); } #endif /*根据输入按键事件进行事件处理*/ switch ((int)data) { case BUTTON_CMD_POWER_ON: /*响应电源键按下事件*/ gpio_set_level(BUTTON_PowerOut_IO_NUM, POWER_ON_OUT_LEVEL); break; case BUTTON_CMD_POWER_OFF: gpio_set_level(BUTTON_PowerOut_IO_NUM, POWER_OFF_OUT_LEVEL); break; case BUTTON_CMD_CENTER_KEY: /*开始测试按键*/ lv_event_send(ui_Home_startTest, LV_EVENT_CLICKED, NULL); break; case BUTTON_CMD_LEFT_KEY: lv_event_send(ui_Home_ButtonMinus, LV_EVENT_CLICKED, NULL); break; case BUTTON_CMD_RIGHT_KEY: lv_event_send(ui_Home_ButtonPlus, LV_EVENT_CLICKED, NULL); break; } } void button_init_func(uint32_t button_num) { uint8_t activeLevel = BUTTON_ACTIVE_LEVEL; /*当按键为电源按键时修改激活状态为高电平*/ if (button_num == BUTTON_PowerIn_IO_NUM) { activeLevel = BUTTON_POWERIN_ACTIVE_LEVEL; } button_config_t btn_cfg = { .type = BUTTON_TYPE_GPIO, .gpio_button_config = { .gpio_num = button_num, .active_level = activeLevel, #if CONFIG_GPIO_BUTTON_SUPPORT_POWER_SAVE .enable_power_save = true, #endif }, }; button_handle_t btn = iot_button_create(&btn_cfg); assert(btn); esp_err_t err = ESP_OK; /*为电源键按下注册回调函数*/ if (button_num == BUTTON_PowerIn_IO_NUM) { /*双击电源键键进行关机*/ err |= iot_button_register_cb(btn, BUTTON_DOUBLE_CLICK, button_event_cb, (void *)BUTTON_CMD_POWER_OFF); /*长按电源键进行开机*/ err |= iot_button_register_cb(btn, BUTTON_LONG_PRESS_HOLD, button_event_cb, (void *)BUTTON_CMD_POWER_ON); }else{ /*为下方三个按键 单击 注册回调函数*/ switch (button_num) { case BUTTON_Center_IO_NUM: err |= iot_button_register_cb(btn, BUTTON_SINGLE_CLICK, button_event_cb, (void *)BUTTON_CMD_CENTER_KEY); break; case BUTTON_Left_IO_NUM: err |= iot_button_register_cb(btn, BUTTON_SINGLE_CLICK, button_event_cb, (void *)BUTTON_CMD_LEFT_KEY); break; case BUTTON_Right_IO_NUM: err |= iot_button_register_cb(btn, BUTTON_SINGLE_CLICK, button_event_cb, (void *)BUTTON_CMD_RIGHT_KEY); break; default: break; } } ESP_ERROR_CHECK(err); } /*初始化所有引脚*/ void button_init(void) { button_init_func(BUTTON_Center_IO_NUM); button_init_func(BUTTON_Left_IO_NUM); button_init_func(BUTTON_Right_IO_NUM); button_init_func(BUTTON_PowerIn_IO_NUM); /*在此处初始化电源控制IO输出*/ gpio_reset_pin(BUTTON_PowerOut_IO_NUM); gpio_set_direction(BUTTON_PowerOut_IO_NUM, GPIO_MODE_OUTPUT); } #if CONFIG_GPIO_BUTTON_SUPPORT_POWER_SAVE #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0) void power_save_init(void) { esp_pm_config_t pm_config = { .max_freq_mhz = CONFIG_EXAMPLE_MAX_CPU_FREQ_MHZ, .min_freq_mhz = CONFIG_EXAMPLE_MIN_CPU_FREQ_MHZ, #if CONFIG_FREERTOS_USE_TICKLESS_IDLE .light_sleep_enable = true #endif }; ESP_ERROR_CHECK(esp_pm_configure(&pm_config)); } #else void power_save_init(void) { #if CONFIG_IDF_TARGET_ESP32 esp_pm_config_esp32_t pm_config = { #elif CONFIG_IDF_TARGET_ESP32S2 esp_pm_config_esp32s2_t pm_config = { #elif CONFIG_IDF_TARGET_ESP32C3 esp_pm_config_esp32c3_t pm_config = { #elif CONFIG_IDF_TARGET_ESP32S3 esp_pm_config_esp32s3_t pm_config = { #elif CONFIG_IDF_TARGET_ESP32C2 esp_pm_config_esp32c2_t pm_config = { #endif .max_freq_mhz = CONFIG_EXAMPLE_MAX_CPU_FREQ_MHZ, .min_freq_mhz = CONFIG_EXAMPLE_MIN_CPU_FREQ_MHZ, #if CONFIG_FREERTOS_USE_TICKLESS_IDLE .light_sleep_enable = true #endif }; ESP_ERROR_CHECK(esp_pm_configure(&pm_config)); } #endif #endif