DockerFluxDC/components/user_power_task/user_power_task.c
2025-11-28 15:26:05 +00:00

143 lines
3.9 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 FluxButton.c
* @brief 控制板按键源文件
*
* 实现按键初始化及响应功能
*
* @author wang xiang en
* @date 2025-11-28
* @version 版本号
* @copyright 版权声明((C)2025, YUWELL MEDTECH Co.ltd
*/
#include <stdio.h>
#include "user_power_task.h"
#include "driver/gpio.h"
/* 日志打印标签 */
static const char *S_BUTTON_TAG = "tag_user_button";
/**
* @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;
default:
break;
}
}
/**
* @brief 单个按键初始化函数
*
* 根据按键编号初始化对应的按键IO并设置按键回调函数为button_event_cb
*
* @param[in] button_num 按键编号
*/
static void single_button_init(uint32_t button_num)
{
uint8_t 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;
/* 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);
ESP_ERROR_CHECK(err);
}
// 电源管理任务,初始化按键之后接收外部消息并处理
void power_manager_task(void* arg)
{
GeneralMsg_t received_msg;
gpio_reset_pin(BUTTON_POWER_OUT_IO_NUM);
gpio_set_direction(BUTTON_POWER_OUT_IO_NUM, GPIO_MODE_OUTPUT); // 将控制按键设置为输出
/* 初始化顶部的电源按键 */
single_button_init(BUTTON_POWER_IN_IO_NUM);
// 初始化背光调节LEDC
// Prepare and then apply the LEDC PWM timer configuration
ledc_timer_config_t ledc_timer = {
.speed_mode = LEDC_MODE,
.duty_resolution = LEDC_DUTY_RES,
.timer_num = LEDC_TIMER,
.freq_hz = LEDC_FREQUENCY, // Set output frequency at 4 kHz
.clk_cfg = LEDC_AUTO_CLK
};
ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));
// Prepare and then apply the LEDC PWM channel configuration
ledc_channel_config_t ledc_channel = {
.speed_mode = LEDC_MODE,
.channel = LEDC_CHANNEL,
.timer_sel = LEDC_TIMER,
.intr_type = LEDC_INTR_DISABLE,
.gpio_num = LEDC_OUTPUT_IO,
.duty = 0, // Set duty to 0%
.hpoint = 0
};
ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));
ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, 10));
ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0));
while (1)
{
if(xQueueReceive(xPowerTaskQueue, &received_msg, portMAX_DELAY)) //若没有消息接收则将任务设置为阻塞态
{
switch (received_msg.type)
{
case MSG_TYPE_POWER_OFF:
POWER_OFF;
break;
default:
break;
}
}
}
}