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

📄 deal_data.c

📁 税控收款机源码:拼音输入法,LCD,VFD驱动,IC卡驱动,税控国标
💻 C
📖 第 1 页 / 共 5 页
字号:
/*---------------------------------------------------------------
   税控数据(电子票根、日记录、发票卷、申报数据)的存储、查找
   作者:
-------------------------------------------------------------*/
#include  "include.h"

/*---------------------------------------------------------------
功能:检查是否到了锁机日期
返回值:到了开票截止日期、或小于应用启用日期或
大于应用有效日期返回LOCK_DATE,否则返回0,读时钟错误返回READ_CLOCK_FAIL
/*-------------------------------------------------------------*/
uchar is_lock_mac()
{
	uchar xdata tmp[7];

	if (read_rtc(tmp)) 
		return(READ_CLOCK_FAIL);//读时钟错误
	if(memcmp(tmp,&g_user_info.issue_deline_date[1],3)>0 //开票截止日期 //年月日
		||memcmp(tmp,&g_user_info.application_date[1],3)<0 //应用启用日期
		||memcmp(tmp,&g_user_info.application_valid_date[1],3)>0) //应用有效日期
		return(LOCK_DATE);
	else
        {
        if(memcmp(tmp,&g_user_info.issue_deline_date[1],3)==0)lastday_to_trade=1; 
		else lastday_to_trade=0;
		return(0);
        }
    
}

//=============================================================================
/* plu_no从0开始
*/
uchar get_plu(struct plu_struct * plu,uint plu_no)
{
	uchar buf[10];

	if(read_sramb(PLU_START_ADDR+(ulong)plu_no*(uint)sizeof(*plu),
		(uint)sizeof(*plu),plu))
		return(READ_SRAM_FAIL);
	
	if(crcxdata((uint)sizeof(*plu)-2,plu)!=plu->crc)
		return(CRC_ERROR);
	//if(lrcdata((uint)sizeof(*plu)-1,1,plu)!=plu->lrc)
		//return(LRC_ERROR);
	
	if(plu->name[0]==0)//没有初始化
	{
		sprintf(plu->name,"商品%u",plu_no+1);
		plu->branch=plu_no%MAX_BRANCH_NUM+1;
		sprintf(buf,"%06u",plu_no);
		memcpy(plu->bar_code,buf,(uint)sizeof(plu->bar_code));
		plu->price=100;
		if(g_tax_pin_pass)
			plu->tax_item=g_tax_catalog[0].tax_item;
		else
			plu->tax_item=1;

	}
	return(0);
}
//=================================================================================
uchar get_plu_by_barcode(uint * plu_no,uchar * bar_code)
{
	uint i,j,k;
	uchar buf[30];
    struct plu_struct plu;
 
	//二分法查找
  i=0; j=g_max_plu_no-1;//MAX_PLU_NUM;
  while (i<=j)
  {
   openbacklight();
   if(low_pwr)return(POWER_OFF);//等1时表示已关掉了交流电
	
    k=(i+j)/2;
	//send_char(k);
	if(read_sramb(PLU_START_ADDR+(ulong)k*(uint)sizeof(plu),
			(uint)sizeof(plu),&plu))
			return(READ_SRAM_FAIL);//if(read_plu(k,&plu))return(READ_SRAM_FAIL);
	HexToStr(plu.bar_code,buf,(uint)sizeof(plu.bar_code));
	
	if(memcmp(buf,bar_code,(uint)sizeof(plu.bar_code)*2)==0)
    {
      //i=k-1;
	  *plu_no=k+1;
      return(0);
      
    }
    else if (memcmp(buf,bar_code,(uint)sizeof(plu.bar_code)*2)>0)
    	{
		 if(k==0)break;
		 j=k-1; 
		}
    else
	    {
		if(k==g_max_plu_no-1)break;
        i=k+1;
		}
  }

	/*
     
	for(i=0;i<g_max_plu_no;i++)
	{
        
	    openbacklight();
		if(low_pwr)//等1时表示已关掉了交流电
		{
			return(POWER_OFF); 
		}
		if(read_plu(i,&plu))
		//if(read_sramb(PLU_START_ADDR+(ulong)i*(uint)sizeof(plu),
			//(uint)sizeof(plu),&plu))
			return(READ_SRAM_FAIL);
		 
		 if(crcxdata((uint)sizeof(plu)-2,&plu)!=plu.crc)
		   return(CRC_ERROR);
		//if(lrcdata((uint)sizeof(plu)-1,1,&plu)!=plu.lrc)
			//return(LRC_ERROR);
	
	    HexToStr(plu.bar_code,buf,(uint)sizeof(plu.bar_code));
		if(memcmp(buf,bar_code,(uint)sizeof(plu.bar_code)*2)==0)
		{
			*plu_no=i+1;
                        
			return(0);
		}
			
	}
     */         
	return(PLU_NOT_FOUND);
}
//==========================================================================
/*根据部门号获取部门数据*/
uchar get_branch(struct branch_struct * branch,uint branch_no)
{
    
	if(read_eeprom(BRANCH_ADDR+branch_no*(uint)sizeof(*branch),
			(uint)sizeof(*branch),branch))
		return(READ_EEPROM_FAIL);
		
	//校验
	//if(lrcdata((uint)sizeof(*branch)-1,1,branch)!=branch->lrc)
		//return(LRC_ERROR);
	if((branch->name[0]==0)||(lrcdata((uint)sizeof(*branch)-1,1,branch)!=branch->lrc)) //没有初始化
	{
		sprintf(branch->name,"部门%u",branch_no+1);
		if(g_tax_pin_pass)
			branch->tax_item=g_tax_catalog[0].tax_item;
		else
			branch->tax_item=1;
	}
	return(0);
}
//===========================================================
uchar get_tax_item_index(uchar tax_item)
{
	uchar i;
	for(i=0;i<CATALOG_NUM;i++)
	{
		if(g_tax_catalog[i].tax_item==tax_item)
			return(i); //返回对应下标
	}
	return(0);
}
/*---------------------------------------------------------------
  功能:计算笔记录在FLASH中的当前保存地址
 入口参数: RecordAddr上一笔记录的结束地址及所在扇区的笔记录地址结构
           
 出口参数: newRecordAddr:该笔记录的起始地址及所在扇区的笔记录地址结构
 
 返回值:成功返回0,否则返回其它错误
 /*-------------------------------------------------------------*/
uchar calc_record_addr(const struct record_addr_struct RecordAddr,
					   struct record_addr_struct* newRecordAddr,
					   uint record_length)
{
	uchar i,j;
	uint size;
	ulong addr;
    //uchar buf[5];

	i=0;
	size=0;
	if(RecordAddr.record_addr+record_length<RECORD_START_ADDR || RecordAddr.record_sector<RECORD_SECTOR[0] ||
		RecordAddr.record_sector>RECORD_SECTOR[(uint)sizeof(RECORD_SECTOR)-1]||
		RecordAddr.start_sector<RECORD_SECTOR[0] ||
		RecordAddr.start_sector>RECORD_SECTOR[(uint)sizeof(RECORD_SECTOR)-1])
		return(ADDR_FLASH_FAIL);	//地址错

	while(1) //找出新扇区
	{
    
		size+=RECORD_SIZE[i]; //电子票根扇区容量(KB)累计
		addr=(ulong)size*1024+RECORD_START_ADDR-1;
	
		if(addr>=RecordAddr.record_addr+record_length)
      			break;
		i=(i+1)%((uint)sizeof(RECORD_SIZE));//共18个扇区
	
	}

	newRecordAddr->record_sector=RECORD_SECTOR[i];
	if (newRecordAddr->record_sector!=RecordAddr.record_sector) //需要换扇区
	{
	    //HYS620
		if (flash_sector_erase(newRecordAddr->record_sector))
			return(ERASE_FLASH_FAIL);
		//END HYS620
		if(RecordAddr.start_sector>=newRecordAddr->record_sector) 
		{
		 
          /*if(newRecordAddr->record_sector==RECORD_SECTOR[0])//表示需要滚存
           {
            if(read_eeprom(OVER_record__ROLL,2,buf))
					return(READ_EEPROM_FAIL);
            if(buf[0]==0)buf[0]=1;
            else         buf[0]=0;
           if(write_eeprom(OVER_record__ROLL,1,buf))
					return(READ_EEPROM_FAIL);
            }*/
			//擦出该扇区
		//	if (flash_sector_erase(newRecordAddr->record_sector))
      	//		return(ERASE_FLASH_FAIL);
			newRecordAddr->start_sector++;
			if(newRecordAddr->start_sector>RECORD_SECTOR[(uint)sizeof(RECORD_SIZE)-1])
				newRecordAddr->start_sector=RECORD_SECTOR[0];	

		}
		//计算该扇区的开始地址
		size=0;
		for(j=0;j<i;j++)
      		size+=RECORD_SIZE[j];
		newRecordAddr->record_addr=(ulong)size*1024+RECORD_START_ADDR;
	}
	else
		newRecordAddr->record_addr=RecordAddr.record_addr+1;
	if(newRecordAddr->record_addr<RECORD_START_ADDR || newRecordAddr->record_sector<RECORD_SECTOR[0] ||
     newRecordAddr->record_sector>RECORD_SECTOR[(uint)sizeof(RECORD_SECTOR)-1] || 
	 newRecordAddr->start_sector<RECORD_SECTOR[0] ||
     newRecordAddr->start_sector>RECORD_SECTOR[(uint)sizeof(RECORD_SECTOR)-1])
		return(ADDR_FLASH_FAIL);	//地址错
	 newRecordAddr->crc=crcxdata((uint)sizeof(newRecordAddr)-2,newRecordAddr);
	return(0);
}
//=======================================================================================
/*---------------------------------------------------------------
  功能:在明细中找发票记录
 入口参数: invoice_no发票号
            findmode:找的模式 0,不要找是否已退票,1:要判断是否已退票
            //*invoice_roll_code 发票卷的代号
 出口参数: * record:该发票的记录
 
 返回值:成功返回0,否则返回其它错误
 /*-------------------------------------------------------------*/
uchar locate_invoice(ulong invoice_no,struct record_struct * record,uchar findmode)
{
	struct record_addr_struct xdata RecordAddr; 
	struct record_struct xdata mrecord;
	uchar i,j;
	uchar tmp;
	uchar sector; //扇区号
	uchar start; //是否为某扇区的开始地址
	uint  size;
	ulong addr;
	uint crc;
	uchar lrc;

    ulong first_add;
    uchar find;
	uint  recod_long;
   //send_str(4,&invoice_no);
	//从EEPROM中读笔记录地址(最后写的一笔记录的结束地址)
	read_eeprom(RECORD_ADDR1,(uint)sizeof(RecordAddr),&RecordAddr);
	crc=crcxdata((uint)sizeof(RecordAddr)-2,&RecordAddr);
	if(crc!=RecordAddr.crc)
	{
		if(read_eeprom(RECORD_ADDR2,(uint)sizeof(RecordAddr),&RecordAddr))
			return(READ_EEPROM_FAIL);
		
		crc=crcxdata((uint)sizeof(RecordAddr)-2,&RecordAddr);
		if(crc!=RecordAddr.crc)
			return(CRC_ERROR);
	}
   // send_str((uint)sizeof(RecordAddr),&RecordAddr);
	if(RecordAddr.record_addr==RECORD_START_ADDR) //没有写数据
		return(1);
	//从起始扇区顺序读
	size=0;
	sector=RecordAddr.start_sector;
	for(i=RECORD_SECTOR[0],j=0;i<RecordAddr.start_sector;i++,j++)
		size+=RECORD_SIZE[j]; //KBYTE
	addr=(ulong)size*1024+RECORD_START_ADDR; //当前扇区的起始地址
	start=1;
	find=0;
	
	while(addr!=RecordAddr.record_addr) //没到最后写的一笔记录的结束地址
	{
		if(!start)
			addr++; //同扇区的下一张票的起始地址

		//先读出该票的项目数
		if(read_flash(addr,1,&tmp))
			return(READ_FLASH_FAIL);
		
		if(tmp==0xFF)//没有写数据则换扇区
		{
			sector++;
			if(sector>RECORD_SECTOR[(uint)sizeof(RECORD_SIZE)-1])
				sector=RECORD_SECTOR[0];
			//sector扇区的起始地址
			size=0;
			for(i=RECORD_SECTOR[0],j=0;i<sector;i++,j++)
				size+=RECORD_SIZE[j]; //KBYTE
			addr=(ulong)size*1024+RECORD_START_ADDR;
			start=1;
			continue;
		}
		//2005.7.26
		if(read_flash(addr+RECORD_LENGTH-1,1,&tmp))
			return(READ_FLASH_FAIL);
		//读出记录全部信息
		if(read_flash(addr,(uint)(RECORD_LENGTH+INVOICE_ITEM_LEN*tmp+1),&mrecord))
			return(READ_FLASH_FAIL);
		//send_str((uint)(RECORD_LENGTH+INVOICE_ITEM_LEN*tmp+1),&mrecord);
		//if(mrecord.invoice_no==invoice_no)send_str((uint)(RECORD_LENGTH+INVOICE_ITEM_LEN*tmp+1),&mrecord);
		//校验
		lrc=lrcdata(RECORD_LENGTH+INVOICE_ITEM_LEN*mrecord.item_num,
			1,&mrecord);
	    
		if(lrc!=((uchar *)&mrecord)[RECORD_LENGTH+INVOICE_ITEM_LEN*mrecord.item_num])
		{
		    //重读一次
            if(read_flash(addr,(uint)(RECORD_LENGTH+INVOICE_ITEM_LEN*tmp+1),&mrecord))
			   return(READ_FLASH_FAIL);
            lrc=lrcdata(RECORD_LENGTH+INVOICE_ITEM_LEN*mrecord.item_num,1,&mrecord);
			if(lrc!=((uchar *)&mrecord)[RECORD_LENGTH+INVOICE_ITEM_LEN*mrecord.item_num])
			   return(LRC_ERROR);
		}
       
        //send_str(4,&mrecord.invoice_no);
		if(!find)
		{
			if(mrecord.invoice_no==invoice_no) //找到返回
			{
				//send_str((uint)(RECORD_LENGTH+INVOICE_ITEM_LEN*tmp+1),&mrecord);
				if(!findmode)//只找明细不管发票类型
				{
					*record=mrecord;
					//send_str((uint)(RECORD_LENGTH+INVOICE_ITEM_LEN*tmp+1),&mrecord);
					return(0);
				}
				else
				{
					find=1;
					first_add=addr;
					recod_long=(uint)(RECORD_LENGTH+INVOICE_ITEM_LEN*tmp+1);
				}
			}
		}
		else if(findmode)
		{
             if((mrecord.valid_inv_no==invoice_no)&&(mrecord.invoice_type!=NORMAL_INVOICE)) //已退票
             return(2);
		}
		addr+=RECORD_LENGTH+(uint)INVOICE_ITEM_LEN*tmp; //该票的结束地址
		if(addr==RecordAddr.record_addr) //到最后写的一笔记录的结束地址
		{
			//send_str((uint)(RECORD_LENGTH+INVOICE_ITEM_LEN*tmp+1),&mrecord);
		    if(find) //未退过票
			{
			 	//读出记录全部信息
		       if(read_flash(first_add,recod_long,&mrecord))
			     return(READ_FLASH_FAIL);
		         //校验
		        lrc=lrcdata(RECORD_LENGTH+INVOICE_ITEM_LEN*mrecord.item_num,
			                1,&mrecord);
	
		        if(lrc!=((uchar *)&mrecord)[RECORD_LENGTH+INVOICE_ITEM_LEN*mrecord.item_num])
			         return(LRC_ERROR);
			   *record=mrecord;
               return(0);
			}
			else return(1);
			
		}
		size=0;
		for(i=RECORD_SECTOR[0],j=0;i<RECORD_SECTOR[(uchar)sizeof(RECORD_SECTOR)];i++,j++)
			size+=RECORD_SIZE[j]; //KBYTE
		if(addr==(ulong)size*1024+RECORD_START_ADDR) //该票的结束地址到了最后一个扇区的结束地址
		{
			addr=RECORD_START_ADDR;//开始扇区的起始地址
			start=1;
		}
		else
			start=0;

⌨️ 快捷键说明

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