功能:集成SU-03T语音模块,完善UI代码文档

- 在CMakeLists.txt中添加SU-03T语音模块依赖。
- 在main.cpp中实现SU-03T接收回调函数,处理接收消息。
- 完善各UI源文件文档,包括动作、屏幕和字体,明确模块作用与数据流向。
- 更新主应用逻辑,初始化并启动SU-03T接收器。
- 修改过程中确保兼容性,保留原有接口。
This commit is contained in:
Wang Beihong
2026-04-22 01:06:10 +08:00
parent 65de57a49c
commit ffdb7065e3
46 changed files with 1341 additions and 12 deletions

View File

@@ -1,3 +1,12 @@
/*
* 文件: main/main.cpp
* 角色: 系统主流程与任务调度入口
* 说明:
* - 本文件用于实现当前模块的核心功能或接口定义。
* - 修改前请先确认该模块与其它任务/外设之间的数据流关系。
* - 涉及协议与硬件时,优先保持现有接口兼容,避免联调回归。
*/
#include <stdio.h>
#include <time.h>
#include <string.h>
@@ -27,6 +36,7 @@
#include "human_door.h"
#include "fire_sensor.h"
#include "hx711.hpp"
#include "su-03t.h"
#define TAG "MAIN"
#define CO2_SPOILAGE_THRESHOLD_PPM 1500.0f
@@ -66,12 +76,18 @@ typedef struct
bool light_on;
bool cool_on;
bool hot_on;
uint8_t su03t_last_msgno;
uint32_t su03t_rx_count;
} env_data_t;
static env_data_t s_env_data;
static SemaphoreHandle_t s_env_data_lock = NULL;
static volatile bool s_ui_ready = false;
/* 函数: reconfigure_twdt
* 作用: 执行模块内与函数名对应的业务逻辑。
* 重点: 关注输入合法性、返回码与并发安全。
*/
static void reconfigure_twdt(uint32_t timeout_ms, uint32_t idle_core_mask)
{
const esp_task_wdt_config_t twdt_cfg = {
@@ -86,6 +102,10 @@ static void reconfigure_twdt(uint32_t timeout_ms, uint32_t idle_core_mask)
}
}
/* 函数: wait_for_wifi_connected
* 作用: 执行模块内与函数名对应的业务逻辑。
* 重点: 关注输入合法性、返回码与并发安全。
*/
static bool wait_for_wifi_connected(TickType_t timeout_ticks)
{
const TickType_t start_ticks = xTaskGetTickCount();
@@ -98,6 +118,10 @@ static bool wait_for_wifi_connected(TickType_t timeout_ticks)
return false;
}
/* 函数: env_data_update_system_info
* 作用: 执行模块内与函数名对应的业务逻辑。
* 重点: 关注输入合法性、返回码与并发安全。
*/
static void env_data_update_system_info(void)
{
if (s_env_data_lock == NULL)
@@ -115,6 +139,10 @@ static void env_data_update_system_info(void)
set_var_local_time(s_env_data.time_str);
}
/* 函数: ui_task
* 作用: 执行模块内与函数名对应的业务逻辑。
* 重点: 关注输入合法性、返回码与并发安全。
*/
static void ui_task(void *arg)
{
for (;;)
@@ -132,6 +160,10 @@ static void ui_task(void *arg)
}
}
/* 函数: ui_init_task
* 作用: 执行模块内与函数名对应的业务逻辑。
* 重点: 关注输入合法性、返回码与并发安全。
*/
static void ui_init_task(void *arg)
{
(void)arg;
@@ -147,6 +179,10 @@ static void ui_init_task(void *arg)
vTaskDelete(NULL);
}
/* 函数: status_task
* 作用: 执行模块内与函数名对应的业务逻辑。
* 重点: 关注输入合法性、返回码与并发安全。
*/
static void status_task(void *arg)
{
(void)arg;
@@ -170,11 +206,19 @@ static void status_task(void *arg)
}
}
/* 函数: relay_status_text
* 作用: 执行模块内与函数名对应的业务逻辑。
* 重点: 关注输入合法性、返回码与并发安全。
*/
static const char *relay_status_text(bool on)
{
return on ? "" : "";
}
/* 函数: relay_status_task
* 作用: 执行模块内与函数名对应的业务逻辑。
* 重点: 关注输入合法性、返回码与并发安全。
*/
static void relay_status_task(void *arg)
{
(void)arg;
@@ -220,6 +264,10 @@ static void relay_status_task(void *arg)
}
}
/* 函数: sntp_task
* 作用: 执行模块内与函数名对应的业务逻辑。
* 重点: 关注输入合法性、返回码与并发安全。
*/
static void sntp_task(void *arg)
{
(void)arg;
@@ -234,6 +282,47 @@ static void sntp_task(void *arg)
vTaskDelete(NULL);
}
/* 函数: su03t_rx_callback
* 作用: 执行模块内与函数名对应的业务逻辑。
* 重点: 关注输入合法性、返回码与并发安全。
*/
static void su03t_rx_callback(const su03t_frame_t *frame, void *user_ctx)
{
(void)user_ctx;
if (frame == NULL) {
return;
}
char hex_buf[256];
size_t pos = 0;
for (size_t i = 0; i < frame->params_len && pos + 4 < sizeof(hex_buf); ++i) {
int n = snprintf(&hex_buf[pos], sizeof(hex_buf) - pos, "%02X ", frame->params[i]);
if (n <= 0) {
break;
}
pos += (size_t)n;
}
if (pos == 0) {
snprintf(hex_buf, sizeof(hex_buf), "(no params)");
}
ESP_LOGI(TAG, "SU03T RX msgno=0x%02X len=%u params=%s",
frame->msgno,
(unsigned)frame->params_len,
hex_buf);
if (s_env_data_lock) {
xSemaphoreTake(s_env_data_lock, portMAX_DELAY);
s_env_data.su03t_last_msgno = frame->msgno;
s_env_data.su03t_rx_count++;
xSemaphoreGive(s_env_data_lock);
}
}
/* 函数: hx711_task
* 作用: 执行模块内与函数名对应的业务逻辑。
* 重点: 关注输入合法性、返回码与并发安全。
*/
static void hx711_task(void *arg)
{
(void)arg;
@@ -330,6 +419,10 @@ static void hx711_task(void *arg)
}
}
/* 函数: app_main
* 作用: 执行模块内与函数名对应的业务逻辑。
* 重点: 关注输入合法性、返回码与并发安全。
*/
extern "C" void app_main(void)
{
vTaskDelay(pdMS_TO_TICKS(100));
@@ -398,6 +491,10 @@ extern "C" void app_main(void)
// 火焰传感器使用 ADC(GPIO3)
ESP_ERROR_CHECK(fire_sensor_init());
// SU-03T 语音模块UART2: RX=IO41 TX=IO42
ESP_ERROR_CHECK(su03t_init());
ESP_ERROR_CHECK(su03t_start_receiver(su03t_rx_callback, NULL, 4096, 5));
// GPIO16: HC-SR312, GPIO17: Door switch(低电平=关门)
ESP_ERROR_CHECK(human_door_init());
set_var_hum_status("无人");