📄 filesys20.c
字号:
/*
********************************************************************************************************
*
* 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 + -