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