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