Files
ETH_TCP_Demo/app/error_handler.c
2026-03-09 15:34:18 +08:00

212 lines
5.2 KiB
C
Raw Permalink 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.

/*
* error_handler.c
*
* Created on: 2026-03-04
* Author: RT-Thread
*
* 功能: 错误处理与恢复模块实现
* 依赖: RT-Thread Nano, osal, transaction, state_manager
* 跨平台适配: 基于RT-Thread Nano使用标准API
*/
#include <rtthread.h>
#include "osal.h"
#include "transaction.h"
#include "state_manager.h"
#include "error_handler.h"
#include "sht40.h"
#include "lwip/netif.h"
#include "lwip/dhcp.h"
#include "drv_eth.h"
/**
* @brief 处理网络错误
* @param error 错误代码
* @param user_data 用户数据
* @return 0 成功非0 失败
*/
static int handle_network_error(error_code_t error, void *user_data)
{
osal_log_e("Network error: %d", error);
/* 设置网络状态为错误 */
state_manager_set_network_state(NETWORK_STATE_ERROR);
/* 尝试恢复网络连接 */
osal_log_i("Attempting to recover network connection...");
/* 具体的网络恢复逻辑 */
if (user_data != NULL)
{
struct netif *netif = (struct netif *)user_data;
/* 检查网络连接状态 */
ethernet_link_check_state(netif);
/* 如果网络连接已断开尝试重新启动DHCP */
if (!netif_is_link_up(netif))
{
osal_log_i("Network link down, waiting for link up...");
int wait_count = 0;
while (!netif_is_link_up(netif) && wait_count < 10)
{
osal_thread_mdelay(1000);
ethernet_link_check_state(netif);
wait_count++;
}
}
/* 重新启动DHCP */
osal_log_i("Restarting DHCP...");
dhcp_stop(netif);
osal_thread_mdelay(100);
dhcp_start(netif);
}
return 0;
}
/**
* @brief 处理传感器错误
* @param error 错误代码
* @param user_data 用户数据
* @return 0 成功非0 失败
*/
static int handle_sensor_error(error_code_t error, void *user_data)
{
osal_log_e("Sensor error: %d", error);
/* 设置传感器状态为错误 */
state_manager_set_sensor_state(SENSOR_STATE_ERROR);
/* 尝试恢复传感器 */
osal_log_i("Attempting to recover sensor...");
/* 具体的传感器恢复逻辑 */
int retry_count = 0;
while (retry_count < 3)
{
osal_log_i("Attempt %d: Reinitializing SHT40 sensor...", retry_count + 1);
if (sht40_init() == 0)
{
osal_log_i("SHT40 sensor recovered successfully");
state_manager_set_sensor_state(SENSOR_STATE_READY);
return 0;
}
osal_thread_mdelay(1000);
retry_count++;
}
osal_log_e("Failed to recover SHT40 sensor after %d attempts", retry_count);
return -1;
}
/**
* @brief 处理TCP错误
* @param error 错误代码
* @param user_data 用户数据
* @return 0 成功非0 失败
*/
static int handle_tcp_error(error_code_t error, void *user_data)
{
osal_log_e("TCP error: %d", error);
/* 设置TCP状态为错误 */
state_manager_set_tcp_state(TCP_STATE_ERROR);
/* 尝试恢复TCP连接 */
osal_log_i("Attempting to recover TCP connection...");
/* 具体的TCP恢复逻辑 */
/* 这里可以添加重新建立TCP连接的代码 */
return 0;
}
/**
* @brief 处理未知错误
* @param error 错误代码
* @param user_data 用户数据
* @return 0 成功非0 失败
*/
static int handle_unknown_error(error_code_t error, void *user_data)
{
osal_log_e("Unknown error: %d", error);
return 0;
}
/**
* @brief 初始化错误处理器
* @return 0 成功非0 失败
*/
int error_handler_init(void)
{
osal_log_i("Error handler initialized");
return 0;
}
/**
* @brief 处理错误
* @param error 错误代码
* @param user_data 用户数据
* @return 0 成功非0 失败
*/
int error_handler_process(error_code_t error, void *user_data)
{
switch (error)
{
case ERROR_NETWORK:
return handle_network_error(error, user_data);
case ERROR_SENSOR:
return handle_sensor_error(error, user_data);
case ERROR_TCP:
return handle_tcp_error(error, user_data);
case ERROR_UNKNOWN:
default:
return handle_unknown_error(error, user_data);
}
}
/**
* @brief 记录错误日志
* @param error 错误代码
* @param message 错误信息
* @return 0 成功非0 失败
*/
int error_handler_log(error_code_t error, const char *message)
{
switch (error)
{
case ERROR_NETWORK:
osal_log_e("[NETWORK ERROR] %s", message);
break;
case ERROR_SENSOR:
osal_log_e("[SENSOR ERROR] %s", message);
break;
case ERROR_TCP:
osal_log_e("[TCP ERROR] %s", message);
break;
case ERROR_UNKNOWN:
default:
osal_log_e("[UNKNOWN ERROR] %s", message);
break;
}
return 0;
}
/**
* @brief 触发错误报警
* @param error 错误代码
* @param message 错误信息
* @return 0 成功非0 失败
*/
int error_handler_alert(error_code_t error, const char *message)
{
/* 这里可以添加具体的报警逻辑比如发送通知、触发LED闪烁等 */
osal_log_e("[ALERT] %s", message);
return 0;
}