#include "save_file.h" #include "fatfs.h" #include "spi10.h" #include "rtc_process.h" #include "action_process.h" typedef enum { SAVE_STEP_INIT, SAVE_STEP_POWER_ON_WAIT, SAVE_STEP_SAVE_TIME_CHECK, SAVE_STEP_SAVE_MOUNT, SAVE_STEP_SAVE_FILE_OPEN, SAVE_STEP_SAVE_FILE_LSEEK, SAVE_STEP_SAVE_FILE_WRITE, SAVE_STEP_SAVE_FILE_CLOSE, SAVE_STEP_SAVE_ERROR, }SAVE_STEP; static SAVE_STEP SaveStep = SAVE_STEP_INIT; static uint32_t SaveFileTickCount; static uint8_t SaveMin; static FATFS FatFs; //Fatfs handle static FIL fil; //File handle static DIR dir; static FRESULT fres; //Result after operations uint8_t FileBuffer[512]; uint32_t WriteDataSize; static bool isGuidePrint; static bool isPowerOn; bool Save_SensorData_SDCard(uint16_t AverageCo2, uint16_t MaxCo2, uint16_t MinCo2, uint8_t State) { RTC_TIME rtc_time; uint32_t writeByte; MX_FATFS_Init(); fres = f_mount(&FatFs, "", 1); //1=mount now if(fres == FR_DISK_ERR) { FATFS_UnLinkDriver("0:/"); MX_FATFS_Init(); fres = f_mount(&FatFs, "", 1); //1=mount now } if(fres != FR_OK) { //dbg_printf("sdcard mount errorr\r\n"); return false; } rtc_time = RTC_Get_Time(); sprintf((char *)FileBuffer, "%04d%02d%02d", rtc_time.rtc_Year, rtc_time.rtc_Month, rtc_time.rtc_Date); //dbg_printf("open dir = %s\r\n", FileBuffer); fres = f_opendir(&dir, FileBuffer); if(fres != FR_OK) { fres = f_mkdir(FileBuffer); if(fres != FR_OK) { //dbg_printf("create directory error\r\n"); return false; } } sprintf((char *)FileBuffer, "/%04d%02d%02d/%02d.csv", rtc_time.rtc_Year, rtc_time.rtc_Month, rtc_time.rtc_Date, rtc_time.rtc_Hour); if(f_open(&fil, FileBuffer, FA_WRITE | FA_READ) != FR_OK) { //dbg_printf("file open error, retry\r\n"); if (f_open(&fil, FileBuffer, FA_CREATE_ALWAYS | FA_WRITE) != FR_OK) { //dbg_printf("file open error\r\n"); f_closedir(&dir); return false; } else { isGuidePrint = true; } } else { isGuidePrint = false; } fres = f_lseek(&fil, f_size(&fil)); if(fres != FR_OK) { f_closedir(&dir); f_close(&fil); return false; } if(isGuidePrint == true) { sprintf((char *)FileBuffer, "Time,Average_Co2,Max_Co2,Min_Co2,State\r\n"); fres = f_write(&fil, FileBuffer, strlen(FileBuffer), &writeByte); if(fres != FR_OK) { f_closedir(&dir); f_close(&fil); return false; } } sprintf((char *)FileBuffer, "%d:%d,%d,%d,%d,%d\r\n", rtc_time.rtc_Hour, rtc_time.rtc_Min, AverageCo2, MaxCo2, MinCo2, State); fres = f_write(&fil, FileBuffer, strlen(FileBuffer), &writeByte); if(fres != FR_OK) { f_closedir(&dir); f_close(&fil); return false; } f_close(&fil); f_closedir(&dir); return true; }