⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filelist.c

📁 Mp3 Player using ATmega128, VS1003B, Character LCD. Test OK.Good Sound.
💻 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 + -