Files
ESP32_COMM/main/core/main.cpp
T
小龙虾 6641ca4afd feat(health_monitor): 移除电压监控功能并优化OTA健康检查
- 移除ESP32电压监控相关代码,因为ESP32-C3无内置电压传感器
- 更新健康监控模块,从"温度+电压+WiFi RSSI监控"改为"温度+WiFi RSSI监控"
- 修改OTA健康检查频率,从每次包处理改为每32个包检查一次
- 添加OTA期间WiFi RSSI采样年龄限制和更宽松的阈值

docs: 更新文档中的系统监控描述

- 从README.md、开发指南和设计文档中移除电压监控相关内容
- 更新WebUI接口文档中的状态查询描述

refactor(wifi_ota): 增加系统状态响应中的运行时间信息

- 在/system/status接口响应中添加uptime_sec字段
- 前端工具页面显示系统运行时间

feat(wifi_ota): 添加ESP32重启接口和前端控制

- 新增/restart HTTP POST接口用于重启ESP32
- 在前端界面添加重启按钮替代健康检查按钮
- 移除前端健康检查功能

perf(ota_relay): 调整OTA块大小提升传输性能

- 将OTA块大小从4096字节增加到8192字节
- 更新固件上传和存储相关的缓冲区大小配置
2026-05-05 21:55:29 +08:00

235 lines
8.0 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.
/*
* ESP32-C3FH4 OTA 中继 - 程序入口
* 四个 FreeRTOS 任务:System Monitor / OTA Relay / WiFi Server / BLE GATT
*
* 新增:周期性状态监控任务,每 10 秒打印系统状态
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_system.h"
#include "esp_netif.h"
#include "esp_event.h"
#include "monitor/health_monitor.h"
#include "relay/ota_relay.h"
#include "transport/spi_master.h"
#include "server/wifi_ota.h"
#include "server/ble_ota.h"
#include "transport/protocol.h"
#include "monitor/debug_log.h"
/**
* @brief 状态监控任务
* @param pvParameters
*/
static void status_monitor_task(void *pvParameters);
/**
* @brief 程序主入口,初始化系统组件并创建各 FreeRTOS 任务。
*/
extern "C" void app_main(void)
{
esp_chip_info_t chip_info;
esp_chip_info(&chip_info);
// 初始化网络接口 + 事件循环(必须最早)
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
// 初始化调试日志(UART0 先就绪,UDP socket 延迟到首次发送时创建)
debug_log_init();
// ★ WiFi 提前初始化(调度器启动前)
// 包括:NVS → netif 创建 → event handler 注册 → WiFi driver init → 配置 → connect
bool wifi_sta_ok = wifi_early_init();
health_monitor_init();
DEBUG_INFO("MAIN", "健康监控状态已初始化");
DEBUG_INFO("MAIN", "========================================");
DEBUG_INFO("MAIN", "ESP32-C3 OTA Relay v1.0 启动");
DEBUG_INFO("MAIN", "Chip: %s, Rev %d", CONFIG_IDF_TARGET, chip_info.revision);
DEBUG_INFO("MAIN", "Free heap: %lu bytes", esp_get_free_heap_size());
DEBUG_INFO("MAIN", "CPU Freq: %d MHz", CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ);
DEBUG_INFO("MAIN", "WiFi: %s", wifi_sta_ok ? "STA 连接中" : "将使用 AP 模式");
DEBUG_INFO("MAIN", "========================================");
// 健康监控任务(温度 + WiFi RSSI)
BaseType_t xRet;
xRet = xTaskCreatePinnedToCore(
health_monitor_task,
"health_mon",
4096,
NULL,
configMAX_PRIORITIES - 4,
NULL,
0
);
if (xRet != pdPASS) {
DEBUG_ERR("MAIN", "创建 health_monitor_task 失败");
} else {
DEBUG_INFO("MAIN", "健康监控任务已创建");
}
protocol_init();
DEBUG_INFO("MAIN", "协议层初始化完成");
esp_err_t ret = spi_master_init();
if (ret != ESP_OK) {
DEBUG_ERR("MAIN", "SPI 总线初始化失败: %d", ret);
} else {
DEBUG_INFO("MAIN", "SPI 总线初始化完成");
}
// OTA 中继任务(中高优先级)
xRet = xTaskCreatePinnedToCore(
ota_relay_task,
"ota_relay",
8192,
NULL,
configMAX_PRIORITIES - 2,
NULL,
0 // 核0
);
if (xRet != pdPASS) {
DEBUG_ERR("MAIN", "创建 ota_relay_task 失败");
} else {
DEBUG_INFO("MAIN", "OTA 中继任务已创建");
}
// WiFi OTA 服务器任务
xRet = xTaskCreatePinnedToCore(
wifi_ota_task,
"wifi_ota",
8192,
NULL,
configMAX_PRIORITIES - 3,
NULL,
0
);
if (xRet != pdPASS) {
DEBUG_ERR("MAIN", "创建 wifi_ota_task 失败");
} else {
DEBUG_INFO("MAIN", "WiFi OTA 任务已创建");
}
// BLE OTA 任务
xRet = xTaskCreatePinnedToCore(
ble_ota_task,
"ble_ota",
8192,
NULL,
configMAX_PRIORITIES - 3,
NULL,
0 // ESP32-C3 单核,固定核0
);
if (xRet != pdPASS) {
DEBUG_ERR("MAIN", "创建 ble_ota_task 失败");
} else {
DEBUG_INFO("MAIN", "BLE OTA 任务已创建");
}
// 状态监控任务(低优先级,周期性打印系统状态)
xRet = xTaskCreatePinnedToCore(
status_monitor_task,
"status_mon",
4096,
NULL,
configMAX_PRIORITIES - 5,
NULL,
0
);
if (xRet != pdPASS) {
DEBUG_ERR("MAIN", "创建 status_monitor_task 失败");
} else {
DEBUG_INFO("MAIN", "状态监控任务已创建");
}
DEBUG_INFO("MAIN", "========================================");
DEBUG_INFO("MAIN", "所有任务创建完成,OTA Relay 运行中");
DEBUG_INFO("MAIN", "调试日志输出: UDP(%s:%d) + UART0(GPIO21/TX, 115200)",
DEBUG_LOG_IP, DEBUG_LOG_PORT);
DEBUG_INFO("MAIN", "========================================");
}
// ============================================================
// 状态监控任务 - 每 10 秒打印系统状态
/**
* @brief 周期性打印系统运行状态,包括内存、WiFi 和 OTA 中继信息。
* @param pvParameters
*/
static void status_monitor_task(void *pvParameters)
{
(void)pvParameters;
DEBUG_INFO("STAT", "状态监控任务启动");
uint32_t loop_count = 0;
while (1) {
loop_count++;
uint32_t free_heap = esp_get_free_heap_size();
uint32_t min_free_heap = esp_get_minimum_free_heap_size();
health_state_t health = health_get_current();
relay_state_t relay = ota_relay_get_state();
int8_t rssi = wifi_get_rssi();
bool wifi_conn = wifi_is_connected();
// 打印状态头
DEBUG_INFO("STAT", "========== 系统状态 #%lu ==========", (unsigned long)loop_count);
// 内存状态
DEBUG_INFO("STAT", "内存: 空闲=%lu 字节, 最低=%lu 字节",
(unsigned long)free_heap, (unsigned long)min_free_heap);
// 健康状态
const char *health_str;
switch (health) {
case SYS_NORMAL: health_str = "正常"; break;
case SYS_WARNING: health_str = "警告"; break;
case SYS_CRITICAL: health_str = "危险"; break;
case SYS_SAFE_SHUTDOWN: health_str = "安全关机"; break;
default: health_str = "未知"; break;
}
DEBUG_INFO("STAT", "健康状态: %s (%d)", health_str, health);
// WiFi 状态
if (wifi_conn) {
DEBUG_INFO("STAT", "WiFi: 已连接, RSSI=%d dBm", rssi);
} else {
DEBUG_INFO("STAT", "WiFi: 未连接");
}
// OTA 中继状态
const char *relay_str;
switch (relay) {
case RELAY_IDLE: relay_str = "空闲"; break;
case RELAY_HANDSHAKE_IDLE: relay_str = "等待握手"; break;
case RELAY_HANDSHAKE_SENT: relay_str = "握手请求已发送"; break;
case RELAY_CHALLENGE_SENT: relay_str = "挑战已发送"; break;
case RELAY_CHALLENGE_RESPOND: relay_str = "收到握手响应"; break;
case RELAY_SESSION_KEY_SENT: relay_str = "会话密钥已发送"; break;
case RELAY_AUTH_COMPLETE: relay_str = "认证完成"; break;
case RELAY_SIZE_SENT: relay_str = "大小已发送"; break;
case RELAY_SIZE_ACK: relay_str = "大小确认"; break;
case RELAY_RECEIVING: relay_str = "接收中"; break;
case RELAY_RELAY_ACTIVE: relay_str = "转发中"; break;
case RELAY_PACKET_SENT: relay_str = "数据包已发送"; break;
case RELAY_PACKET_ACK_OK: relay_str = "ACK 正常"; break;
case RELAY_PACKET_ACK_RETRY: relay_str = "需要重试"; break;
case RELAY_RECEIVE_DONE: relay_str = "接收完成"; break;
case RELAY_TRANSFER_DONE: relay_str = "传输完成"; break;
case RELAY_FINISH_SENT: relay_str = "结束已发送"; break;
case RELAY_DONE: relay_str = "OTA 完成"; break;
case RELAY_ERROR: relay_str = "错误"; break;
default: relay_str = "未知"; break;
}
DEBUG_INFO("STAT", "OTA 中继: %s (%d)", relay_str, relay);
DEBUG_INFO("STAT", "======================================");
// 每 10 秒打印一次
vTaskDelay(pdMS_TO_TICKS(10000));
}
}