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

📄 declare.c

📁 税控收款机源码:拼音输入法,LCD,VFD驱动,IC卡驱动,税控国标
💻 C
📖 第 1 页 / 共 5 页
字号:
						file_len=gb_temp;//0xef11的文件长度
						result =SelFile_id(USER_CARD,fileID);
						if(result) continue;
						clear_lcd(3,1);
						card_add=0;
						strcpy(buf,"正在续报明细记录...");
						lcd_disp(1,0,buf);
						break;
					}
				}
			}
			else if(result) return result;
			rec_sn+=1;
			if(!change_card_ture)card_add+=len;
		}
	
	addtemp=RECORD_START_ADDR; //明细起始地址
	//result=LookUp_inv_list(start_date,end_date,&addtemp,&record);
	change_card_ture=0; 
	declear_over=0;
	//gb_temp=0;
	//send_char(rec_sn); return ;	  
	while(all_rec) //找出滚动后的明细的条数
	{
		if(!change_card_ture)
		{
			//send_char(rec_sn);
			//while(1)
			{
			result=LookUp_inv_list(start_date,end_date,&addtemp,&record);
			if(result){if(result==OK){declear_over=1;}else break;}//send_str(2,&gb_temp);return 0;
			//return 0;//gb_temp++;
			}
			//if(result!=OK)continue;
		}
		else {change_card_ture=0;}
		len=(RECORD_LENGTH+(uint)(record.item_num)*INVOICE_ITEM_LEN);
		buf[0]=0xaa;
		buf[1]=len/256;
		buf[2]=len%256;
		memcpy(&buf[3],(uchar*)&record,len+1);//组成明细申报的数据包
		len+=4;
		//buf[len]=lrcdata(len,1,buf);
		//len++;
		if(file_len>card_add)
		result =RW_bin(USER_CARD,1,card_add,len,buf);
		else result=FILE_OVER;
		if(declear_over==1){rec_sn++; break;}
		if(result==FILE_OVER)
		{
			//send_str(4,&buf[9]);//
			//send_char(rec_sn);
			//写0XEF10文件
			j=0;
			if(SelFile_id(USER_CARD,0xEF10))return (USR_COMM_FAIL);
			//2005.8.10
	    
			for(i=0;i<255;i++)//多文件处理
			{
				result=ReadRec(USER_CARD,1,i+1,25,buf);
				if((result)&&(i==0)) return(result);
				for(y=0;y<25;y++){if(buf[0]!=buf[y])break;}
				if((buf[8]!=0x20)&&(buf[12]!=0x20)&&(y>10))
				{
					j=i+1;
					break;
				}//{if(j==0)j=i+1;}//找到未用的文件
				//else if(memcmp(buf,g_manufacturer_info.machinery_no,8)==0){j=i+1;break;}//找到本来的文件
			}
			if((i==255)&&(j==0))return (USR_COMM_FAIL);
			i=0;
			memcpy(buf,g_manufacturer_info.machinery_no,8);
			i=8;
			buf[i]=0x20;
			i++;
			memcpy(&buf[i],start_date,3);
			i+=3;
			buf[i]=0x20;
			i++;
			memcpy(&buf[i],end_date,3);
			i+=3;
			memcpy(&buf[i],(uchar*)&all_rec,2);
			i+=2; 
			memcpy(&buf[i],(uchar*)&fileID,2);
			i+=2; 
			memcpy(&buf[i],(uchar*)&star_rec,2);
			//if(star_rec==1)star_rec=rec_sn-2;
			//else 
			star_rec+=rec_sn-2;
			rec_sn=0;
			i+=2; 
			memcpy(&buf[i],(uchar*)&star_rec,2);
			i+=2; 
			buf[i]=lrcdata(i,1,buf);
         
			if(WriteRec(USER_CARD,j,25,buf))return(CPU_OPERATE_FAIL);//更新文件

			result=check_user_card_get_fileid(temp_buf,2);//用下一明细文件
			if((result!=FILE_OVER)&&(result)){return result;}
			if(result!=FILE_OVER)
			{
				//send_str(2,temp_buf);
				fileID=temp_buf[0];
				fileID<<=8;
				fileID|=temp_buf[1];
				result =SelFile_id(USER_CARD,fileID);
				if(result) return(result);
				file_len=gb_temp;//0xef11的文件长度
				card_add=0;
				change_card_ture=1;
			}
			star_rec++;
			if(result==FILE_OVER)//明细文件全部用完要换卡
			{
				//result=FILE_OVER;
				while(1)
				{
					result=Change_cardover(result);
					if(result) return (result);
					result=enter_application_direct(USER_CARD);
					if(result)continue;
					if(SelFile_id(USER_CARD,0xEF02))continue;
					if(RW_bin(USER_CARD, 0, 0, 61, buf))continue;  
					if(
					(buf[0]!=USER_CARD)
					||(memcmp(&buf[2],g_user_info.tax_payer_code,8)!=0)
					||(memcmp(&buf[21],g_user_info.tax_payer_name,40)!=0)
					)continue; //用户卡出错
					change_card_ture=1;
					if(SelFile_id(USER_CARD,0xEF10))continue;
					for(i=0;i<255;i++)//多文件处理
					{
						result=ReadRec(USER_CARD,1,i+1,25,buf);
						if(result) 
						{
							if(i==0)change_card_ture=0;
							break;
						}
						for(y=0;y<25;y++){if(buf[0]!=buf[y])break;}
						if(memcmp(buf,g_manufacturer_info.machinery_no,8)==0)//
						{
							if(                              //刚报过的用户卡
							((buf[16]!=0)||(buf[17]!=0))
							&&(memcmp(&buf[9],start_date,3)==0)
							&&(memcmp(&buf[13],end_date,3)==0)
							)
							{
								result=CARD_ERROR;
								change_card_ture=0;
								break;
							}
						}
						if((buf[8]!=0x20)&&(buf[12]!=0x20)&&(y>10)){break;}//找到了空文件
					}
					if(!change_card_ture)continue;
					result=check_user_card_get_fileid(temp_buf,2);
					if(result)continue;
					fileID=temp_buf[0];
					fileID<<=8;
					fileID|=temp_buf[1];
					file_len=gb_temp;//0xef11的文件长度
					result =SelFile_id(USER_CARD,fileID);
					if(result) continue;
					clear_lcd(3,1);
					card_add=0;
					strcpy(buf,"正在续报明细记录...");
					lcd_disp(1,0,buf);
					break;
         
				}
			}
		}
		else if(result){ return result;}
		rec_sn+=1;
		if(!change_card_ture)card_add+=len;
	}
	//写0XEF10文件
	j=0;
	if(SelFile_id(USER_CARD,0xEF10))return (USR_COMM_FAIL);//写索引文件
	//2005.8.10
	      
	for(i=0;i<255;i++)//记录的个数暂时不定,最长为255条
	{
		result=ReadRec(USER_CARD,1,i+1,25,buf);
		if((result)&&(i==0)) return(result);
		for(y=0;y<25;y++){if(buf[0]!=buf[y])break;}
		if((buf[8]!=0x20)&&(buf[12]!=0x20)&&(y>10))
		{
			j=i+1;
			break;
		}//{if(j==0)j=i+1;}//找到未用的文件
		//else if(memcmp(buf,g_manufacturer_info.machinery_no,8)==0){j=i+1;break;}//找到本来的文件
	}
	if((i==255)&&(j==0))return (USR_COMM_FAIL);
	i=0;
	memcpy(buf,g_manufacturer_info.machinery_no,8);
	i=8;
	buf[i]=0x20;
	i++;
	memcpy(&buf[i],start_date,3);
	i+=3;
	buf[i]=0x20;
	i++;
	memcpy(&buf[i],end_date,3);
	i+=3;
	memcpy(&buf[i],(uchar*)&all_rec,2);
	i+=2; //跳过总记录数
	memcpy(&buf[i],(uchar*)&fileID,2);
	i+=2; 
	memcpy(&buf[i],(uchar*)&star_rec,2);
	if(all_rec==0){star_rec=0;j=1;}
	else star_rec+=rec_sn-2;
	rec_sn=0;
	i+=2; 
	memcpy(&buf[i],(uchar*)&star_rec,2);
	i+=2; 
	buf[i]=lrcdata(i,1,buf);
	//send_char(j);
	result=WriteRec(USER_CARD,j,25,buf);//更新文件
	if(result){ return result;}
	//send_char(result);
	}
	return 0;
}
//================================================================================
//等待换卡
uchar Change_cardover(uchar err)
{
  uchar buf[50];
  uchar result;
    //strcpy(buf,"换卡?");
  catch_error_display(err,0);
  sprintf(buf,"请换卡,再按[确定]"); //
  //sprintf(buf,"卡写满,请换卡再按[确定]"); 
  lcd_disp(1,0,buf);
  result=wait_usal_key(0); 
  clear_lcd(1,1);
  if(result==POWER_OFF) return POWER_OFF;
  else if(result==CANCEL)return CANCEL; 
 return 0;
  
}
//===================================================================================
//获取卡中本机对应的一户多机的文件号且比较PIN码
/*uchar Get_fileId_VerPin(void)
{
  
  uchar result;
  ulong temp_len;
  uchar temp_buf[3];
  uchar buf[5];
   result=check_user_card_get_fileid(temp_buf);//检查用户卡及反回发票使用信息文件标示符 一户多机
		  //send_str(2,temp_buf);//0xef11
  temp_len=temp_buf[0];
  temp_len<<=8;
  temp_len|=temp_buf[1];   //对应本户的文件号
  if(result) return result;
  strcpy(buf,"请输入用户卡的密码:"); //校验用户卡的PIN码
  lcd_disp(1,0,buf);
  memset(buf,0,16);
  result =input_card_pin(16,buf);
  if(!result)
  {
   result = verify_pin(buf[0],&buf[1]);
   if(result!=0) return result;
   
   result =SelFile_id(USER_CARD,temp_len);
   if(result)
			return(result); 
   return 0;
  }
  else return result;
}
*/
//=========================================================
//uchar get_invc_vol_addr(uchar* start_date,uchar* end_date,uint *start_no,uchar *invc_vol_num)
//功能:根据输入时间要求(05:02:26-05:02:28)找出发票卷的起始卷数与符合的卷数
// 输入:*data
//输出:*invc_vol 如00 20 05 代表: 第0x20卷开始 共5卷符合要求 前三个字节代表2,3扇区 后3字节代表1扇区
//mode: 是否已滚动标志 1:滚动 0:非滚动
uchar get_invc_vol_addr(uchar* date,uchar *invc_vol)
{
  
	uchar error;
	uint crc,no;
	uint roll_no,i;
	uchar find_head;//,j;
	//uchar issue_start_date[3],issue_end_date[3];
	uchar vol_num;
	ulong temp_add;
	uint  num;
	ulong temp1;
	// uchar buf[5];
	struct invoice_roll_struct invoice_roll;
 
	struct invoice_roll_addr_struct inv_roll_addr;
	//send_str(6,date); 
	//--------从EEPROM中读单卷发票地址------------//
	read_eeprom(INVOICE_ROLL_ADDR1,(uint)sizeof(inv_roll_addr),
		&inv_roll_addr);
	crc=crcxdata((uint)sizeof(inv_roll_addr)-2,&inv_roll_addr);
	if(crc!=inv_roll_addr.crc)
	{
		if(read_eeprom(INVOICE_ROLL_ADDR2,(uint)sizeof(inv_roll_addr),
		 &inv_roll_addr))
     		return(READ_EEPROM_FAIL);	
		crc=crcxdata((uint)sizeof(inv_roll_addr)-2,&inv_roll_addr);
		if(crc!=inv_roll_addr.crc)
      		return(CRC_ERROR);
	}
	no=0;
	vol_num=0;
	if(inv_roll_addr.invoice_roll_addr==INVOICE_ROLL_START_ADDR)return 0;//FLASH中无已用的发票卷
  
	temp_add=INVOICE_ROLL_START_ADDR-1;
	roll_no=0;
	while(temp_add<inv_roll_addr.invoice_roll_addr){temp_add+=INV_ROLL_STRUCT_LENGTH;roll_no++;}
	//send_str(4,&inv_roll_addr.invoice_roll_addr);
	//send_str(2,&roll_no);
	//send_char(inv_roll_addr.invoice_roll_sector);
	num=0;
	if(INVOICE_ROLL_START_ADDR<inv_roll_addr.invoice_roll_addr)//滚动时的个数
	{
		if(inv_roll_addr.invoice_roll_sector==INVOICE_ROLL_SECTOR[0])
		{
			//2005.9.26
			temp1=(ulong)INVOICE_ROLL_SIZE[0]*1024;
			crc=temp1/INV_ROLL_STRUCT_LENGTH;
			//	send_str(2,(uchar *)&crc);
			//set_value0(&invoice_roll,(uint)sizeof(&invoice_roll));
			//send_str(INV_ROLL_STRUCT_LENGTH,(uchar *)&invoice_roll);
			error = get_inv_roll(crc,&invoice_roll); 
			//send_str(INV_ROLL_STRUCT_LENGTH,(uchar *)&invoice_roll);
			if(error){return error;}
			if(
			(invoice_roll.lrc==lrcdata(INV_ROLL_STRUCT_LENGTH-1,1,(uchar *)&invoice_roll))
			&&(invoice_roll.invoice_start_no!=0)
			&&(invoice_roll.invoice_end_no!=0)
			)
			num=crc; //已滚动
		}
		/*
		else if(inv_roll_addr.invoice_roll_sector==INVOICE_ROLL_SECTOR[1])
		{
			//2005.9.26
			temp1=(ulong)INVOICE_ROLL_SIZE[0]*1024;
			crc=temp1/INV_ROLL_STRUCT_LENGTH;
			//2005.9.26
			temp1=(ulong)INVOICE_ROLL_SIZE[1]*1024;
			crc+=temp1/INV_ROLL_STRUCT_LENGTH;
			set_value0(&invoice_roll,(uint)sizeof(&invoice_roll));
			error = get_inv_roll(crc,&invoice_roll);  
			if(error){return error;}
			if(
			(invoice_roll.lrc==lrcdata(INV_ROLL_STRUCT_LENGTH-1,1,(uchar *)&invoice_roll))
			&&(invoice_roll.invoice_start_no!=0)
			&&(invoice_roll.invoice_end_no!=0)
			)
			num=crc; //已滚动
		}*/
	}
	find_head=0;
	//send_str(2,&num); 
	//send_str(2,&crc); 

	if(num!=0)
	{
		for(i=num;i<MAX_ROLL_NUM;i++)//滚动后的发票卷//最大可保存卷发票卷
		{
	  
			error = get_inv_roll(i,&invoice_roll);
			if(error){return error;}
			//2005.9.12
			if(memcmp(&date[0],&invoice_roll.issue_end_date[1],3)>0)continue;   
			if(
			(memcmp(&invoice_roll.issue_start_date[1],date,3)>=0)&&
			(memcmp(&invoice_roll.issue_end_date[1],&date[0],3)>=0)&&
			(memcmp(&date[3],&invoice_roll.issue_start_date[1],3)>=0)
			)
			//if((memcmp(date,&invoice_roll.issue_start_date[1],3)>=0)&&(memcmp(&invoice_roll.issue_end_date[1],&date[0],3)>=0)
			//&&(memcmp(&date[3],&invoice_roll.issue_start_date[1],3)>=0))
			{
				if(!find_head)
				{
					no=i;
					//no++;
					find_head=1;
				}
				vol_num++;
			}
			else if((memcmp(&invoice_roll.issue_start_date[1],&date[3],3)>0)||(invoice_roll.lrc!=lrcdata(INV_ROLL_STRUCT_LENGTH-1,1,(uchar *)&invoice_roll))) break;   
		}
	}
	invc_vol[0]=no>>8;
	invc_vol[1]=no;
	invc_vol[2]=vol_num;

	find_head=0;
	no=0;
	vol_num=0;
	//send_str(2,&roll_no); 
	for(i=0;i<roll_no;i++)//crc
	{
		//set_value0(&invoice_roll,(uint)sizeof(&invoice_roll));
		error = get_inv_roll(i,&invoice_roll);
		if(error){return error;}
		//send_str(INV_ROLL_STRUCT_LENGTH,(uchar *)&invoice_roll);

⌨️ 快捷键说明

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