You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
3.1 KiB

#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;
}