#include "bsp_fatfs.h"
#include "ext_sram.h"
#include "project_var.h"
#include "stm32f4xx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

OS_EVENT *sd_mutex = NULL;

FATFS FatFs[_VOLUMES]; /* FatFs文件系统对象  4144字节*/
FIL   file_object;     /* 文件对象           4132字节*/

/****************************************************
 *  函 数 名：get_fattime
 *  函数功能：文件系统获取时间
 *  入口参数：
 *  返 回 值：时间
 *****************************************************/
DWORD get_fattime(void)
{
    RTC_TimeTypeDef RTC_TimeStruct;
    RTC_DateTypeDef RTC_DateStruct;

    RTC_GetTime(RTC_Format_BIN, &RTC_TimeStruct);
    RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);
    /* 返回当前时间戳 */
    return ((DWORD)(2000 + RTC_DateStruct.RTC_Year - 1980) << 25) /* Year 2019 */
           | ((DWORD)RTC_DateStruct.RTC_Month << 21)              /* Month */
           | ((DWORD)RTC_DateStruct.RTC_Date << 16)               /* Mday */
           | ((DWORD)RTC_TimeStruct.RTC_Hours << 11)              /* Hour */
           | ((DWORD)RTC_TimeStruct.RTC_Minutes << 5)             /* Min */
           | ((DWORD)RTC_TimeStruct.RTC_Seconds >> 1);            /* Sec */
}

/****************************************************
 *  函 数 名：FileSystem_Init
 *  函数功能：文件系统初始化
 *  入口参数：
 *  说    明：无
 *****************************************************/
void fatfs_init(void)
{
    FRESULT res;                       /* 文件操作结果 */
    res = f_mount(&FatFs[0], "0:", 1); // 文件系统挂载时会对TF初始化
    /* 如果没有文件系统就格式化创建创建文件系统 */
    if (res == FR_NO_FILESYSTEM) // TF 卡没有文件系统
    {
        res = f_mkfs("0:", 0, 0); // 格式化
        if (res == FR_OK)
        {
            DEBUG("TF format ok\r\n");
            res = f_mount(NULL, "0:", 1);      /* 格式化后，先取消挂载 */
            res = f_mount(&FatFs[0], "0:", 1); /* 重新挂载	*/
        }
        else
        {
            LED1_RUN_OFF;
            DEBUG("TF format fail\r\n");
        }
    }
    else if (res != FR_OK)
    {
        LED1_RUN_OFF;
        DEBUG("!!!TF mount file system fail (%d)\r\n", res);
    }
    else
    {
        LED1_RUN_ON;
        DEBUG("TF File system mount ok !\r\n");
    }

    res = f_mount(&FatFs[1], "1:", 1); // 文件系统挂载时会对NAND初始化
    /* 挂载文件系统 */
    // if (res == FR_NO_FILESYSTEM) // NAND 没有文件系统
    // {
    //     res = f_mkfs("1:", 0, 0); // 格式化
    //     if (res == FR_OK)
    //     {
    //         DEBUG("TF format ok\r\n");
    //         res = f_mount(NULL, "1:", 1); /* 格式化后，先取消挂载 */
    //         res = f_mount(&fs, "1:", 1);  /* 重新挂载	*/
    //     }
    //     else
    //     {
    //         // LED_FAULT_ON;
    //         DEBUG("TF format fail\r\n");
    //     }
    // }
    // else
    /* 如果没有文件系统就格式化创建创建文件系统 */
    if (res == FR_NO_FILESYSTEM) // TF 卡没有文件系统
    {
        res = f_mkfs("1:", 0, 0); // 格式化
        if (res == FR_OK)
        {
            DEBUG("Nand flash format ok\r\n");
            res = f_mount(NULL, "1:", 1);      /* 格式化后，先取消挂载 */
            res = f_mount(&FatFs[1], "1:", 1); /* 重新挂载	*/
        }
        else
        {
            LED1_RUN_OFF;
            DEBUG("Nand flash format fail\r\n");
        }
    }
    if (res != FR_OK)
    {
        LED0_RUN_OFF;
        DEBUG("!!!Nand flash mount file system fail (%d)\r\n", res);
    }
    else
    {
        LED0_RUN_ON;
        DEBUG("Nand flash file system mount ok !\r\n");
    }
}
