#include "system_monitor.h" #include "fatfs.h" #include "ff.h" #include #include // 静态变量 static SystemMonitorStats_t g_system_stats = {0}; /** * @brief 初始化系统监控模块 * @param None * @retval None */ void SystemMonitor_Init(void) { memset(&g_system_stats, 0, sizeof(SystemMonitorStats_t)); } /** * @brief 增加采样样点计数 * @param None * @retval None */ void SystemMonitor_IncrementSampleCount(void) { g_system_stats.total_samples++; } /** * @brief 报告数据处理溢出(数据来不及处理) * @param None * @retval None */ void SystemMonitor_ReportDataOverflow(void) { g_system_stats.data_overflow_count++; } /** * @brief 获取系统统计信息 * @param stats: 统计信息结构体指针 * @retval None */ void SystemMonitor_GetStats(SystemMonitorStats_t *stats) { if (stats != NULL) { memcpy(stats, &g_system_stats, sizeof(SystemMonitorStats_t)); } } /** * @brief 报告SD卡写入操作 * @param bytes_written: 写入的字节数 * @retval None */ void SystemMonitor_ReportSDWrite(uint32_t bytes_written) { g_system_stats.sd_write_count++; g_system_stats.sd_total_bytes_written += bytes_written; } /** * @brief 报告SD卡写入错误 * @param None * @retval None */ void SystemMonitor_ReportSDWriteError(void) { g_system_stats.sd_write_error_count++; } /** * @brief 报告SD卡缓冲区满 * @param None * @retval None */ void SystemMonitor_ReportSDBufferFull(void) { g_system_stats.sd_buffer_full_count++; } /** * @brief 报告SD卡文件创建 * @param None * @retval None */ void SystemMonitor_ReportSDFileCreated(void) { g_system_stats.sd_file_count++; } /** * @brief 报告数据丢弃(缓冲区满时未存储) * @param None * @retval None */ void SystemMonitor_ReportDataDropped(void) { g_system_stats.sd_data_dropped_count++; } /** * @brief 保存监控状态到文件 * @param None * @retval HAL_StatusTypeDef */ HAL_StatusTypeDef SystemMonitor_SaveStatus(void) { FIL file; FRESULT res; UINT bytes_written; char buffer[512]; // 创建或覆盖MONITOR.TXT文件 res = f_open(&file, MONITOR_STATUS_FILE, FA_CREATE_ALWAYS | FA_WRITE); if (res != FR_OK) { return HAL_ERROR; } // 格式化监控数据为文本 int len = snprintf(buffer, sizeof(buffer), "=== System Monitor Status ===\r\n" "Total Samples: %lu\r\n" "Data Overflow: %lu\r\n" "\r\n" "=== SD Card Stats ===\r\n" "SD Write Count: %lu\r\n" "SD Write Errors: %lu\r\n" "SD Buffer Full: %lu\r\n" "SD Total Bytes: %lu\r\n" "SD File Count: %lu\r\n" "SD Data Dropped: %lu\r\n", g_system_stats.total_samples, g_system_stats.data_overflow_count, g_system_stats.sd_write_count, g_system_stats.sd_write_error_count, g_system_stats.sd_buffer_full_count, g_system_stats.sd_total_bytes_written, g_system_stats.sd_file_count, g_system_stats.sd_data_dropped_count ); // 写入监控数据 res = f_write(&file, buffer, len, &bytes_written); if (res != FR_OK || bytes_written != (UINT)len) { f_close(&file); return HAL_ERROR; } // 关闭文件 f_close(&file); return HAL_OK; } /** * @brief 从文件加载监控状态 * @param None * @retval HAL_StatusTypeDef * @note 当前实现仅用于记录,不恢复状态(避免累积错误) */ HAL_StatusTypeDef SystemMonitor_LoadStatus(void) { // 当前实现:不从文件恢复状态 // 每次上电重新开始统计,避免累积错误 // MONITOR.TXT仅用于记录上次运行的状态 return HAL_OK; }