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

📄 filesys20.c

📁 一个线性定地址的文件系统
💻 C
📖 第 1 页 / 共 5 页
字号:
/*
********************************************************************************************************
*
*			  Module Name: File System of Fiscal Cash Register
*						  File Name: FileSys.C
*						Programmer:Luo Liangjian
*						  All Rights Reserved
*
*模块名称:税控收款机文件系统模块
*文件名称:FileSys.C
*功能描述:文件系统是管理嵌入式系统的文件(数据)的一些函数集合,它介于硬件驱动程序和应用程序之间,
*		  屏蔽了硬件的细节,可以让应用程序方便的访问Flash、FRAM存储器等资源。
*		  主要管理二进制文件(数据)的读写,记录文件(数据)的增加,读取和查找等等调用函数。
*程序编写:罗良健
*完成日期:2003/12/24

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

#include"includes.h"

//二进制文件定义

_BinaryFile code BinaryFile[BINARY_FILE_SUM]=
	{
		{FID_FACTORY_INFO,		0,	1,	0x100,	 48},
		{FID_USER_INFO,			0,	1,	0x131,	113},
		{FID_PART_ID_INFO,		0,	1,	0x2C3,	 42},
		{FID_INIT_FLAG,			1,	8,	0x000,	  1},
		{FID_TC_PIN,			1,	8,	0x002,	  8},
		{FID_TC_REG_PIN,		1,	8,	0x00B,	  8},
		{FID_CUR_INVO_STATUS,	1,	8,	0x100,   18},
		{FID_TC_RUN_DATA,		1,	8,	0x113,   12},
		{FID_ZKRATE,		    0,	4,	0x400,   36},
	};


//记录文件定义

_RecordFile code RecordFile[RECORD_FILE_SUM]=
	{
		{FID_TAX_TYPE_INFO,			0,	0,	   6,	 47,	8,	0x200,	0,	0x000,	1,	0x01A3},
		{FID_INVO_ISSUE_TEMP_INFO,	1,	2, 	  10,	 22,	8,	0x209,	0,	0x000,	1,	0x02EE},
		{FID_DAY_DEAL_DATA,			0,	0,	1825,	192,	8,	0x212,	0,	0x000,	1,	0x2000},
		{FID_SINGLE_INVO_SUM_DATA,	0,	1, 	 300,	 37,	8,	0x21B,	8,	0x300,	2,	0x2000},
		{FID_INVO_PRINT_DATA,		0,	1, 18000,	 30,	8,	0x224,	8,	0x322,	2,	0x5000},
		{FID_RUN_LOG_DATA,			0,	1, 	  50,	  8,	8,	0x22D,	0,	0x000,	2,	0xFF000},
		{FID_SELL_INFO,			    0,	0,    22,	 21,	8,	0x236,	0,	0x000,	4,	0x0100},
		{FID_PLU_DATA,			    0,	0,  2296,	 31,	8,	0x23F,	0,	0x000,	4,	0x5000},
		{FID_SALE_LIST_DATA,		0,	1, 23250,	 39,	8,	0x248,	0,	0x000,	4,	0x1A000},
	};

/************************模块内部使用的函数********************************************/

unsigned char Read_Binary(_BinaryFile *bfP,unsigned char *Ptr,unsigned char CheckType);
unsigned char Write_Binary(_BinaryFile *bfP,unsigned char *Ptr,unsigned char CheckType);

unsigned char Read_FileHead(_RecordFile *rfP,unsigned char *tmpHeadData);
unsigned char Write_FileHead(_RecordFile *rfP,unsigned char *tmpHeadData);
unsigned char Oper_FileHead(_RecordFile *rfP,_FileHead *fhP,_ErrRecord *erP,unsigned int Index,unsigned char OperType);

unsigned char Read_Record(_RecordFile *rfP,_FileHead *fhP,unsigned char *Ptr);
unsigned char Write_Record(_RecordFile *rfP,_FileHead *fhP,unsigned char *Ptr);
unsigned char Oper_Record(unsigned char FileID,unsigned int Index,unsigned char *Ptr,unsigned char OperType);

unsigned char Read_ErrRecord(_RecordFile *rfP,unsigned char *tmpErrData);
unsigned char Write_ErrRecord(_RecordFile *rfP,unsigned char *tmpErrData);
unsigned char Oper_ErrRecord(_FileHead *fhP,_ErrRecord *erP);
unsigned char Is_ErrRecordNo(unsigned int RecordNo, _ErrRecord *erP);


unsigned char InsideRead(_BinaryFile *nowFile,unsigned char *Ptr,unsigned char CheckType);//内部使用读程序
unsigned char InsideWrite(_BinaryFile *nowFile,unsigned char *Ptr,unsigned char CheckType);//内部使用写程序


#if ENABLE_PLUFILE==1
unsigned char CmpPLU(unsigned int * IndexNo,unsigned char * tmpPLUIndex,unsigned char * tmpPLUIndexOv,unsigned char * InData,unsigned char * OutData);
unsigned char CalcRecordEn(unsigned char *RecordENPtr,unsigned int RecordEN_Len,unsigned int *RecordNoPtr);
#endif


/*
****************************************************************************************
函数名称:HH_InitBinary
入口参数:FileID:文件的标识符
返回  值:ERR_ID:错误的文件类型,ERR_WRITE:写类型错误;HH_OK:操作成功
功能描述:初始化二进制文件
算法描述:对所有单元清零,并添加正确的校验
建立时间:2003/12/24
作    者:
当前版本:V1.1
-----------------------------------
修改时间:2004/11/26
V1.1版修改说明:
1.FileID的判断和赋值方式由间接改成直接;
2.tmpData的初始化用memset完成;
3.返回方式改为简洁的方法;
(后面V1.1版若未说明的同以上几条)
****************************************************************************************
*/

unsigned char HH_InitBinary(unsigned char FileID)
{
	unsigned char tmpData[MAX_BINARY_LEN+1];
	_BinaryFile *bfP;

	if (FileID > BINARY_FILE_SUM-1)return(ERR_ID);
	bfP = &BinaryFile[FileID];

#if	(DEBUG_FILESYS==1)
	PrintByte(bfP->ID);				//文件标识符
#endif

	memset(tmpData,0x00,MAX_BINARY_LEN+1);//初始化缓冲区赋值为0

	return (Write_Binary(bfP,tmpData,XOR_CHECK));

}

/*
****************************************************************************************
函数名称:HH_CheckBinary
入口参数:FileID:文件标识符
返回  值:ERR_ID:错误的文件类型,ERR_READ:读错误;HH_OK:操作成功
功能描述:检测指定的二进制文件是否有逻辑错误
算法描述:
建立时间:2003/12/24
作    者:
当前版本:V1.1
-----------------------------------
修改时间:2004/11/26
V1.1版修改说明:(同HH_InitBinary)
****************************************************************************************
*/

unsigned char HH_CheckBinary(unsigned char FileID)
{
	unsigned char tmpData[MAX_BINARY_LEN+1];
	_BinaryFile *bfP;

	if (FileID > BINARY_FILE_SUM-1)return(ERR_ID);
	bfP = &BinaryFile[FileID];

	return (Read_Binary(bfP,tmpData,XOR_CHECK));
}

/*
****************************************************************************************
函数名称:HH_ReadBinary
入口参数:FileID:文件标识符,OffSet:与文件首地址的偏移量,
		  *Ptr:读数据存储缓冲区,Len:读数据存储缓冲区字节长度
返回  值:ERR_ID:错误的文件类型,ERR_READ:读错误,ERR_LEN_SUM:长度错误;HH_OK:操作成功
功能描述:读取二进制文件
算法描述:可任意读写二进制文件中的二进制数据
建立时间:2003/12/24
作    者:
当前版本:V1.1
-----------------------------------
修改时间:2004/11/26
V1.1版修改说明:(同HH_InitBinary)
****************************************************************************************
*/

unsigned char HH_ReadBinary(unsigned char FileID,unsigned char OffSet,unsigned char *Ptr,unsigned int Len)
{
	unsigned char ErrType;
	unsigned char tmpData[MAX_BINARY_LEN+1];
	_BinaryFile *bfP;

	if (FileID > BINARY_FILE_SUM-1)return(ERR_ID);
	bfP = &BinaryFile[FileID];

	if (bfP->MaxLen < (OffSet+Len))return(ERR_LEN_SUM);

	ErrType=Read_Binary(bfP,tmpData,XOR_CHECK);
	memcpy(Ptr,tmpData+OffSet,Len);			//将数据拷贝到目标缓冲区

	return (ErrType);

}

/*
****************************************************************************************
函数名称:HH_WriteBinary
入口参数:FileID:文件标识符,OffSet:与文件首地址的偏移量,
		  *Ptr:读数据存储缓冲区,Len:读数据存储缓冲区字节长度
返回  值:ERR_ID:错误的文件类型,ERR_READ:读错误,ERR_WRITE:写错误,
		  ERR_LEN_SUM:长度错误;HH_OK:操作成功
功能描述:写二进制文件
算法描述:可改写二进制文件中的任意位置数据
建立时间:2003/12/24
作    者:
当前版本:V1.1
-----------------------------------
修改时间:2004/11/26
V1.1版修改说明:(同HH_InitBinary)
****************************************************************************************
*/

unsigned char HH_WriteBinary(unsigned char FileID,unsigned char OffSet,unsigned char *Ptr,unsigned int Len)
{

	unsigned char tmpData[MAX_BINARY_LEN+1];
	_BinaryFile *bfP;

	if (FileID > BINARY_FILE_SUM-1)return(ERR_ID);
	bfP = &BinaryFile[FileID];

	if (bfP->MaxLen < (OffSet+Len))return(ERR_LEN_SUM);

	Read_Binary(bfP,tmpData,NO_CHECK);
	memcpy(tmpData+OffSet,Ptr,Len);						//将数据拷贝到目标缓冲区
	return (Write_Binary(bfP,tmpData,XOR_CHECK));
}


/*
****************************************************************************************
函数名称:HH_InitRecord
入口参数:FileID:文件标识符
返回  值:
功能描述:初始化记录文件
算法描述:
建立时间:2003/12/24
作    者:
当前版本:V1.1
-----------------------------------
修改时间:2004/11/26
V1.1版修改说明:(同HH_InitBinary)
****************************************************************************************
*/

unsigned char HH_InitRecord(unsigned char FileID)
{
	unsigned char ErrType;
	unsigned char tmpHeadData[FILE_HEAD_MAX_LEN+1];
	unsigned char tmpErrData[ERR_RECORD_MAX_LEN+1];
	_RecordFile *rfP;

	if (FileID > RECORD_FILE_SUM-1)return(ERR_ID);
	rfP = &RecordFile[FileID];

#if	(DEBUG_FILESYS==1)
	PrintByte(rfP->ID);
	PrintByte(rfP->ErrRecordMemType);
#endif

	memset(tmpHeadData,0x00,FILE_HEAD_MAX_LEN+1);
	ErrType = Write_FileHead(rfP,tmpHeadData);//初始化文件头
	if (ErrType != HH_OK)
	{
		return(ErrType);
	}

	if	(rfP->ErrRecordMemType != 0)
	{
		memset(tmpErrData,0x00,ERR_RECORD_MAX_LEN+1);
		ErrType = Write_ErrRecord(rfP,tmpErrData);//初始化错误记录区
		return(ErrType);
	}
	return(HH_OK);
}

/*
****************************************************************************************
函数名称:HH_CheckRecord
入口参数:FileID:文件标识符
返回  值:
功能描述:检测记录文件是否有逻辑错误
算法描述:只检测文件头
建立时间:2003/12/24
作    者:
当前版本:V1.1
-----------------------------------
修改时间:2004/11/26
V1.1版修改说明:(同HH_InitBinary)
****************************************************************************************
*/

unsigned char HH_CheckRecord(unsigned char FileID)
{
	unsigned char ErrType;
	unsigned char tmpHeadData[FILE_HEAD_MAX_LEN+1];
	unsigned char tmpErrData[ERR_RECORD_MAX_LEN+1];
	_RecordFile *rfP;

	if (FileID > RECORD_FILE_SUM-1)return(ERR_ID);
	rfP = &RecordFile[FileID];

	ErrType = Read_FileHead(rfP,tmpHeadData);
	if (ErrType != HH_OK)
	{
		return(ErrType);
	}
	if (rfP->ErrRecordMemType != 0)
	{
		ErrType=Read_ErrRecord(rfP,tmpErrData);
		return(ErrType);
	}
	return(HH_OK);
}

/*
****************************************************************************************
函数名称:HH_Count
入口参数:FileID:文件标识符
返回  值:
功能描述:获取记录的长度
算法描述:
建立时间:2003/12/24
作    者:
当前版本:V1.1
-----------------------------------
修改时间:2004/11/26
V1.1版修改说明:(同HH_InitBinary)
****************************************************************************************
*/

unsigned int  HH_Count(unsigned char FileID)
{
	unsigned char tmpHeadData[FILE_HEAD_MAX_LEN+1];
	_RecordFile *rfP;
	_FileHead *fhP;

	if (FileID > RECORD_FILE_SUM-1)return(ERR_ID);
	rfP = &RecordFile[FileID];

	Read_FileHead(rfP,tmpHeadData);
	fhP = (_FileHead *)tmpHeadData;
	return(fhP->ValidRecordSum);
}

/*
****************************************************************************************
函数名称:HH_CurNumber
入口参数:FileID:文件标识符
返回  值:
功能描述:获取当前记录序号
算法描述:
建立时间:2004/1/14
作    者:
当前版本:V1.1
-----------------------------------
修改时间:2004/11/26
V1.1版修改说明:(同HH_InitBinary)
****************************************************************************************
*/

unsigned int  HH_CurNumber(unsigned char FileID)
{
	unsigned char tmpHeadData[FILE_HEAD_MAX_LEN+1];
	_RecordFile *rfP;
	_FileHead *fhP;

	if (FileID > RECORD_FILE_SUM-1)return(ERR_ID);
	rfP = &RecordFile[FileID];

	Read_FileHead(rfP,tmpHeadData);
	fhP = (_FileHead *)tmpHeadData;
	return(fhP->CurRecordNo);
}

/*
****************************************************************************************
函数名称:HH_NewRecord

⌨️ 快捷键说明

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