📄 setup.c
字号:
/*-------------------------------------------------------------
模块功能:编程功能--各类参数的设置
说明:符合国家标准GB18240.1-2003和GB18240.2-2003的税控机软件
日期:2003年6月12日
---------------------------------------------------------------*/
#include "include.h"
uchar code clear_card_ID[8]={0x52,0x49,0x53,0x45,0x20,0x03,0x11,0x18};
void ( *restart)();
void RestartToBoot(void) //*****进入Boot升级程序
{
//EA=0;
// PSD8xx_reg.PAGE = 0x00;
// restart=0x0000;
// restart();
//while(1);
buzz_off();
EA=0;
restart=0xff80;
restart();
while(1);
}
//从EEPROM中检查是否有空位置来分发票
uchar get_V_invoice(uchar *index_no)
{
uchar i,j;
struct distribute_invoice_struct* distribute_invoice;
uchar buf[5];
j=0;
for (i=0;i<MAX_DISTRIBUTE_NUM;i++)//0-50卷
{ //13901开始
if(read_eeprom(DISTRIBUTE_INVOICE_ADDR+(i+1)*(uint)sizeof(*distribute_invoice)-5,5,buf))
return(READ_EEPROM_FAIL);
//send_str((uint)sizeof(*distribute_invoice),distribute_invoice);
if((!strlen(buf))&&(buf[4]==0)){*index_no++=i;j++;}
if(low_pwr) return(POWER_OFF);
}
*index_no=j;
return(j);//从EEPROM中没有未录入税控卡的暂存发票卷
}
//===================================================================
/*uchar update_record(uchar which_card, uchar short_Fid,uchar rec_sn, uchar len, uchar *data_in)
{
uchar xdata buf[300];
uchar xdata i;
buf[0]=0x60;
buf[1]=len+6;
buf[2]=0;
buf[3]=0x00;
buf[4]=0xDC;
buf[5]=rec_sn;
buf[6]=((short_Fid<<3)&0xF8)^0x04;
buf[7]=len;
//send_char(buf[6]);
memcpy(&buf[8], data_in, len);
if(which_card==0)
i=sam_iso(buf);
else
i=id_iso(buf);
if(i)
switch(which_card)
{
case SAM_CARD:
return(SAM_COMM_FAIL);
case USER_CARD:
return(USR_COMM_FAIL);
case CHK_CARD:
return(CHK_COMM_FAIL);
}
if(((which_card==USER_CARD)||(which_card==CHK_CARD))&&((buf[3]==0x6a)&&(buf[4]==0x83)))
return FILE_OVER;
else if((buf[3]!=0x90)||(buf[4]!=0x00))
{
switch(which_card)
{
case SAM_CARD:
return(SAM_WRITE_FAIL);
case USER_CARD:
return(USR_WRITE_FAIL);
case CHK_CARD:
return(CHK_WRITE_FAIL);
}
}
return 0;
}
//=====================================================================
/*uchar ReadRec1( uchar short_Fid,uchar rec_sn, uchar Lc, uchar *data_in)
{
uchar i;
uchar buf[100];
buf[0]=0x60;
buf[1]=6+Lc;
buf[2]=0;
buf[3]=0x00; // CLA
buf[4]=0xb2; // INS
buf[5]=rec_sn; // P1
buf[6]=((short_Fid<<3)&0xF8)^0x04;
buf[7]=Lc;
for(i=0;i<Lc;i++){buf[8+i]=*data_in++;}
//send_str2(7+Lc,buf);
i=id_iso(buf);
if(i!=0)return (i);
return 0;
}
*/
//=============================================================
uchar get_roll_no(uchar *roll_no)
{
uchar buf[50];
uchar tempbuf[50];
uchar i,j;
uchar result;
strcpy(buf,"请输入原发票的发票卷号:");//输入BCD码
lcd_disp(2,0,buf);
memset(tempbuf,0,50);
result=get_num(tempbuf);
if(result) return result;
memset(&tempbuf[20],0,30);
j=strlen(tempbuf);
if(j%2) //转成BCD码
{
for(i=0;i<j-1;i++)
{
if(i%2)tempbuf[30-j/2+i/2]|=(tempbuf[i+1]&0x0f);
else { tempbuf[30-j/2+i/2]=(tempbuf[i+1]&0x0f);tempbuf[30-j/2+i/2]<<=4;}
}
tempbuf[30-(j+1)/2]|=(tempbuf[0]&0x0f);
}
else
{
for(i=0;i<j;i++)
{
if(i%2)tempbuf[30-j/2+i/2]|=(tempbuf[i]&0x0f);
else { tempbuf[30-j/2+i/2]=(tempbuf[i]&0x0f);tempbuf[30-j/2+i/2]<<=4;}
}
}
memcpy(roll_no,&tempbuf[20],10);
clear_lcd(3,1);
return 0;
}
//=========================================================
uchar update_Clear_card(uchar mach_num)
{
uchar error;
uchar cur_date[8];
uchar buf[32];
buf[0]=mach_num;
read_rtc(&cur_date[1]);
cur_date[0] = 0x20;
memcpy(&buf[1],cur_date,6);
memcpy(&buf[7],&g_manufacturer_info.machinery_no[0],8);
if(SelFile_id(CHK_CARD,0xEF03))
return (CHK_COMM_FAIL);
error=WriteRec(CHK_CARD,mach_num, 15, buf);//update_record(CHK_CARD,3,mach_num, 15, buf); // WriteRec(USER_CARD,mach_num, 15, buf);
if(error)return error;
return 0;
}
//=====================================================================
void StrToHex(uchar len,uchar *buf)
{
uchar tempbuf[10];
uchar i,j;
j=0;
for(i=0;i<(len/2);i++){tempbuf[i]=((buf[j]&0x0f)<<4)|(buf[j+1]&0x0f);j+=2;}
for(i=0;i<(len/2);i++)buf[i]=tempbuf[i];
}
//======================================================================
uchar check_clear_card(uchar setmode,uchar *mach_num)
{
uchar xdata buf[50];
uchar xdata RetVal;
uchar pin_no[9];
uchar limit_num;
uchar error;
uchar i;
clear_lcd(0,4);
strcpy(buf,"正在检测设置卡..."); //校验清机卡的PIN码
lcd_disp(1,0,buf);
error=enter_application_direct(USER_CARD);
if(error) return error;
if(SelFile_id(CHK_CARD,0xEF02))
return (CHK_COMM_FAIL);
if(RW_bin(CHK_CARD, 0, 0, 20, buf))
return (CHK_COMM_FAIL);
if(buf[0]!=0x5a)
return (CARD_ERROR); //非清机卡
limit_num=buf[1]; //限定的次数
if(read_rtc(&pin_no[1])!=0)
{
return(READ_CLOCK_FAIL);//读时钟错误
}
pin_no[0] = 0x20;
if(setmode==0)
{
if((memcmp(pin_no, &buf[10], 4)<0) ||(memcmp(pin_no, &buf[14], 4)>0))//清机卡已过期
{
return(CARD_DATE_INVALID);
}
}
*mach_num=limit_num;
if(SelFile_id(CHK_CARD,0xEF03))
return (CHK_COMM_FAIL);
for(i=0; i<limit_num; i++)//计算清机的次数
{
error = ReadRec(CHK_CARD,1,i+1,15, buf);
if(error)return(error);
//send_str(15,buf);
if(buf[0]==0&&buf[1]==0)
{
*mach_num = i+1;
break;
}
}
if(*mach_num>=limit_num) return (CARD_ERROR);
clear_lcd(0,4);
strcpy(buf,"请输入清机卡的密码:"); //校验清机卡的PIN码
lcd_disp(1,0,buf);
set_value0(pin_no,(uint)sizeof(pin_no));
RetVal =input_card_pin(16,pin_no);
if(!RetVal)
{
RetVal = verify_pin(pin_no[0],&pin_no[1]);
if(RetVal!=0) return RetVal;
}
else return RetVal;
if(SelFile_id(2,0xEF01))
return (CHK_COMM_FAIL);
if(RW_bin(CHK_CARD, 0, 0, 10, buf))
return (CHK_COMM_FAIL);
//send_char(*mach_num);
if(memcmp(clear_card_ID,buf,8)==0)return 0;
else
return (CLEAR_CARD_IDFAIL);
}
/*==================================================================
函数功能:编程功能--各类参数的设置
入口参数:mach_initialed--机器是否已初始化
出口参数:
返回值: ==POWER_OFF,则表示断电,返回
=0,
全局变量:
编制人: 日期:2003-06-18
==================================================================*/
uchar setup(uchar mach_initial)
{
////////////////////////1、变量说明区///////////////////////////////
//======================1.1 菜单级变量==============================//
uchar xdata switch_mode,layer;//方式锁位置,菜单级别
uchar xdata last_line,cur_line;//上一级菜单项所在行,当前菜单项所在行(都从1开始)
uchar xdata menu_num;//某一级中一个子菜单项数
uchar xdata key;//键值
ulong xdata num;
//ulong xdata start_no;
uchar xdata temp_rec_no; //收款员号码
uchar xdata temp_authority; //收款员权限 0:收款员 1:管理员
uchar rtc[7];
uchar xdata index_no; //发票卷的序号
uchar over_mode;//某项菜单选择操作结束方式
#define NO_CHOOSED 0x0 //未选定任何菜单
#define IS_CHOOSED 0x1 //选定某项菜单
#define EXIT_CHOOSE 0xfe //返回上一级菜单
struct distribute_invoice_struct xdata distribute_invoice; //lyj 8.7
uchar xdata menu_L1_ST[]={SET_UP,0};
uchar i,j,k,end_index;
#ifdef allowsetjiqi //允许设置出厂参数
uint crctemp;
uchar xdata menu_L2_ST[]={FISCAL_MNGMNT, TRADE_PARA, GOODS_MNGMNT, COMMUNICATION,SET_MANUFACTURE,0};
#define ITEM_NUM_L2 sizeof(menu_L2_ST)//第2级菜单项数
uchar xdata menu_Lmax_ST[ITEM_NUM_L2-1][13]=
{
//税务管理
{GET_INVOICE_NO, SET_INVOICE_ROLL, UPDATE_CONTROL_MSG,
/*SET_BRANCH_INDEX, SET_PLU_INDEX,*/ PRINT_FISCAL_MSG,
PRINT_INV_ROLL, PRINT_INV_DATA,/*DISP_PRODUCER,*/ 0},
//交易参数
#ifdef NEED_BIT //需要辅币功能
{SET_RECEIVER_PASSWORD, INVOICE_LOCATE, BRANCH_PLU_SWITCH, PDA_SWITCH,
PRINT_ITEM_SELECT,AUTHORITY_SETUP,FIXED_DISCOUNT, FIXED_SERVICE, SET_BIT_RATE, 0},
#else
{SET_RECEIVER_PASSWORD, INVOICE_LOCATE, BRANCH_PLU_SWITCH, PDA_SWITCH,
PRINT_ITEM_SELECT,AUTHORITY_SETUP,FIXED_DISCOUNT, FIXED_SERVICE,PLU_INMODE,SET_BIT_RATE,SET_PRT_MODE,SELE_PRINTER ,0},//SET_TIME_MODE ,
#endif
//商品管理
// {BRANCH_NAME, SET_MAX_PLU, PLU_NAME, PLU_PRICE, /*BAR_CODE,*/
// PLU_BRANCH, SET_STOCKS, 0},
{BRANCH_MANAGEMENT, SET_MAX_PLU, PLU_MANAGEMENT,UPDATA_INFO_PAYER , 0},
//通讯传送
{READ_PLU_HEAD, SEND_PLU_HEAD, READ_PLU_ALL, SEND_PLU_ALL, READ_BRANCH_NAME,SEND_BRANCH_NAME,FLASHCARD_PLU,OTHER_COMM, 0},
//
{SET_JIQIHAO, SET_ZHIDATE,CLEAR_PINCODE, SET_TIME, FORMAT_FILE,UPDATE_PROGRAM,0}
};
#else //不允许设置出厂参数
uchar xdata menu_L2_ST[]=
{FISCAL_MNGMNT, TRADE_PARA, GOODS_MNGMNT, COMMUNICATION,0};
#define ITEM_NUM_L2 sizeof(menu_L2_ST)//第2级菜单项数
uchar xdata menu_Lmax_ST[ITEM_NUM_L2-1][10]=
{
//税务管理
{GET_INVOICE_NO, SET_INVOICE_ROLL, UPDATE_CONTROL_MSG,
/*SET_BRANCH_INDEX, SET_PLU_INDEX,*/ PRINT_FISCAL_MSG,
PRINT_INV_ROLL,
/*DISP_PRODUCER,*/ 0},
//交易参数
#ifdef NEED_BIT //需要辅币功能
{SET_RECEIVER_PASSWORD, INVOICE_LOCATE, BRANCH_PLU_SWITCH, PDA_SWITCH,
PRINT_ITEM_SELECT,AUTHORITY_SETUP,FIXED_DISCOUNT, FIXED_SERVICE, SET_BIT_RATE, 0},
#else
{SET_RECEIVER_PASSWORD, INVOICE_LOCATE, BRANCH_PLU_SWITCH, PDA_SWITCH,
PRINT_ITEM_SELECT,AUTHORITY_SETUP,FIXED_DISCOUNT, FIXED_SERVICE, 0}, //SET_TIME_MODE,
#endif
//商品管理
// {BRANCH_NAME, SET_MAX_PLU, PLU_NAME, PLU_PRICE, /*BAR_CODE,
// PLU_BRANCH, SET_STOCKS, 0},
{BRANCH_MANAGEMENT, SET_MAX_PLU, PLU_MANAGEMENT,UPDATA_INFO_PAYER , 0},
//通讯传送
{READ_PLU_HEAD, SEND_PLU_HEAD, READ_PLU_ALL, SEND_PLU_ALL, READ_BRANCH_NAME,SEND_BRANCH_NAME,FLASHCARD_PLU, 0}
//
};
#endif
//===================1.2 功能级变量==================================//
uchar xdata function_no;//功能号
uchar xdata result;//操作结果
uchar xdata buf[50];//临时缓冲区
uchar tempbuf[51];
uchar no[10];
//uchar i;//临时循环计数变量
//uchar chk_type;//税控管理卡类别
struct invoice_roll_info_struct xdata inv_roll_info;
struct invoice_roll_struct xdata inv_roll;
struct record_struct xdata record;
//struct invoice_roll_addr_struct inv_roll_addr;
//uint temp;
uchar is_first_enter;//是否第一次进入当前功能菜单
//////////////2、代码执行区///////////////////////////////
//============2.1 操作菜单,选择某个设置功能=================//
//------------2.1.1 初始化----------//
switch_mode=SETUP;//编程档
layer=SND_LAYER_MENU;//初始为第二级菜单
cur_line=1;//初始为第一行
last_line=1;
//display_menu_page(switch_mode,layer,menu_L1_ST,cur_line);
menu_num=strlen(menu_L1_ST);
is_first_enter=1;
//result=read_eeprom(RECEIVER_NO,2,buf);//先登录
//if(result) return READ_EEPROM_FAIL;
//i=buf[0];
//if(!i) return POWER_FAIL_1;
//------------2.1.2 等待按键,选择菜单功能----------//
while(1)
{
if(low_pwr) return POWER_OFF;//如果断电了,则exit
openbacklight();
key = get_key();
if(!key) //未按下任何键
{
if(layer==FST_LAYER_MENU) return 0;//此时若在第1级菜单,则返回主程序,可切换方式锁位置
if(!is_first_enter) continue;//等待按键
else is_first_enter=0;
}
//else beep(50);
if(key==PAPER1) //若按下[走纸]键,则走纸1行
{
#ifdef C6_VER
result=fpaper(6);
if(result) return LINE_FEED_FAIL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -