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