📄 filelist.c
字号:
#include <string.h>
#include "../global.h"
#include "filelist.h"
#include "fat.h"
#include "../delay.h"
// 弊贰侨 LCD
#include "../glcd/glcd.h"
#include "../glcd/ks0108.h"
#include "../glcd/icondef.h"
#include "../timer.h"
// global variables
struct tagFileListBuffer FileListBuffer;
struct tagPath Path;
U8 curPos; // List俊辑 泅犁 困摹(0~4)
extern struct tagDirEntryBuffer DirEntryBuffer;
extern U32 RootCluster;
extern U8 bTimerUpdateName;
extern void MP3Play(struct tagFileInfo fileInfo);
void fileListBufferInit(void)
{
U8 i;
FileListBuffer.index = 0;
FileListBuffer.size = LIST_SIZE;
for(i=0; i<FileListBuffer.size; i++)
{
FileListBuffer.fileInfo[i].attr = 0;
FileListBuffer.fileInfo[i].startCluster = 0;
FileListBuffer.fileInfo[i].fileName[i] = 0;
}
}
int fileListBufferInsert(struct tagFileInfo fileInfo)
{
if(fileListBufferIsFull())
return -1;
FileListBuffer.fileInfo[FileListBuffer.index++] = fileInfo;
return 0;
}
U8 fileListBufferIsEmpty(void)
{
if(FileListBuffer.index == 0)
return 1;
else
return 0;
}
U8 fileListBufferIsFull(void)
{
if(FileListBuffer.index == FileListBuffer.size)
return 1;
else
return 0;
}
void fileListBufferClear(void)
{
fileListBufferInit();
}
// ----------------------------------------------------------------------
void pathInit(void)
{
Path.index = -1;
}
U32 pathGetCur(void)
{
if(pathIsEmpty())
return 0;
return Path.cluster[Path.index];
}
U8 *pathGetCwd()
{
if(pathIsEmpty())
return 0;
return Path.cwd[Path.index];
}
int pathPush(U32 cluster, U8 count, U8* dir)
{
if(pathIsFull())
return -1;
Path.index++;
Path.cluster[Path.index] = cluster;
Path.count[Path.index] = count;
strcpy(Path.cwd[Path.index], dir);
return 0;
}
int pathPop(void)
{
U8 count = Path.count[Path.index];
if(pathIsEmpty())
return -1;
Path.index--;
return count;
}
U8 pathIsFull(void)
{
if(Path.index == MAX_SUB_DIR-1)
return 1;
else
return 0;
}
U8 pathIsEmpty(void)
{
if(Path.index == -1)
return 1;
else
return 0;
}
// ----------------------------------------------------------------------
void fileListPrint(void)
{
U8 i;
U8 icon = ICON_FILE;
U8 yaddr=0;
U8 name[MAX_PUT_NAME_LEN+1]; // 拳搁俊 钎矫且 捞抚狼 弥措辨捞绰 14
struct tagFileInfo fileInfo;
// 付瘤阜 颇老狼 沥焊甫 佬绢咳
fileInfo = fatGetFileInfo(DirEntryBuffer.cluster[DirEntryBuffer.index-1],
DirEntryBuffer.entry[DirEntryBuffer.index-1]);
glcdClearScreen();
for(i=0; i < FileListBuffer.index; i++)
{
if(strcmp(FileListBuffer.fileInfo[i].fileName, DIR_CURRENT) == 0 || // 泅犁 叼泛磐府 or 杭俘ID
FileListBuffer.fileInfo[i].attr == ATTR_VOLUME_ID)
{
strcpy(FileListBuffer.fileInfo[i].fileName, pathGetCwd()); // 泅犁 叼泛磐府肺 捞抚阑 函版
FileListBuffer.fileInfo[i].attr = ATTR_CWD; // 加己阑 函版
icon = ICON_CWD;
}
else if(FileListBuffer.fileInfo[i].attr == ATTR_CWD) // Current Work Directory 捞搁
{
icon = ICON_CWD;
}
else if(strcmp(FileListBuffer.fileInfo[i].fileName, DIR_PARENT) == 0) // 惑困 叼泛磐府搁
{
icon = ICON_TO_UP;
}
// 付瘤阜 颇老捞搁(矫累 努矾胶磐啊 鞍栏搁 鞍篮 颇老)
else if(FileListBuffer.fileInfo[i].startCluster == fileInfo.startCluster)
{
if(FileListBuffer.fileInfo[i].attr == ATTR_DIRECTORY)
icon = ICON_LAST_DIR;
else
icon = ICON_LAST_FILE;
}
else
{
if(FileListBuffer.fileInfo[i].attr == ATTR_DIRECTORY)
icon = ICON_DIR;
else
icon = ICON_FILE;
}
glcdSetAddress(0, yaddr);
glcdWriteIcon16(icon); // 酒捞能 免仿
strNcopy(name, FileListBuffer.fileInfo[i].fileName, MAX_PUT_NAME_LEN);
glcdPutString(name, NORMAL); // 颇老疙 免仿
yaddr += 2;
}
}
U8 fileListInit(U32 cluster)
{
U8 i;
struct tagFileInfo fileInfo;
fatDirEntryBufferInit(); // DirEntryBuffer 檬扁拳
fileListBufferInit(); // fileListBuffer 檬扁拳
fatGetDirEntry(cluster); // 叼泛磐府 浚飘府 沥焊甫 DirEntryBuffer俊 眠啊
for(i=0; i < DirEntryBuffer.index; i++) // 拳老沥焊甫 fileListBuffer俊 眠啊
{
fileInfo = fatGetFileInfo(DirEntryBuffer.cluster[i], DirEntryBuffer.entry[i]);
if(fileListBufferInsert(fileInfo) != 0) // 滚欺啊 促瞒搁 狐廉唱皑
break;
}
return 0;
}
void fileListBrowse(void)
{
U8 i, start;
U8 nFile, totalFile; // 拳搁 坷弗率 惑窜俊 000/000 屈怕肺 颇老 荐甫 唱鸥晨 ex) 001/020, 20邦吝俊 1锅邦
struct tagFileInfo fileInfo;
S8 count = 1; // DirEntryBuffer郴俊辑 颇老狼 困摹甫 唱鸥晨
curPos = 2; // 霉临篮 CWD甫 钎矫, 2锅掳 临何磐 颇老
U8 name[MAX_PUT_NAME_LEN+1]; // 拳搁俊 钎矫且 捞抚狼 弥措辨捞绰 14
U8 offset;
U8* fileName_ptr = FileListBuffer.fileInfo[curPos-1].fileName;
pathInit();
pathPush(RootCluster, 0, DIR_ROOT); // 风飘 叼泛磐府狼 困摹甫 历厘, 0:狼固绝绰 蔼(风飘叼泛磐府啊 弥惑困捞骨肺)
fileListInit(pathGetCur());
glcdClearScreen();
fileListPrint();
glcdSetAddress(16, curPos); // 泅犁 急琶等 颇老疙阑 开惑 臂揪肺 免仿
strNcopy(name, FileListBuffer.fileInfo[curPos-1].fileName, MAX_PUT_NAME_LEN);
glcdPutString(name, INVERSE);
while(1)
{
if(bTimerUpdateName)
{
offset = strNcopy(name, fileName_ptr, 14); // 茄临俊 康巩 16磊鳖瘤 钎矫啊瓷
if(offset > 0)
{
glcdSetAddress(16, curPos);
glcdPutString(name, INVERSE);
fileName_ptr += offset;
bTimerUpdateName = 0;
}
else
fileName_ptr = FileListBuffer.fileInfo[curPos-1].fileName;
}
/*
// 虐 涝仿 贸府
switch(KEY_INPUT())
{
case KEY_PLAY:
*/
if(DirEntryBuffer.index <= 1) // 颇老捞 绝栏搁
break;
delay_ms(200);
if(FileListBuffer.fileInfo[curPos].attr != ATTR_DIRECTORY &&
FileListBuffer.fileInfo[curPos].attr != ATTR_CWD) // 颇老捞 酒聪搁
{
// 颇老荐甫 备窃
if(strcmp(pathGetCwd(), DIR_ROOT) == 0)
{
nFile = count;
totalFile = DirEntryBuffer.index - 1;
}
else
{
nFile = count - 1;
totalFile = DirEntryBuffer.index - 2;
}
glcdClearScreen();
// 颇老荐甫 钎矫
glcdSetAddress(9, 0);
glcdPutU32Dec16(nFile, 3, NORMAL);
glcdPutEngChar('/', NORMAL);
glcdPutU32Dec16(totalFile, 3, NORMAL);
// 泅犁 叼泛磐府甫 钎矫
glcdSetAddress(0, 2);
glcdWriteIcon16(ICON_CWD);
glcdPutString(pathGetCwd(), NORMAL);
// 泅犁 急琶茄 颇老阑 犁积
MP3Play(FileListBuffer.fileInfo[curPos-1]);
// 犁积捞 场唱搁 拳搁 汗盔
glcdClearScreen();
fileListPrint();
glcdSetAddress(16, curPos+1); // 泅犁 急琶等 颇老疙阑 开惑 臂揪肺 免仿
strNcopy(name, FileListBuffer.fileInfo[curPos-1].fileName, MAX_PUT_NAME_LEN);
glcdPutString(name, INVERSE);
curPos++;
}
/*
break;
case KEY_FF:
break;
case KEY_REW:
break;
case KEY_VOL_UP:
if(DirEntryBuffer.index <= 1) // 颇老捞 绝栏搁
break;
if(curPos == MIN_LIST_POS || count == 1) // 霉 临捞芭唱 贸澜 颇老捞搁
{
start = count - LIST_SIZE;
curPos = MAX_LIST_POS; // 付瘤阜 临肺 捞悼
count--;
if(count <= 1) // 贸澜 颇老捞搁
{
count = DirEntryBuffer.index - 1; // 付瘤阜 颇老肺 捞悼
curPos = count % LIST_SIZE; // 付瘤阜 颇老阑 啊府虐档废
start = count - curPos;
}
fileListBufferClear();
for(i=start; i < DirEntryBuffer.index; i++) // 捞傈 拳老沥焊甫 fileListBuffer俊 眠啊
{
fileInfo = fatGetFileInfo(DirEntryBuffer.cluster[i], DirEntryBuffer.entry[i]);
if(fileListBufferInsert(fileInfo) != 0) // 滚欺啊 促瞒搁 狐廉唱皑
break;
}
fileListPrint();
}
else
{
glcdGotoXY(2, curPos); // 捞傈俊 急琶等 颇老疙阑 焊烹 臂揪肺 免仿
strNcopy(name, FileListBuffer.fileInfo[curPos].fileName, MAX_PUT_NAME_LEN);
glcdPutString(name, NORMAL);
curPos--;
count--;
}
glcdGotoXY(2, curPos); // 货肺 急琶等 颇老疙阑 开惑 臂揪肺 免仿
strNcopy(name, FileListBuffer.fileInfo[curPos].fileName, MAX_PUT_NAME_LEN);
glcdPutString(name, INVERSE);
delay_ms(BOUNCE_DELAY);
break;
case KEY_VOL_DN:
if(DirEntryBuffer.index <= 1) // 颇老捞 绝栏搁
break;
if(curPos == MAX_LIST_POS || count == DirEntryBuffer.index-1) // 付瘤阜 临捞芭唱 付瘤阜 颇老捞搁
{
curPos = MIN_LIST_POS; // 霉临肺 捞悼
count++;
if(count >= DirEntryBuffer.index) // 付瘤阜 颇老捞搁
count = 0;
fileListBufferClear();
for(i=count; i < DirEntryBuffer.index; i++) // 促澜 拳老沥焊甫 fileListBuffer俊 眠啊
{
fileInfo = fatGetFileInfo(DirEntryBuffer.cluster[i], DirEntryBuffer.entry[i]);
if(fileListBufferInsert(fileInfo) != 0) // 滚欺啊 促瞒搁 狐廉唱皑
break;
}
fileListPrint();
}
else
{
glcdGotoXY(2, curPos); // 捞傈俊 急琶等 颇老疙阑 焊烹 臂揪肺 免仿
strNcopy(name, FileListBuffer.fileInfo[curPos].fileName, MAX_PUT_NAME_LEN);
glcdPutString(name, NORMAL);
curPos++;
count++;
}
if(FileListBuffer.fileInfo[curPos].attr == ATTR_CWD) // CWD 钎矫临篮 急琶登瘤 臼档废 逞绢皑
{
curPos++;
count++;
}
glcdGotoXY(2, curPos); // 货肺 急琶等 颇老疙阑 开惑 臂揪肺 免仿
strNcopy(name, FileListBuffer.fileInfo[curPos].fileName, MAX_PUT_NAME_LEN);
glcdPutString(name, INVERSE);
delay_ms(BOUNCE_DELAY);
break;
case KEY_ENTER:
if(FileListBuffer.fileInfo[curPos].attr == ATTR_DIRECTORY) // 叼泛磐府搁
{
// 惑困 叼泛磐府肺 捞悼捞搁
if(strcmp(FileListBuffer.fileInfo[curPos].fileName, DIR_PARENT) == 0)
{
count = pathPop();
curPos = count % LIST_SIZE;
start = (count/LIST_SIZE) * LIST_SIZE;
fileListInit(pathGetCur()); // 货 叼泛磐府狼 颇老府胶飘肺 函版
fileListBufferClear(); // 府胶飘甫 厚快绊,
// 捞傈俊 急琶沁带 颇老捞 乐绰 困摹何磐 府胶飘 促矫 盎脚
for(i=start;i < DirEntryBuffer.index; i++) // 促澜 拳老沥焊甫 fileListBuffer俊 眠啊
{
fileInfo = fatGetFileInfo(DirEntryBuffer.cluster[i], DirEntryBuffer.entry[i]);
if(fileListBufferInsert(fileInfo) != 0) // 滚欺啊 促瞒搁 狐廉唱皑
break;
}
}
else // 窍困 叼咆磐府肺 捞悼捞搁
{ // 泅犁 叼泛磐府狼 林家客 fileListBuffer 郴俊辑狼 困摹(count)甫 历厘
pathPush(FileListBuffer.fileInfo[curPos].startCluster, count, FileListBuffer.fileInfo[curPos].fileName);
count = 1;
curPos = 1;
fileListInit(pathGetCur()); // 货 叼泛磐府狼 颇老府胶飘肺 函版
}
glcdClearScreen();
fileListPrint();
glcdGotoXY(2, curPos); // 泅犁 急琶等 颇老疙阑 开惑 臂揪肺 免仿
strNcopy(name, FileListBuffer.fileInfo[curPos].fileName, MAX_PUT_NAME_LEN);
glcdPutString(name, INVERSE);
}
delay_ms(BOUNCE_DELAY);
break;
case KEY_FUNC:
break;
default:
break;
}
*/
} // end while
}
U8 strNcopy(U8 *dest, U8 *src, U8 len)
{
U16 i, ncopied;
for(i=0; i < len; i++)
{
if((dest[i] = src[i]) == 0)
break;
if(dest[i] > 0x80)
{
if(i == len - 1) // 付瘤阜 臂磊啊 茄臂 馆磊搁 肋府瘤 臼档废 汗荤 救窃
break;
else
{
i++;
dest[i] = src[i];
}
}
}
ncopied = i;
// len焊促 陋栏搁 傍归栏肺 盲框
while(i < len)
dest[i++] = ' ';
dest[i] = 0;
return ncopied; // 汗荤等 巩磊荐甫 府畔
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -