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

📄 file.c

📁 这个是录音琴的程序,用光电感应器来检测琴键的动作.并且将他记录下来,可以回放.
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************Copyright (c)***************************************

        文件管理.

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

#include   	"common.h"
#include   	"file.h"
#include	"hpi.h"
#include	"usb.H"

/*---------------------------------------------------------------------------------*/

UHWORD	    idata	MemMiscPt  = 0;		//曲目库位置
UHWORD	    idata	MemMiscCnt = 0;		//曲目库数量
UBYTE	    xdata	UsbItemBuf[32];		//U盘文件项
FILE_MANAGE xdata	FileList[16];		//内存文件项

/*-----------------------------------------------------------------------------------
名称: void FileListInital(void);
功能: 文件管理初始设定.
-----------------------------------------------------------------------------------*/
void FileListInital(void)
{
	UBYTE	i = 0;
	UBYTE	j = 0;

	for(i=0;i<16;i++)
	{
		for(j=0;j<8;j++)
			FileList[i].Name[j] = 0x20;

		FileList[i].Lenth   = 0;
		FileList[i].Address = 0;
	}
}

/*-----------------------------------------------------------------------------------
名称: UWORD FileListEmptySearch(UWORD Lenth);
功能: 文件目录表空余位置搜索.
-----------------------------------------------------------------------------------*/
UWORD FileListEmptySearch(UWORD Lenth)
{
	UBYTE	point = 0;
	UWORD	index = 0;

	for(point=0;point<16;point++)
	{
		if(FileList[point].Name[0]==' ')
			break;
	}

	if(point==0)
	{
		return(MEM_STA_ADDRESS);
	}
	else if((point>0)&&(point<16))
	{
		index = FileList[point-1].Lenth+FileList[point-1].Address;

		if(index+Lenth>MEM_END_ADDRESS)
		{
			FileListInital();
			return(MEM_STA_ADDRESS);
		}
		else
		{
			((UBYTE*)&index)[0]=point;
			return(index);
		}
	}
	else
	{
		FileListInital();
		return(MEM_STA_ADDRESS);
	}
}

/*-----------------------------------------------------------------------------------
名称: void FileSaveMemory(UBYTE *FileName);
功能: 存储文件到内存.
-----------------------------------------------------------------------------------*/
void FileSaveMemory(UBYTE *FileName)
{
	UBYTE	value = 0;
	UBYTE	pages = 0;
	UHWORD	count = 0;
	UHWORD  index = 0;
	UWORD   lenth = 0;
	UWORD   point = 0;

	((UBYTE*)&lenth)[0] = InOutBuf[18];
	((UBYTE*)&lenth)[1] = InOutBuf[19];
	((UBYTE*)&lenth)[2] = InOutBuf[20];
	((UBYTE*)&lenth)[3] = InOutBuf[21];
	lenth += 22;

	point = FileListEmptySearch(lenth);
	value = ((UBYTE*)&point)[0];
	((UBYTE*)&point)[0] = 0;

	for(pages=0;pages<8;pages++)
		FileList[value].Name[pages] = FileName[pages];

	FileList[value].Lenth   = lenth;
	FileList[value].Address = point;

	pages = point/0x8000;
	index = point%0x8000;

	for(count=0;count<lenth;count++)
	{
		RamAreaSelect(0);
		value = InOutBuf[count];
		RamAreaSelect(pages);
		XBYTE[index++] = value;

		if(index==0x8000)
		{
			index = 0;
			pages ++;
		}
	}

	RamAreaSelect(0);
}

/*-----------------------------------------------------------------------------------
名称: UBYTE FileSearchMemory(void);
功能: 搜索内存文件数.
-----------------------------------------------------------------------------------*/
UBYTE FileSearchMemory(void)
{
	UBYTE	i = 0;

	for(i=0;i<16;i++)
	{
		if(FileList[i].Name[0]==' ')
			break;
	}

	return(i);
}

/*-----------------------------------------------------------------------------------
名称: UBYTE FileNameCheckMemory(UBYTE *String);
功能: 检测内存文件名称.
-----------------------------------------------------------------------------------*/
UBYTE FileNameCheckMemory(UBYTE *String)
{
	UBYTE	i = 0;
	UBYTE	j = 0;
	UBYTE	k = 0;

	for(i=0;i<16;i++)
	{
		k = 0;
		for(j=0;j<8;j++)
		{
			 if(String[j]==FileList[i].Name[j])
			 	k ++;
		}
		if(k==8)
			return	false;
	}
	return	true;
}

/*-----------------------------------------------------------------------------------
名称: void FileOpenMemory(UBYTE Point);
功能: 打开内存文件.
-----------------------------------------------------------------------------------*/
void FileOpenMemory(UBYTE Point)
{
	UBYTE	 value = 0;
	UBYTE	 pages = 0;
	UHWORD	 lenth = 0;
	UHWORD   index = 0;

	pages = FileList[Point].Address/0x8000;
	index = FileList[Point].Address%0x8000;

	for(lenth=0;lenth<FileList[Point].Lenth;lenth++)
	{
		RamAreaSelect(pages);
		value = XBYTE[index++];

		if(index==0x8000)
		{
			index = 0;
			pages ++;
		}
		RamAreaSelect(0);
		InOutBuf[lenth] = value;
	}
	RamAreaSelect(0);
	FlagRecEnd = false;
}

/*-----------------------------------------------------------------------------------
名称: UBYTE FileInfoUpdate(UBYTE step);
功能: 更新U盘文件信息.
-----------------------------------------------------------------------------------*/
UBYTE FileInfoUpdate(UBYTE step)
{
	ThisFile.OffsetofSector-=step*DeviceInfo.BPB_BytesPerSec;
	ThisFile.SectorofCluster+=step;

	if(ThisFile.SectorofCluster>DeviceInfo.BPB_SecPerClus-1)
	{
		while(ThisFile.SectorofCluster>DeviceInfo.BPB_SecPerClus-1)
		{
			ThisFile.SectorofCluster-=DeviceInfo.BPB_SecPerClus;

			if(ThisFile.pointer<ThisFile.LengthInByte)
		   		ThisFile.ClusterPointer=GetNextClusterNum(ThisFile.ClusterPointer);
		   	else
		 		 ThisFile.ClusterPointer=CreateClusterLink(ThisFile.ClusterPointer);

		 	if(ThisFile.ClusterPointer==0x00)
				return	false;
		}

		ThisFile.SectorPointer=FirstSectorofCluster(ThisFile.ClusterPointer)+ThisFile.SectorofCluster;
	}
	else
		ThisFile.SectorPointer=ThisFile.SectorPointer+step;

	return	true;
}

/*-----------------------------------------------------------------------------------
名称: UBYTE WriteFileEnd(void);
功能: U盘写入完毕.
-----------------------------------------------------------------------------------*/
UBYTE WriteFileEnd(void)
{
	PDIR_STRUC	pDir;

	UHWORD	idata	i,sector;
	UBYTE	idata	j,bStop;
	UWORD	idata	sectorToRead,dirClusterPointer;

	if(DiskFlags.bFatChanged==1)
	{
		if(!RBC_Write(FreeSecNum,1,CurFatSector))
			return 0;

		if(!RBC_Write(FreeSecNum+DeviceInfo.FATSz,1,CurFatSector))
			return 0;

		DiskFlags.bFatChanged=0;
	}

	sector=0;
	dirClusterPointer=ThisDir.StartCluster;

	for(;;)
	{
		if(!SeekSectorToRead(&dirClusterPointer,&sector,&sectorToRead))
			return	false;

		if(!RBC_Read(sectorToRead,1,DBUF))
			return	false;

		for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
		{
			pDir=(PDIR_STRUC)(DBUF+i);

			if(DBUF[i]==0x00)
				return	false;

			j=0;
			while(DBUF[i+j]==ThisFile.FileName[j])
			{
				 j=j+1;

				 if(j>10)
				 	break;
			}

			if(DBUF[i+11]&0x10==0x10)	//not directory?
				continue;

			if(j>10)
			{
			    if(DiskFlags.bIsFat32==0)
			    {
			    	pDir->DIR_FstClusLO=SwapINT16(ThisFile.StartCluster);
			    }
			    else
			    {
			    	DBUF[i+20]=ThisFile.StartCluster>>16;
			    	DBUF[i+21]=ThisFile.StartCluster>>24;
			    	DBUF[i+26]=ThisFile.StartCluster;
			    	DBUF[i+27]=ThisFile.StartCluster>>8;
			    }

			    if(ThisFile.pointer>ThisFile.LengthInByte)
				ThisFile.LengthInByte=ThisFile.pointer;
			    pDir->DIR_FileSize=SwapINT32(ThisFile.LengthInByte);

			    if(!RBC_Write(sectorToRead,1,DBUF))
					return	false;

			    bStop=1;
			    break;
			}
		}
		if(bStop==1)
			break;
	}

	return	true;
}

/*-----------------------------------------------------------------------------------
名称: UBYTE RemoveUsbFile(UBYTE *FileName);
功能: 删除U盘文件.
-----------------------------------------------------------------------------------*/
UBYTE RemoveUsbFile(UBYTE *FileName)
{
	PDIR_STRUC	pDir;

	UHWORD	idata	i,sector;
	UBYTE	idata	j,bStop,bFlag;
	UWORD	idata 	sectorToRead,dirClusterPointer;

	ThisFile.bFileOpen = 0;

	if(!DiskFlags.UDiskOK)
		return	false;

	sector=0;
	dirClusterPointer=ThisDir.StartCluster;

	for(;;)
	{
		if(!SeekSectorToRead(&dirClusterPointer,&sector,&sectorToRead))
			return	false;

		if(!RBC_Read(sectorToRead,1,DBUF))
			return	false;

		for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
		{
			if(DBUF[i]==0x00)
				return	false;

			bFlag=DBUF[i+11]&0x18;
			if(bFlag!=0)
				continue;

			j=0;

			while(DBUF[i+j]==*(FileName+j))
			{
				 j=j+1;

				 if(j>11)
				 	break;
			}

			if(j>11)
			{
			 	DBUF[i]=0xE5;
			 	pDir=(PDIR_STRUC)(DBUF+i);
				ThisFile.StartCluster=MakeWord(DBUF[i+21],DBUF[i+20],DBUF[i+27],DBUF[i+26]);

			 	if(!RBC_Write(sectorToRead,1,DBUF))
					return	false;

				if(!DeleteClusterLink(ThisFile.StartCluster))
					return	false;

			 	bStop=1;
			 	break;
			}
		}

		if(bStop==1)
			break;
	}

	return	true;
}

/*-----------------------------------------------------------------------------------
名称: UBYTE CreateUsbFile(UBYTE *pBuffer);
功能: 创建U盘文件.
-----------------------------------------------------------------------------------*/
UBYTE CreateUsbFile(UBYTE *pBuffer)
{
	PDIR_STRUC	pDir;

	UHWORD	idata	i,j,sector;
	UBYTE	idata	bstop;
	UWORD	idata	sectorToRead,dirClusterPointer;

	if(!DiskFlags.UDiskOK)
		return	false;

	pDir=(PDIR_STRUC)pBuffer;
	pDir->DIR_FstClusHI=0x0000;
	pDir->DIR_FstClusLO=0x0000;
	pDir->DIR_FileSize=0;
	ThisFile.bFileOpen=0;
	bstop=0;
	sector=0;
	dirClusterPointer=ThisDir.StartCluster;

	for(;;)
	{
		if(!SeekSectorToRead(&dirClusterPointer,&sector,&sectorToRead))
			return	false;

		if(!RBC_Read(sectorToRead,1,DBUF))
			return	false;

		for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
		{
			if((DBUF[i]==0x00)||(DBUF[i]==0xE5))
			{
				for(j=0;j<32;j++)
					DBUF[i+j]=*(pBuffer+j);

				if(!RBC_Write(sectorToRead,1,DBUF))
					return	false;

				bstop=1;
				break;
			}
		}

		if(bstop==1)
			break;
	}

	ThisFile.StartCluster=0x00000000;
	ThisFile.LengthInByte=0;
	ThisFile.ClusterPointer=0x00;
	ThisFile.SectorPointer=0x00;
	ThisFile.OffsetofSector=0;
	ThisFile.SectorofCluster=0;
	ThisFile.bFileOpen=1;
	ThisFile.pointer=0;

	for(j=0;j<11;j++)
		ThisFile.FileName[j]=*(pBuffer+j);

	FreeClusterNum=DeviceInfo.FSI_Nxt_Free;
	FreeSecNum=ThisFatSecNum(DeviceInfo.FSI_Nxt_Free);

	if(!RBC_Read(FreeSecNum,1,CurFatSector))
		return	false;

	return	true;
}

/*-----------------------------------------------------------------------------------
名称: UBYTE WriterUsbFile(UHWORD writeLength,UBYTE *pBuffer);

⌨️ 快捷键说明

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