/* * error_handler.c * * Created on: 2026-03-04 * Author: RT-Thread * * 功能: 错误处理与恢复模块实现 * 依赖: RT-Thread Nano, osal, transaction, state_manager * 跨平台适配: 基于RT-Thread Nano,使用标准API */ #include #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; }