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

📄 filesys20.c

📁 一个线性定地址的文件系统
💻 C
📖 第 1 页 / 共 5 页
字号:
	if ((OperType!=READ_CUR) && (OperType!=WRITE_CUR))
	{
		ErrType=Oper_FileHead(rfP, fhP, erP, Index, OperType);//操作文件头
		if (ErrType != HH_OK)
		{
			return(ErrType);
		}
	}

	if(OperType == READ_CUR)
	{
		ErrType=Read_Record(rfP, fhP, Ptr);				//读文件体
		if (ErrType != HH_OK)
		{
			return(ErrType);
		}
	}

	if ((OperType==WRITE_CUR) || (OperType==WRITE_NEXT))
	{
		ErrType=Write_Record(rfP, fhP, Ptr);			//写文件体
		if (ErrType != HH_OK)
		{
			if (rfP->ErrRecordMemType != 0)
			{
				ErrType2=Oper_ErrRecord(fhP, erP);//操作错误记录区
				if (ErrType2 != HH_OK)
				{
					return(ErrType2);
				}
				ErrType2=Write_ErrRecord(rfP,tmpErrData);//写错误记录区
				if (ErrType2 != HH_OK)
				{
					return(ErrType2);
				}
			}
			return(ErrType);
		}
	}

	if (OperType != WRITE_CUR)
	{
		ErrType=Write_FileHead(rfP, tmpHeadData);		//写文件头
		if (ErrType != HH_OK)
		{
			return(ErrType);
		}
	}

	return(HH_OK);
}
/*
****************************************************************************************
函数名称:Read_ErrRecord
入口参数:*rfP:记录文件指针,*tmpErrData:指向错误记录文件数据的指针
返回  值:
功能描述:读取错误记录文件(内部使用)
算法描述:
建立时间:2003/12/24
作    者:
当前版本:V2.0
-----------------------------------
修改时间:2004/11/26
V2.0版修改说明:
增加InsideRead()/InsideWrite()作为中间读写层,使读写结构融合为一种,使程序容易维护,
在InsideWrite()中对写入的结果读出后比较,确保写入数据正确
****************************************************************************************
*/

unsigned char Read_ErrRecord(_RecordFile *rfP,unsigned char *tmpErrData)
{
	unsigned char ErrType;
	_BinaryFile nowFile;

#if	(DEBUG_ERRRCD==1)
	PrintStr("\n Rd_ErrRcd Begin!\n ");
#endif
    nowFile.BakFlag   = 1;
    nowFile.MemType   = rfP->ErrRecordMemType;
    nowFile.FirstAddr = rfP->ErrRecordFirstAddr;
    nowFile.MaxLen    = ERR_RECORD_MAX_LEN;
    	
    ErrType = InsideRead(&nowFile,tmpErrData,XOR_CHECK);
#if	(DEBUG_ERRRCD==1)
	PrintStr("\n Rd_ErrRcd End!\n ");
#endif
    return (ErrType);
}

/*
****************************************************************************************
函数名称:Write_ErrRecord
入口参数:*rfP:记录文件指针,*tmpErrData:指向错误记录文件数据的指针
返回  值:
功能描述:写入错误记录文件(内部使用)
算法描述:
建立时间:2003/12/24
作    者:
当前版本:V2.0
-----------------------------------
修改时间:2004/11/26
V2.0版修改说明:
增加InsideRead()/InsideWrite()作为中间读写层,使读写结构融合为一种,使程序容易维护,
在InsideWrite()中对写入的结果读出后比较,确保写入数据正确
****************************************************************************************
*/

unsigned char Write_ErrRecord(_RecordFile *rfP,unsigned char *tmpErrData)
{
	unsigned char ErrType;
	_BinaryFile nowFile;

#if	(DEBUG_ERRRCD==1)
	PrintStr("\n Wr_ErrRcd Begin!\n ");
#endif
    nowFile.BakFlag   = 1;
    nowFile.MemType   = rfP->ErrRecordMemType;
    nowFile.FirstAddr = rfP->ErrRecordFirstAddr;
    nowFile.MaxLen    = ERR_RECORD_MAX_LEN;
    	
    ErrType = InsideWrite(&nowFile,tmpErrData,XOR_CHECK);
#if	(DEBUG_ERRRCD==1)
	PrintStr("\n Wr_ErrRcd End!\n ");
#endif
    return (ErrType);
}

/*
****************************************************************************************
函数名称:Oper_ErrRecord
入口参数:*fhP:文件头指针,*erP:错误记录文件指针
返回  值:
功能描述:操作错误记录文件(内部使用)
算法描述:
建立时间:2003/12/24
作    者:
当前版本:V1.0
****************************************************************************************
*/

unsigned char Oper_ErrRecord(_FileHead *fhP,_ErrRecord *erP)
{

	unsigned char i;
	unsigned char InsertNo;

#if	(DEBUG_ERRRCD==1)
	PrintStr("\n Oper_ErrRecord Begin!\n ");
#endif
	if (erP->Sum == 16)
	{
		return(ERR_ERR_RCD_OVER);
	}
	else if (erP->Sum == 0)
	{
		erP->Sum = 1;
		erP->SectionNo[0] = fhP->CurRecordNo;
	}
	else
	{
		if(fhP->CurRecordNo < erP->SectionNo[0])
		{
			InsertNo=0;
		}
		else
		{
			for (i=0; i<erP->Sum; i++)//寻找插入点的序号
			{
				if(fhP->CurRecordNo > erP->SectionNo[i])
				{
					InsertNo=i+1;
					break;
				}
			}
		}
		for (i=InsertNo; i<erP->Sum; i++)//将插入点及其以后存储单元向后移动一个位置
		{
			erP->SectionNo[i+1]=erP->SectionNo[i];
		}
		erP->SectionNo[InsertNo]=fhP->CurRecordNo;//插入该错误记录区序号
	}
#if	(DEBUG_ERRRCD==1)
	PrintStr("\n Oper_ErrRecord End!\n ");
#endif

	return(HH_OK);
}

/*
****************************************************************************************
函数名称:Is_ErrRecordNo
入口参数:RecordNo:当前记录序号,*erP:错误记录指针
返回  值:HH_ERR:是错误记录,HH_OK:不是错误记录
功能描述:指定序号记录是否是错误记录
算法描述:
建立时间:2003/12/24
作    者:
当前版本:V1.0
****************************************************************************************
*/

unsigned char Is_ErrRecordNo(unsigned int RecordNo, _ErrRecord *erP)
{

	unsigned char i;

	for (i=0; i<erP->Sum; i++)
	{
		if (RecordNo == erP->SectionNo[i])
		{
			return(HH_ERR);
		}
	}

	return(HH_OK);
}


/*
****************************************************************************************
函数名称:InsideRead
入口参数:*nowFile:当前文件指针,*Ptr:数据指针,CheckType:较验类型
返回  值:HH_ERR:是错误记录,HH_OK:不是错误记录
功能描述:内部读函数
算法描述:
建立时间:2004/11/29
作    者:
当前版本:V1.0
****************************************************************************************
*/
unsigned char InsideRead(_BinaryFile *nowFile,unsigned char *Ptr,unsigned char CheckType)
{
	unsigned char ErrType;
 
	//原文件读
	if (nowFile->MemType == HH_FRAM)
	{
		ErrType = ReadFRAM(Ptr,nowFile->MaxLen+1,nowFile->FirstAddr);
	}
	else //if ((bfP->MemType==HH_TAX) || (bfP->MemType==HH_INVO)|| (bfP->MemType==HH_APP))
	{
		ErrType = ReadFlash(Ptr,nowFile->MaxLen+1,nowFile->FirstAddr,nowFile->MemType);
	}

	if ((ErrType==HH_OK) && (CheckType==XOR_CHECK))
	{
		if (XORCheck(Ptr,nowFile->MaxLen) != *(Ptr+nowFile->MaxLen))
		{
			ErrType = ERR_CHECK;
		}
	}
	//源文件读写失败尝试备份读取
	if (ErrType != HH_OK)			
	{
		if (nowFile->BakFlag == 1)//有备份,读备份数据
		{
			if (nowFile->MemType == HH_FRAM)
			{
				ErrType = ReadFRAM(Ptr,nowFile->MaxLen+1,nowFile->FirstAddr+FRAM_BAK_ADDR_OFFSET);
			}
			else //if ((bfP->MemType==HH_TAX) || (bfP->MemType==HH_INVO)|| (bfP->MemType==HH_APP))
			{
			    ErrType = ReadFlash(Ptr, nowFile->MaxLen+1,nowFile->FirstAddr+FLASH_BAK_ADDR_OFFSET, nowFile->MemType);			
			}
			if ((ErrType==HH_OK) && (CheckType==XOR_CHECK))			
			{
				if (XORCheck(Ptr,nowFile->MaxLen) != *(Ptr+nowFile->MaxLen))
				{
					return(ERR_CHECK);
				}
			}
		}
		else		//无备份
		{
			return(ERR_READ);
		}
	}
	return(ErrType);	
}
/*
****************************************************************************************
函数名称:InsideWrite
入口参数:*nowFile:当前文件指针,*Ptr:数据指针,CheckType:较验类型
返回  值:HH_ERR:是错误记录,HH_OK:不是错误记录
功能描述:内部写函数
算法描述:
建立时间:2004/11/29
作    者:
当前版本:V1.0
****************************************************************************************
*/
unsigned char InsideWrite(_BinaryFile *nowFile,unsigned char *Ptr,unsigned char CheckType)
{
	unsigned char ErrType1;
	unsigned char ErrType2;
	unsigned char ReadData[MAX_RECORD_LEN+1];

    if(CheckType == XOR_CHECK)
    {	
       *(Ptr+nowFile->MaxLen) = XORCheck(Ptr, nowFile->MaxLen);//做异或校验
    }
	//原文件写
	if (nowFile->MemType == HH_FRAM)
	{
		ErrType1 = WriteFRAM(Ptr,nowFile->MaxLen+1,nowFile->FirstAddr);
	}
	else //if ((bfP->MemType==HH_TAX) || (bfP->MemType==HH_INVO)|| (bfP->MemType==HH_APP))
	{
		ErrType1 = WriteFlash(Ptr,nowFile->MaxLen+1,nowFile->FirstAddr,nowFile->MemType);
	}
	//备份写
	if (nowFile->BakFlag == 1)//有备份,读备份数据
	{
		if (nowFile->MemType == HH_FRAM)
		{
			ErrType2 = WriteFRAM(Ptr,nowFile->MaxLen+1,nowFile->FirstAddr+FRAM_BAK_ADDR_OFFSET);
		}
		else //if ((bfP->MemType==HH_TAX) || (bfP->MemType==HH_INVO)|| (bfP->MemType==HH_APP))
		{
			ErrType2 = WriteFlash(Ptr, nowFile->MaxLen+1,nowFile->FirstAddr+FLASH_BAK_ADDR_OFFSET, nowFile->MemType);			
		}
	}
    if ((ErrType1 != HH_OK) && (ErrType2 != HH_OK))return(ERR_WRITE);	
	if(InsideRead(nowFile,ReadData,CheckType) == HH_OK)
	{
		if(memcmp(ReadData,Ptr,nowFile->MaxLen) == 0)return(HH_OK);
	}
	return (ERR_WRITE);
}



#if ENABLE_PLUFILE==1
/*
****************************************************************************************
函数名称:HH_InitPLU
入口参数:无
返回  值:HH_OK:成功
功能描述:PLU未用之前的初始化
算法描述:
建立时间:2004/11/10
作    者:
当前版本:V1.0
****************************************************************************************
*/
unsigned char HH_InitPLU(void)
{
	unsigned char i;
	unsigned char tmpData[4096];

	memset(tmpData,0,4096);
	//依次对PLU列表有效标志位,PLU列表索引溢出有效标志位,PLU列表索引,PLU列表索引溢出置0初始化
	if(WriteFlash(tmpData, PLU_EN_LEN+1,PLU_EN_ADDR, HH_APP) != HH_OK)return ERR_WRITE;
	if(WriteFlash(tmpData,PLUIndexOv_EN_LEN+1,PLUIndexOv_EN_ADDR, HH_APP) != HH_OK)return ERR_WRITE;
	for(i=0; i<5; i++)
	{
		if(WriteFlash(tmpData, 4096,PLUIndex_ADDR+4096*(unsigned int)i, HH_APP) != HH_OK)return ERR_WRITE;
	}
	if(WriteFlash(tmpData, 600,PLUIndexOv_ADDR, HH_APP) != HH_OK)return ERR_WRITE;//600=(sizeof(_PLUIndexOv)+1)*PLUIndexOv_SUM
	return HH_OK;
}
/*
****************************************************************************************
函数名称:HH_DelPLU
入口参数:*Ptr: 指向带的索引PLU列表数据缓冲区,读取的数据也放在该缓冲区

⌨️ 快捷键说明

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