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

📄 filesys20.c

📁 一个线性定地址的文件系统
💻 C
📖 第 1 页 / 共 5 页
字号:
         Type:类型,1:以PLU为索引,2:以记忆代码做索引,
返回  值:HH_OK:成功
功能描述:删除PLU记录
算法描述:
建立时间:2004/11/10
作    者:
当前版本:V1.0
****************************************************************************************
*/
unsigned char HH_DelPLU(unsigned char  *Ptr,unsigned char Type)
{
	unsigned char i,j,k,x;
	unsigned char ErrType;
//	unsigned char HexTempID[2];
	unsigned char tmpIndex[2];
//	unsigned char tmpPLU_EN[PLU_EN_LEN+1];   //PLU列表有效位
	unsigned char tmpPLU_EN2[PLU_EN_LEN+1];
//	unsigned char tmpPLUIndexOv_EN[PLUIndexOv_EN_LEN+1];//索引溢出有效位
	unsigned char tmpPLUIndexOv_EN2[PLUIndexOv_EN_LEN+1];
	unsigned char tmpPLUIndex[sizeof(_PLUIndex)+1];
	unsigned char tmpPLUIndexOv[sizeof(_PLUIndexOv)+1];
	unsigned char tmpPLUIndexOv2[sizeof(_PLUIndexOv)+1];
	unsigned char tmpPLUIndexOv3[sizeof(_PLUIndexOv)+1];
	unsigned char InData[sizeof(_PLU)+1];
	unsigned char OutData[sizeof(_PLU)+1];
//	unsigned int  tmpRecordNo;				
	unsigned int  bakRecordNo; //PLU列表序号
//	unsigned int  tmpIndexOvNo;				 
	unsigned int  bakIndexOvNo;//PLU列表索引溢出序号
	unsigned int  IndexNo;
	unsigned long tmpAddr;
	_PLUIndex     * PLUIndexPtr;
	_PLUIndexOv   * PLUIndexOvPtr;
	_PLUIndexOv   * PLUIndexOv2Ptr;
	_PLUIndexOv   * PLUIndexOv3Ptr;
	_PLU          * InPtr;
//	_PLU          * OutPtr;

	memcpy(InData, Ptr, sizeof(_PLU));
	InPtr = (_PLU *)InData;

	if(Type == PLU_TYPE)//以PLU代码为索引
	{
	    ErrType = CmpPLU(&IndexNo,tmpPLUIndex,tmpPLUIndexOv,InData,OutData);
	    PLUIndexPtr = (_PLUIndex *)tmpPLUIndex;         //PLU索引
	    PLUIndexOvPtr = (_PLUIndexOv *)tmpPLUIndexOv;   //PLU索引溢出
	    
        //读出
	    if (ReadFlash(tmpPLU_EN2, PLU_EN_LEN+1,PLU_EN_ADDR, HH_APP) != HH_OK)return ERR_READ;//读取PLU列表有效位
	    if (XORCheck(tmpPLU_EN2, PLU_EN_LEN) != *(tmpPLU_EN2+PLU_EN_LEN))return ERR_CHECK;//校验和出错

        //读出
	    if (ReadFlash(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN+1,PLUIndexOv_EN_ADDR, HH_APP) != HH_OK)return ERR_READ;//读取索引溢出有效位
	    if (XORCheck(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN) != *(tmpPLUIndexOv_EN2+PLUIndexOv_EN_LEN))return ERR_CHECK;//校验和出错
    	    
//---------删除索引所指记录-----------------	    
	    if(ErrType==PLU_OK_INDEX)
	    {
		   bakRecordNo = PLUIndexPtr->RecordNo;
		   j = bakRecordNo>>3;      //除以8,获得在PLU列表有效位所在字节号,0~254
           k = bakRecordNo&0x07;    //取8的模,获得在该字节的位序,0~7
           x = 0x01;
	       for(i=0; i<k; i++)x<<=1;
	       tmpPLU_EN2[j] = tmpPLU_EN2[j]&(~x);
           //写PLU列表有效位
           *(tmpPLU_EN2+PLU_EN_LEN) = XORCheck(tmpPLU_EN2, PLU_EN_LEN);
	       if(WriteFlash(tmpPLU_EN2, PLU_EN_LEN+1,PLU_EN_ADDR, HH_APP) != HH_OK)return ERR_WRITE;
           //写索引
	       PLUIndexPtr->CtrlByte = PLUIndexPtr->CtrlByte&(~0x80);         //索引有效标志清除
           *(tmpPLUIndex+sizeof(_PLUIndex)) = XORCheck(tmpPLUIndex, sizeof(_PLUIndex));
	       tmpAddr = PLUIndex_ADDR + ((unsigned int)tmpIndex[0]*256+tmpIndex[1])*(sizeof(_PLUIndex)+1);
           if(WriteFlash(tmpPLUIndex, sizeof(_PLUIndex)+1,tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;
           return HH_OK;
	    }
//---------删除第一索引溢出所指记录-----------------	    
	    else if (ErrType==PLU_OK_FST_INDEXOV)
	    {
		   bakRecordNo = PLUIndexPtr->RecordNo;
		   j = bakRecordNo>>3;      //除以8,获得在PLU列表有效位所在字节号,0~254
           k = bakRecordNo&0x07;    //取8的模,获得在该字节的位序,0~7
           x = 0x01;
	       for(i=0; i<k; i++)x<<=1;
	       tmpPLU_EN2[j] = tmpPLU_EN2[j]&(~x);
           //写PLU列表有效位
           *(tmpPLU_EN2+PLU_EN_LEN) = XORCheck(tmpPLU_EN2, PLU_EN_LEN);
	       if(WriteFlash(tmpPLU_EN2, PLU_EN_LEN+1,PLU_EN_ADDR, HH_APP) != HH_OK)return ERR_WRITE;
	       
	       bakIndexOvNo =  PLUIndexPtr->FstOvIndex;
		   j = bakIndexOvNo>>3;      //除以8,获得在PLU列表溢出有效位所在字节号,0~254
           k = bakIndexOvNo&0x07;    //取8的模,获得在该字节的位序,0~7
           x = 0x01;
	       for(i=0; i<k; i++)x<<=1;
	       tmpPLUIndexOv_EN2[j] = tmpPLUIndexOv_EN2[j]& (~x);
	       *(tmpPLUIndexOv_EN2+PLUIndexOv_EN_LEN) = XORCheck(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN);
	       if (WriteFlash(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN+1,PLUIndexOv_EN_ADDR, HH_APP) != HH_OK)return ERR_WRITE;//读取索引溢出有效位            
           //写索引
           if(PLUIndexOvPtr->Next == 0xff)
           {
	          PLUIndexPtr->CtrlByte = PLUIndexPtr->CtrlByte&(~0x40);          //索引溢出有效标志清除
	       }
	       PLUIndexPtr->FstOvIndex = PLUIndexOvPtr->Next;
           *(tmpPLUIndex+sizeof(_PLUIndex)) = XORCheck(tmpPLUIndex, sizeof(_PLUIndex));
	       tmpAddr = PLUIndex_ADDR + ((unsigned int)tmpIndex[0]*256+tmpIndex[1])*(sizeof(_PLUIndex)+1);
           if(WriteFlash(tmpPLUIndex, sizeof(_PLUIndex)+1,tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;
                  
           if(PLUIndexOvPtr->Next != 0xff)
           {
          	  //读取后一个索引溢出
	          tmpAddr = PLUIndexOv_ADDR + (sizeof(_PLUIndexOv)+1) * PLUIndexOvPtr->Next;
	          if (ReadFlash(tmpPLUIndexOv2, sizeof(_PLUIndexOv)+1, tmpAddr, HH_APP) != HH_OK)return ERR_READ;
	          if (XORCheck(tmpPLUIndexOv2, sizeof(_PLUIndexOv)) != *(tmpPLUIndexOv2+sizeof(_PLUIndexOv)))return ERR_CHECK;
	          PLUIndexOv2Ptr = (_PLUIndexOv *)tmpPLUIndexOv2;
	          //修改取后一个索引溢出
	          PLUIndexOv2Ptr->Prior = 0xf0;//在索引本体中
	          *(tmpPLUIndexOv2+sizeof(_PLUIndexOv)) = XORCheck(tmpPLUIndexOv2, sizeof(_PLUIndexOv));
	          if (ReadFlash(tmpPLUIndexOv2, sizeof(_PLUIndexOv)+1, tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;  
	       }
	       return HH_OK; 	       
	    }
//---------删除普通索引溢出所指记录-----------------	    
	    else if (ErrType==PLU_OK_INDEXOV)
	    {
		   bakRecordNo = PLUIndexPtr->RecordNo;
		   j = bakRecordNo>>3;      //除以8,获得在PLU列表有效位所在字节号,0~254
           k = bakRecordNo&0x07;    //取8的模,获得在该字节的位序,0~7
           x = 0x01;
	       for(i=0; i<k; i++)x<<=1;
	       tmpPLU_EN2[j] = tmpPLU_EN2[j]&(~x);
           //写PLU列表有效位
           *(tmpPLU_EN2+PLU_EN_LEN) = XORCheck(tmpPLU_EN2, PLU_EN_LEN);
	       if(WriteFlash(tmpPLU_EN2, PLU_EN_LEN+1,PLU_EN_ADDR, HH_APP) != HH_OK)return ERR_WRITE;

	       bakIndexOvNo =  PLUIndexPtr->FstOvIndex;
		   j = bakIndexOvNo>>3;      //除以8,获得在PLU列表溢出有效位所在字节号,0~254
           k = bakIndexOvNo&0x07;    //取8的模,获得在该字节的位序,0~7
           x = 0x01;
	       for(i=0; i<k; i++)x<<=1;
	       tmpPLUIndexOv_EN2[j] = tmpPLUIndexOv_EN2[j]& (~x);
	       *(tmpPLUIndexOv_EN2+PLUIndexOv_EN_LEN) = XORCheck(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN);
	       if (WriteFlash(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN+1,PLUIndexOv_EN_ADDR, HH_APP) != HH_OK)return ERR_WRITE;//读取索引溢出有效位            
                  
           if(PLUIndexOvPtr->Next != 0xff)
           {
          	  //读取后一个索引溢出
	          tmpAddr = PLUIndexOv_ADDR + (sizeof(_PLUIndexOv)+1) * PLUIndexOvPtr->Next;
	          if (ReadFlash(tmpPLUIndexOv2, sizeof(_PLUIndexOv)+1, tmpAddr, HH_APP) != HH_OK)return ERR_READ;
	          if (XORCheck(tmpPLUIndexOv2, sizeof(_PLUIndexOv)) != *(tmpPLUIndexOv2+sizeof(_PLUIndexOv)))return ERR_CHECK;
	          PLUIndexOv2Ptr = (_PLUIndexOv *)tmpPLUIndexOv2;
	          //修改后一个索引溢出
	          PLUIndexOv2Ptr->Prior = 0xf0;//在索引本体中
	          *(tmpPLUIndexOv2+sizeof(_PLUIndexOv)) = XORCheck(tmpPLUIndexOv2, sizeof(_PLUIndexOv));
	          if (ReadFlash(tmpPLUIndexOv2, sizeof(_PLUIndexOv)+1, tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;  
	       }
           //读取前一个索引溢出
	         tmpAddr = PLUIndexOv_ADDR + (sizeof(_PLUIndexOv)+1) * PLUIndexOvPtr->Prior;
	         if (ReadFlash(tmpPLUIndexOv3, sizeof(_PLUIndexOv)+1, tmpAddr, HH_APP) != HH_OK)return ERR_READ;
	         if (XORCheck(tmpPLUIndexOv3, sizeof(_PLUIndexOv)) != *(tmpPLUIndexOv3+sizeof(_PLUIndexOv)))return ERR_CHECK;
	         PLUIndexOv3Ptr = (_PLUIndexOv *)tmpPLUIndexOv3;
	         //修改前一个索引溢出
	         PLUIndexOv3Ptr->Next = PLUIndexOv2Ptr->Prior;//
	         //tmpAddr = PLUIndexOv_ADDR + (sizeof(_PLUIndexOv)+1) * PLUIndexOvPtr->Prior;
	         *(tmpPLUIndexOv3+sizeof(_PLUIndexOv)) = XORCheck(tmpPLUIndexOv3, sizeof(_PLUIndexOv));
	         if (ReadFlash(tmpPLUIndexOv3, sizeof(_PLUIndexOv)+1, tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;
	         return HH_OK;  	        	       	       	    	
	    }
	    else
	    {
		   return ErrType;
	    }
	 }   
}
/*
****************************************************************************************
函数名称:HH_NewPLU
入口参数:*Ptr: 指向带的索引PLU列表数据缓冲区,读取的数据也放在该缓冲区
         Type:类型,1:以PLU为索引,2:以记忆代码做索引,
返回  值:HH_ERR:是错误记录,HH_OK:不是错误记录
功能描述:新建PLU记录
算法描述:
建立时间:2004/11/10
作    者:
当前版本:V1.0
****************************************************************************************
*/
unsigned char HH_NewPLU(unsigned char  *Ptr,unsigned char Type)
{
	unsigned char i;
	unsigned char ErrType;
//	unsigned char HexTempID[2];
	unsigned char tmpIndex[2];
//	unsigned char tmpPLU_EN[PLU_EN_LEN+1];   //PLU列表有效位
	unsigned char tmpPLU_EN2[PLU_EN_LEN+1];
//	unsigned char tmpPLUIndexOv_EN[PLUIndexOv_EN_LEN+1];//索引溢出有效位
	unsigned char tmpPLUIndexOv_EN2[PLUIndexOv_EN_LEN+1];
	unsigned char tmpPLUIndex[sizeof(_PLUIndex)+1];
	unsigned char tmpPLUIndexOv[sizeof(_PLUIndexOv)+1];
	unsigned char tmpPLUIndexOv2[sizeof(_PLUIndexOv)+1];
	unsigned char InData[sizeof(_PLU)+1];
	unsigned char OutData[sizeof(_PLU)+1];
//	unsigned int  tmpRecordNo;				
	unsigned int  bakRecordNo; //PLU列表序号
//	unsigned int  tmpIndexOvNo;				 
	unsigned int  bakIndexOvNo;//PLU列表索引溢出序号
	unsigned int  IndexNo;
	unsigned long tmpAddr;
	_PLUIndex     * PLUIndexPtr;
	_PLUIndexOv   * PLUIndexOvPtr;
	_PLUIndexOv   * PLUIndexOv2Ptr;
	_PLU          * InPtr;
//	_PLU          * OutPtr;

	memcpy(InData, Ptr, sizeof(_PLU));
	InPtr = (_PLU *)InData;

	if(Type == PLU_TYPE)//以PLU代码为索引
	{
	    ErrType = CmpPLU(&IndexNo,tmpPLUIndex,tmpPLUIndexOv,InData,OutData);

	    if(ErrType == PLU_ERR_EOF)//PLU代码若不同,才可添加
	    {
	       PLUIndexPtr = (_PLUIndex *)tmpPLUIndex;         //PLU索引
	       PLUIndexOvPtr = (_PLUIndexOv *)tmpPLUIndexOv;   //PLU索引溢出

           //计算未存储记录的第一个记录序号
	       if (ReadFlash(tmpPLU_EN2, PLU_EN_LEN+1,PLU_EN_ADDR, HH_APP) != HH_OK)return ERR_READ;//读取PLU列表有效位
	       if (XORCheck(tmpPLU_EN2, PLU_EN_LEN) != *(tmpPLU_EN2+PLU_EN_LEN))return ERR_CHECK;//校验和出错
		   //memcpy(tmpPLU_EN2, tmpPLU_EN, PLU_EN_LEN);
           if(CalcRecordEn(tmpPLU_EN2,PLU_EN_LEN,&bakRecordNo) != HH_OK)return HH_ERR;

           //计算未存储索引溢出的第一个索引溢出序号
	       if (ReadFlash(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN+1,PLUIndexOv_EN_ADDR, HH_APP) != HH_OK)return ERR_READ;//读取索引溢出有效位
	       if (XORCheck(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN) != *(tmpPLUIndexOv_EN2+PLUIndexOv_EN_LEN))return ERR_CHECK;//校验和出错
		   //memcpy(tmpPLUIndexOv_EN2, tmpPLUIndexOv_EN, PLUIndexOv_EN_LEN);
		   if(CalcRecordEn(tmpPLUIndexOv_EN2,PLUIndexOv_EN_LEN,&bakIndexOvNo) != HH_OK)return HH_ERR;
		   
		   //在该记录序号写入PLU记录
		   *(InData+sizeof(_PLU)) = XORCheck(InData, sizeof(_PLU));
		   tmpAddr = PLU_ADDR + bakRecordNo*(sizeof(_PLU)+1);
	       if(WriteFlash(InData, sizeof(_PLU)+1,tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;	       
//---------若索引空,先把索引填满-----------------
		   if(PLUIndexPtr->CtrlByte&0x80 == 0)
		   {    
               //写索引
	           PLUIndexPtr->CtrlByte = PLUIndexPtr->CtrlByte|0x80;               //索引有效标志置位
	           if(PLUIndexPtr->CtrlByte&0x40 == 0)PLUIndexPtr->FstOvIndex = 0xff;//索引溢出为空
	           PLUIndexPtr->RecordNo = bakRecordNo;                              //索引指向的记录号
               *(tmpPLUIndex+sizeof(_PLUIndex)) = XORCheck(tmpPLUIndex, sizeof(_PLUIndex));
	           tmpAddr = PLUIndex_ADDR + ((unsigned int)tmpIndex[0]*256+tmpIndex[1])*(sizeof(_PLUIndex)+1);
               if(WriteFlash(tmpPLUIndex, sizeof(_PLUIndex)+1,tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;
		   }
//---------然后,考虑填充索引溢出为空的-----------------
		   else if(PLUIndexPtr->CtrlByte&0x40 == 0)
		   {
               //写索引
	           PLUIndexPtr->CtrlByte = PLUIndexPtr->CtrlByte|0x40;         //索引溢出有效标志置位
	           PLUIndexPtr->FstOvIndex = bakIndexOvNo;                     //改变索引溢出序号
               *(tmpPLUIndex+sizeof(_PLUIndex)) = XORCheck(tmpPLUIndex, sizeof(_PLUIndex));
	           tmpAddr = PLUIndex_ADDR + ((unsigned int)tmpIndex[0]*256+tmpIndex[1])*(sizeof(_PLUIndex)+1);
               if(WriteFlash(tmpPLUIndex, sizeof(_PLUIndex)+1,tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;
               //写PLU索引溢出
	           tmpAddr = PLUIndexOv_ADDR + (sizeof(_PLUIndexOv)+1) * bakIndexOvNo;
	           PLUIndexOvPtr->Prior = 0xF0;                                        //前一个索引在索引本体中
	           PLUIndexOvPtr->Next = 0xFF;                                         //下一个索引为空
	           PLUIndexOvPtr->RecordNo = bakRecordNo;                              //索引溢出指向的记录号
	           *(tmpPLUIndexOv+sizeof(_PLUIndexOv)) = XORCheck(tmpPLUIndexOv, sizeof(_PLUIndexOv));
	           if (WriteFlash(tmpPLUIndexOv, sizeof(_PLUIndexOv)+1, tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;
               //写PLU列表索引溢出有效位
               *(tmpPLUIndexOv_EN2+PLUIndexOv_EN_LEN) = XORCheck(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN);
	           if(WriteFlash(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN+1,PLUIndexOv_EN_ADDR, HH_APP) != HH_OK)return ERR_WRITE;
		   }
//---------最后,考虑填充索引溢出不为空的-----------------
		   else if(PLUIndexPtr->CtrlByte&0x40 != 0)
		   {
               //读取写PLU索引溢出前最后的PLU索引溢出前一个索引溢出
	           tmpAddr = PLUIndexOv_ADDR + (sizeof(_PLUIndexOv)+1) * PLUIndexOvPtr->Prior;
	           if (ReadFlash(tmpPLUIndexOv2, sizeof(_PLUIndexOv)+1, tmpAddr, HH_APP) != HH_OK)return ERR_READ;
	           if (XORCheck(tmpPLUIndexOv2, sizeof(_PLUIndexOv)) != *(tmpPLUIndexOv2+sizeof(_PLUIndexOv)))return ERR_CHECK;
	           PLUIndexOv2Ptr = (_PLUIndexOv *)tmpPLUIndexOv2;
               //添加一个PLU索引溢出
	           tmpAddr = PLUIndexOv_ADDR + (sizeof(_PLUIndexOv)+1) * bakIndexOvNo;
	           PLUIndexOvPtr->Prior = PLUIndexOv2Ptr->Next;                        //前一个索引
	           PLUIndexOvPtr->Next = 0xFF;                                         //下一个索引为空
	           PLUIndexOvPtr->RecordNo = bakRecordNo;                              //索引溢出指向的记录号
	           *(tmpPLUIndexOv+sizeof(_PLUIndexOv)) = XORCheck(tmpPLUIndexOv, sizeof(_PLUIndexOv));
	           if (WriteFlash(tmpPLUIndexOv, sizeof(_PLUIndexOv)+1, tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;
               //写PLU列表索引溢出有效位
               *(tmpPLUIndexOv_EN2+PLUIndexOv_EN_LEN) = XORCheck(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN);
	           if(WriteFlash(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN+1,PLUIndexOv_EN_ADDR, HH_APP) != HH_OK)return ERR_WRITE;
		   }
           //写PLU列表有效位
           *(tmpPLU_EN2+PLU_EN_LEN) = XORCheck(tmpPLU_EN2, PLU_EN_LEN);
	       if(WriteFlash(tmpPLU_EN2, PLU_EN_LEN+1,PLU_EN_ADDR, HH_APP) != HH_OK)return ERR_WRITE;
	       return HH_OK;		   
	    }
	    else//PLU代码相同或其他出错则返回
	    {
		   return ErrType;
	    }
	}
	else
	{
		return (HH_ERR);
	}
}
/*
****************************************************************************************
函数名称:HH_WritePLU
入口参数:*Ptr: 指向带的索引PLU列表数据缓冲区,读取的数据也放在该缓冲区
         Type:类型,1:以PLU为索引,2:以记忆代码做索引,
返回  值:HH_ERR:是错误记录,HH_OK:不是错误记录
功能描述:写指定索引的记录
算法描述:
建立时间:2004/11/10
作    者:
当前版本:V1.0
****************************************************************************************
*/
unsigned char HH_WritePLU(unsigned char  *Ptr,unsigned char Type)//写PLU记录
{
	unsigned char i,j,k,x;
	unsigned char ErrType;
	unsigned char HexTempID[2];
//	unsigned char tmpIndex[2];
	unsigned char tmpPLU_EN[PLU_EN_LEN+1];   //PLU列表有效位
	unsigned char tmpPLUIndex[sizeof(_PLUIndex)+1];
	unsigned char tmpPLUIndexOv[sizeof(_PLUIndexOv)+1];
	xdata unsigned char InData[sizeof(_PLU)+1];
	xdata unsigned char OutData[sizeof(_PLU)+1];
	unsigned int  tmpRecordNo;				 //PLU列表序号
	unsigned int  IndexNo;
	unsigned long tmpAddr;
	_PLUIndex     * PLUIndexPtr;
	_PLUIndexOv   * PLUIndexOvPtr;
	_PLU          * InPtr;
//	_PLU          * OutPtr;

	memcpy(InData, Ptr, sizeof(_PLU));
	InPtr = (_PLU *)InData;
	if(Type == PLU_TYPE)//以PLU代码为索引
	{
	    ErrType = CmpPLU(&IndexNo,tmpPLUIndex,tmpPLUIndexOv,InData,OutData);
	    if(ErrType==PLU_OK_INDEX)
	    {
		   PLUIndexPtr = (_PLUIndex *)tmpPLUIndex;
		   tmpAddr = PLU_ADDR + PLUIndexPtr->RecordNo*(sizeof(_PLU)+1);
	    }
	    else if ((ErrType==PLU_OK_INDEXOV) || (ErrType==PLU_OK_FST_INDEXOV))
	    {
		   PLUIndexOvPtr = (_PLUIndex *)tmpPLUIndexOv;
		   tmpAddr = PLU_ADDR + PLUIndexOvPtr->RecordNo*(sizeof(_PLU)+1);
	    }
	    else
	    {
		   return ErrType;
	    }
	    *(InData+sizeof(_PLU)) = XORCheck(InData, sizeof(_PLU));
	    if(WriteFlash(InData, sizeof(_PLU)+1,tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;
	    return HH_OK;
	}
	else if(Type == TEMPID_TYPE)//以记忆码为索引
	{
	   HexTempID[0] = InPtr->TempID[0];
	   HexTempID[1] = InPtr->TempID[1];
	   BCDtoHEX(HexT

⌨️ 快捷键说明

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