143 lines
3.1 KiB
C
Raw Normal View History

//SD <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> FatFs <20>еĺ<D0B5><C4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#include "stdio.h"
#include "string.h"
#include "key.h"
#include "lcd.h"
#include "ff.h"
#include "ff_gen_drv.h"
#include "sd_diskio_dma.h"
#include "GameEngine.h"
#include "SD.h"
/**************************************** ȫ<>ֱ<EFBFBD><D6B1><EFBFBD> ****************************************/
FATFS fs;
char DiskPath[4] = {0, 0, 0, 0};
/*****************************************************************************************/
/**************************************** ˽<>к<EFBFBD><D0BA><EFBFBD> ****************************************/
uint8_t SD_Mount(void);
uint8_t SD_DeMount(void);
/*****************************************************************************************/
/**
* @brief SD <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
* @retval <EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<EFBFBD><EFBFBD>ʧ<EFBFBD>ܷ<EFBFBD><EFBFBD><EFBFBD> 1
*/
uint8_t SD_Init(void)
{
FATFS_LinkDriver(&SD_Driver, DiskPath);
return SD_Mount();
}
/**
* @brief SD <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD> SD <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<EFBFBD><EFBFBD>ʧ<EFBFBD>ܷ<EFBFBD><EFBFBD><EFBFBD> 1
*/
uint8_t SD_DeInit(void)
{
return SD_DeMount();
}
/**
* @brief SD <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<EFBFBD><EFBFBD>ʧ<EFBFBD>ܷ<EFBFBD><EFBFBD><EFBFBD> 1
*/
uint8_t SD_Mount(void)
{
if (f_mount(&fs, DiskPath, 0) != FR_OK)
return SD_ERROR;
else
return SD_OK;
}
/**
* @brief SD <EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD>
* @retval <EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<EFBFBD><EFBFBD>ʧ<EFBFBD>ܷ<EFBFBD><EFBFBD><EFBFBD> 1
*/
uint8_t SD_DeMount(void)
{
if (f_mount(NULL, DiskPath, 0) != FR_OK)
return SD_ERROR;
else
return SD_OK;
}
/**
* @brief SD <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD>
* @param filepath: <EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD>
* @param filename: <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD>
* @retval <EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<EFBFBD><EFBFBD>ʧ<EFBFBD>ܷ<EFBFBD><EFBFBD><EFBFBD> 1
*/
uint8_t SD_GetPath(uint8_t *filepath, uint8_t *filename)
{
if (DiskPath[0] == 0)
return SD_ERROR;
else
sprintf(filepath, "%s%s", DiskPath, filename);
return SD_OK;
}
/**
* @brief SD <EFBFBD><EFBFBD> GUI <EFBFBD>ļ<EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param filepath: <EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD>
* @param filesuffix: <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>׺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>NULL ʱ<EFBFBD><EFBFBD><EFBFBD>޺<EFBFBD>׺
* @retval <EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<EFBFBD><EFBFBD>ʧ<EFBFBD>ܷ<EFBFBD><EFBFBD><EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> JOY_L <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2
*/
uint8_t SD_SelectFile(uint8_t *filename, uint8_t *filesuffix)
{
DIR DirInf;
FILINFO FileInf;
uint32_t num;
uint8_t content[GE_GUI_MENUBOX_MAX_CONTENT_NUM][GE_GUI_MENUBOX_CONTENT_LEN];
if (f_opendir(&DirInf, DiskPath) != FR_OK)
return SD_ERROR;
for (num = 0; num < GE_GUI_MENUBOX_MAX_CONTENT_NUM;)
{
if (f_readdir(&DirInf, &FileInf) != FR_OK || FileInf.fname[0] == 0) //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
break;
if (FileInf.fname[0] == '.' || strcmp(FileInf.fname, "System Volume Information") == 0) //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
continue;
//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
if (FileInf.fattrib & AM_DIR)
{
sprintf(content[num], "%s/", (char *)FileInf.fname);
}
else
{
if (filesuffix != NULL)
{
char *suffix = strrchr(FileInf.fname, '.');
suffix++;
if (strcmp(suffix, filesuffix) != 0)
continue;
}
sprintf(content[num], "%s", FileInf.fname);
}
num++;
}
uint8_t choice = GE_GUI_MenuBox(5, 5, 310, 230, "<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>", num, content, NULL);
if (choice == 0)
return 2;
strcpy(filename, content[choice - 1]);
return SD_OK;
}