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