FluxDC/components/FluxButton/Flux_Button.c

170 lines
5.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file Flux_Button.c
* @brief 控制板按键源文件
*
* 实现按键初始化及响应功能
*
* @author wang xiang en
* @date 2025-04-18
* @version 版本号
* @copyright 版权声明((C)2025, YUWELL MEDTECH Co.ltd
*/
#include <stdio.h>
#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:
/* 单击电源键事件 */
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);
}
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);
}