/** * @file Flux_Button.c * @brief 控制板按键源文件 * * 实现按键初始化及响应功能 * * @author wang xiang en * @date 2025-04-18 * @version 版本号 * @copyright 版权声明((C)2025, YUWELL MEDTECH Co.ltd) */ #include #include "Flux_Button.h" #include "driver/gpio.h" #include "Flux_power.h" #include "ui.h" /* 日志打印标签 */ static const char *S_BUTTON_TAG = "tag_flux_button"; /* 屏幕状态记录事件组 */ EventGroupHandle_t g_lcd_state_event_group; /** * @brief 按键事件处理函数 * * 将按键触发事件绑定到此函数中,按键事件发生后执行该函数。 * * @param[in] arg not used * @param[in] data 按键事件枚举值 */ static void button_event_cb(void *arg, void *data) { /* 按键事件出发后发送日志信息到屏幕 */ ESP_LOGI(S_BUTTON_TAG, "Button event %d", (int)data); switch ((int)data) { /* 电源按键按下事件 */ case BUTTON_CMD_POWER_ON: POWER_ON; break; case BUTTON_CMD_POWER_OFF: POWER_OFF; break; case BUTTON_CMD_LCD_BACKLIGHT_CHANGE: #if USE_LCD_BACKLIGHT_CLOSE /* 单击电源键事件 */ ESP_LOGI(S_BUTTON_TAG, "LCD backlight change"); /* Toggle backlight based on current backlight state */ if (xEventGroupGetBits(g_lcd_state_event_group) & LCD_STATE_BIT) // If the current backlight state is on, turn it off { LCD_BACKLIGHT_CLOSE; xEventGroupClearBits(g_lcd_state_event_group, LCD_STATE_BIT); }else{ LCD_BACKLIGHT_OPEN; xEventGroupSetBits(g_lcd_state_event_group, LCD_STATE_BIT); } #endif break; /* 中间按键按下事件 */ case BUTTON_CMD_CENTER_KEY: if (lv_scr_act()==ui_pageHome) { /* Start test button */ lv_event_send(ui_pageHome_buttonStartTest, LV_EVENT_CLICKED, NULL); }else{ lv_scr_load_anim(ui_pageHome, LV_SCR_LOAD_ANIM_OUT_TOP, 400, 0, false); } break; case BUTTON_CMD_LEFT_KEY: if (lv_scr_act()==ui_pageHome) { lv_event_send(ui_pageHome_buttonMinus, LV_EVENT_CLICKED, NULL); } break; case BUTTON_CMD_RIGHT_KEY: if (lv_scr_act()==ui_pageHome) { lv_event_send(ui_pageHome_buttonAdd, LV_EVENT_CLICKED, NULL); } break; } } /** * @brief 单个按键初始化函数 * * 根据按键编号,初始化对应的按键IO,并设置按键回调函数为button_event_cb * * @param[in] button_num 按键编号 */ static void single_button_init(uint32_t button_num) { /* 根据引脚是否为电源键判断活动状态电平值 */ uint8_t activeLevel = BUTTON_ACTIVE_LEVEL; /* Modify the activation state to high level when the button is the power button */ 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, }, }; button_handle_t btn = iot_button_create(&btn_cfg); assert(btn); /* 注册按键事件处理函数 */ esp_err_t err = ESP_OK; /* Register callback function for power button press */ if (button_num == BUTTON_PowerIn_IO_NUM) { /* Turn off by double-clicking the power button */ err |= iot_button_register_cb(btn, BUTTON_DOUBLE_CLICK, button_event_cb, (void *)BUTTON_CMD_POWER_OFF); /* Turn on by long-pressing the power button */ err |= iot_button_register_cb(btn, BUTTON_LONG_PRESS_HOLD, button_event_cb, (void *)BUTTON_CMD_POWER_ON); /* Single click on the power button to toggle the display backlight state */ err |= iot_button_register_cb(btn, BUTTON_SINGLE_CLICK, button_event_cb, (void *)BUTTON_CMD_LCD_BACKLIGHT_CHANGE); }else{ /* Register callback functions for single clicks on the three buttons below */ 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); } /** * @brief 初始化所有按键 * * 配置按键、电源管理IO引脚状态 */ void flux_button_init(void) { /* 初始化下方的左右及中间按键 */ single_button_init(BUTTON_Center_IO_NUM); single_button_init(BUTTON_Left_IO_NUM); single_button_init(BUTTON_Right_IO_NUM); /* 初始化电源按键 */ single_button_init(BUTTON_PowerIn_IO_NUM); /* 初始化按键事件组 */ g_lcd_state_event_group = xEventGroupCreate(); /* Set the default state to backlight on */ xEventGroupSetBits(g_lcd_state_event_group, LCD_STATE_BIT); /* 初始化电源控制引脚 */ gpio_reset_pin(BUTTON_PowerOut_IO_NUM); gpio_set_direction(BUTTON_PowerOut_IO_NUM, GPIO_MODE_OUTPUT); }