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

📄 main.c

📁 使用VC模拟一个在单片机内部FLASH的顺序文件系统
💻 C
字号:
#include "stdio.h"
#include "stdlib.h"
#include "type.h"

#include "filesystem.h"

#include "flash.h"

#include "main.h"


uint8 sysTemp[64];


/*******************************************************************************************/

void main()
{
	
	uint8 usrkey;
	uint16 usrTemp;
	uint16 usr_dirID = 0;
	uint16 usr_fileID;
	uint16 usr_fileLen;
	uint8 usr_auth;
	uint8 usr_type;
	uint8 list_mode;
	uint8 i;
	while(1)
	{
		printf("\n\nFile Menu:\n");
		printf("-------------------------------------------------------------\n");
		printf(	"  C[h]Dir    [L]ist   Create[D]ir   Create[F]ile   Create[A]pp\n"
			"  DelD[i]r   D[e]leteFile FileIni[T] \n"
			"  [O]pen     [R]ead   [W]rite      [C]lose\n"
			"  Cr[y]ptMenu         Set[u]pMenu   E[x]it\n" );
		putchar('\n');
		printf("please input your selection:");
		usrkey = getch();
		printf("%c",usrkey);
		putchar('\n');
		switch (usrkey)
		{
		case 'l':
			usr_dirID = 0;
			printf(" file list:\n");
			printf("   dirID   fileID   length   auth   type");
			list_mode = 0;
			while (1)
			{
				if(list_mode == 2) break;
				FILEList(list_mode);
				list_mode = 1;
				for(i=0;i<64;i++)
				{
					switch(i % 8)
					{
					case 0:		// dirID
						putchar('\n');
						printf("   %02x",sysTemp[i]);
						break;
					case 1:
						printf("%02x",sysTemp[i]);
						break;
					case 2:		// fileID
						printf("     %02x",sysTemp[i]);
						break;
					case 3:
						printf("%02x",sysTemp[i]);
						break;
					case 4:		// 长度
						printf("     %02d",(sysTemp[i] * 256 + sysTemp[i +1] ) / 100);
						break;
					case 5:
						printf("%02d",(sysTemp[i -1] * 256 + sysTemp[i] ) % 100);
						break;
					case 6:		// 权限
						printf("     %d",sysTemp[i]);
						break;
					case 7:
						//printf("     %d",sysTemp[i]);
						switch (sysTemp[i])
						{
						case 0:
							printf("     FREE");
							break;
						case 1:
							printf("     DIR");
							break;
						case 2:
							printf("     DATA");
							break;
						case 3:
							printf("     MD5");
							break;
						case 4:
							printf("     TEA");
							break;
						}
						if(sysTemp[i] == FREE_TYPE)
						{
							list_mode = 2;
						}
						break;
					}
					if (list_mode == 2)
					{
						break;
					}
				}
				break;
			}
			break;
		case 't':
			FILEInit();			
			break;
		case 'f':
			// 输入文件ID,默认是在根目录下面创建 所以usr_dirID 不需要输入
			printf("please input the fileID:");
			scanf("%x",&usr_fileID);
			fileHost->fileID[0] = usr_fileID >> 8;
			fileHost->fileID[1] = usr_fileID & 0x00ff;

			// 输入文件类型
			printf("please input the file type(2:DATA   3:MD5   4:TEA):");
			scanf("%d",&usr_type);
			fileHost->type = usr_type;

			if(usr_type == FILE_TYPE)	//数据文件
			{
				printf("please input your file Length:");
				scanf("%d",&usr_fileLen);
				fileHost->length[0] = usr_fileLen >> 8;
				fileHost->length[1] = usr_fileLen & 0x00ff;

				// 确定文件权限

			}
			else if (usr_type == MD5_TYPE)	//MD5文件
			{
				fileHost->length[0] = 0;
				fileHost->length[1] = 16;	// 默认长度16
				// 确定文件权限

			}		
			else if (usr_type == TEA_TYPE)	//TEA文件
			{
				fileHost->length[0] = 0;
				fileHost->length[1] = 16;	// 默认长度16
				// 确定文件权限
			}
			if(FILECreateItem())
			{
				printf("Create file failed!\n");
			}
			else
			{
				printf("Create file OK!\n");
			}
			break;
		case 'd':	// 创建目录
			// 输入目录ID
			printf("please input the dirID:");
			scanf("%x",&usr_dirID);
			if(usr_dirID == 0)
			{
				printf("index error!");
				break;
			}
			fileHost->dirID[0] = usr_dirID >> 8;
			fileHost->dirID[1] = usr_dirID & 0x00ff;

			//文件ID为0
			fileHost->fileID[0] = 0;
			fileHost->fileID[1] = 0;

			//文件长度 0
			fileHost->length[0] = 0;
			fileHost->length[1] = 0;

			// 文件读写权限,暂时没考虑,日后添加
			fileHost->authority = 0;
			
			// 文件类型
			fileHost->type = DIR_TYPE;

			if(FILECreateItem())// 创建目录
			{
				printf("Create dir failed!\n");
			}
			else
			{
				printf("Create dir OK!\n");
			}
			break;
		case 'h'://进入目录
			printf("please input the dirID you want to change in:");
			scanf("%x",&usr_dirID);
			fileHost->dirID[0] = usr_dirID >> 8;
			fileHost->dirID[1] = usr_dirID & 0x00ff;
			fileHost->fileID[0] = 0;
			fileHost->fileID[1] = 0;
			fileHost->type = DIR_TYPE;
			if(FILE_LOCATE_OK== FILELocateID())
			{
				//存在当前目录 可以进入
				printf("change dir OK!");
			}
			else
			{
				// 不存在当前ID或者程序错误
				printf("change dir error!");
				usr_dirID = 0;			// 返回到根目录
			}
			break;
		case 'i':
			// 删除目录
			printf("please input the dirID you want to del:");
			scanf("%x",&usr_dirID);
			fileHost->dirID[0] = usr_dirID >> 8;
			fileHost->dirID[1] = usr_dirID & 0x00ff;
			fileHost->fileID[0] = 0;
			fileHost->fileID[1] = 0;
			fileHost->type = DIR_TYPE;
			//寻找是否存在这个目录
			break;
		case 'e':
			// 删除文件
			printf("please input the fileID you want to del:");
			scanf("%x",&usr_fileID);
			fileHost->dirID[0] = usr_dirID >> 8;
			fileHost->dirID[1] = usr_dirID & 0x00ff;
			fileHost->fileID[0] = usr_fileID >> 8;
			fileHost->fileID[1] = usr_fileID & 0x00ff;
			switch(FILEDelt())
			{
			case RIGHT_TOKEN:
				printf("delt file OK!");
				break;
			case ERROR_PROGRAM:
				printf("program ERROR!");
				break;
			case ERROR_INDEX:
				printf("delt file ERROR!");
				break;
			}
		}
		
	}
}



void RamSet(uint8 *p,uint8 dat,uint8 len)
{
	for(;len != 0;len--)
	{
		*p++ = dat;
	}
}

void RamCopy(uint8 *tar,uint8 *src,uint8 len)
{
	for(;len!=0;len--)
	{
		*tar++ = *src++;
	}
}

void RamPrint(uint8 *p)
{
	uint8 i;
	for(i=0;i<64;i++)
	{
		printf(" %2x ",*p);
		
		if((i % 8) == 7)
		{
			if(*p != 0)
			{
				printf("%\n");
			}
			else
			{
				return;
			}
		}
		p++;
	}
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -