📄 prog_tax.c
字号:
char Str1[10][MAX_LCD_TEXT+1];
WORD r1=0,r2=0;
char func_ret=NG;
char result=0;
char idx = 0;
char *ptr;
char i;
char len;
const char *Str2[10] =
{
{"To Program Canadian GST Tax. "},
{"To program Canadian PST1 Tax."},
{"To program Canadian PST2 Tax."},
{"To program Canadian PST3 Tax."},
{"To Select whether the non-taxable limit $ amount is with GST or without GST tax for Canadian tax."},
{"To select whether to active Tax-On-Tax setting for Canadian tax."}
};
Lcd_Send_Text_Buff_Str(BUF_ID_TL_TITLE, 1, Str_ProgTaxRateTaxVatGst[0], ALIGN_MID);
Lcd_Disp_Text_Buff(BUF_ID_TL_TITLE);
while(1)
{
for (i=0;i<6;i++)
{
memset(Str1[i], ' ', MAX_LCD_TEXT); /*Clear the buffer first*/
memcpy(Str1[i],Str_ProgTaxRateTaxVatGst[MAX_TAX_NUM*2+i],MAX_LCD_TEXT);
}
/*在此处来判断方式,是为了在控制锁转动时,快速退出此函数,无需后面的刷新*/
GetMainMode();
if (MainMode != CurrMode)
break;
/*确认是显示GST,还是NON GST*/
if (Tax_Rate.Tax_Lmt_type == TAX_LMT_NO_GST)
ptr = (char*)Str_GstNonGst[0];
else
ptr = (char*)Str_GstNonGst[1];
len = strlen(ptr);
if (len >= MAX_LCD_TEXT)
len = MAX_LCD_TEXT;
memcpy((char*)&Str1[4][MAX_LCD_TEXT-len],ptr,len);
/* 确认是显示TAX ON TAX /NO TAX ON TAX*/
memcpy((char*)Str1[5],Str_Tax_On_Tax[Tax_Rate.Tax_On_Tax],MAX_LCD_TEXT);
r1 = Menu_Select(Str1,Str2,GST_PRG_MENU_LEN1,idx,1,0,&result);
if (r1 == KD_ENTER)
{
if (result>= GST_PRG_MENU_LEN1)
continue; /*选择错误*/
r2 = NG;
if (result < MAX_TAX_NUM) /*GST/PST1--4 preset*/
{
if (TaxRate_GstRateLmt_Set(result))/*Update the Rate and Limitation*/
r2 = OK;
}
else if (result == 4) /*program the TAX Limit*/
{
if (TaxRate_Gst_Lmt_Set()) /*GST system limitation*/
r2 = OK;
}
else if (result == 5) /*Program the TAX ON TAX or not*/
{
if (TaxRate_Gst_TaxOnTax_Set())
r2 = OK;
}
if(r2 == OK) /*用户设定了正确的参数等*/
{
idx = (result + 1 ) % GST_PRG_MENU_LEN1; /*main menu for GST program is 6*/
}
else
{
Bell_Special_Alarm(0); /*输入非法*/
/*Update the idx step with last cursor postion6*/
idx = (result) % GST_PRG_MENU_LEN1;
}
}
else if (r1 == KD_CANCEL)
{
break;
}
}
}
/*******************************************************************************
* 用户选择更新USA/VAT Rate
* 输入: idx -- TAX/VAT index ( ○-- MAX_TAX_NUM -1)
* 功能:
* 根据idx,提示用户输入相关的Rate, 然后根据输入的Rate更新参数
* return : BOOL -- true / false
*******************************************************************************/
BOOL TaxRate_SetUsaVatRateUpdate(char idx)
{
char i;
long rate;
char *ptr;
BOOL r = false;
char str[5][MAX_LCD_TEXT+1];
for (i = 0; i < 4; i ++)
memcpy(str[i],(char*)Str_USAVATRATEPRG_PROMPT[i],MAX_LCD_TEXT);
if (sysflag->Tax_System == USA_TAXTYPE)
ptr = (char*)Str_TaxVat[0]; /*USA dispaly the TAXx string*/
else
ptr = (char*)Str_TaxVat[1]; /*VAT display the VATx string*/
memcpy(str[1],ptr,5);
str[1][4] = idx + '1';
if (Lcd_GetTenKey(str,4, 5, 99999,&rate) == OK)/*4行提示,输入5位数,返回在rate*/
{
Tax_Rate.rate[idx].rate = rate; /*Update the Rate*/
r = true;
}
return(r);
}
/*------------------------------------------------------------------------------
* Program the TAX Rate of USA/VAT system
* For USA tax system, only consider the rate, without the taxable function
* For VAT tax system, the rate only also.
*-----------------------------------------------------------------------------*/
void TaxRate_SetUsaVat(void)
{
BYTE i,r = 0;
BYTE key = 0;
BYTE idx = 0;
BYTE Base = 0;
BYTE loop = true;
BYTE result = 0;
BOOL Flag_Reflush = true;
char Lcd_Text_Buf[7][MAX_LCD_TEXT+1];
const char *Str_Prompt[10] =
{
{" "},
{" "},
{" "},
{" "},
{" "},
{" "},
{" "},
{" "},
{" "},
{" "}
};
/* 显示Title */
// Lcd_Send_Text_Buff_Str(BUF_ID_TL_TITLE, 1, Str_ProgTaxRate[0], ALIGN_MID);
Lcd_Disp_Text_Buff(BUF_ID_TL_TITLE);
while(loop)
{
/*在此处来判断方式,是为了在控制锁转动时,快速退出此函数,无需后面的刷新*/
GetMainMode();
if (MainMode != CurrMode)
{
return;
}
if(sysflag->Tax_System == USA_TAXTYPE) /*USA tax system*/
Base = 0;
else if(sysflag->Tax_System == VAT_TAXTYPE)/*VAT tax system*/
Base = MAX_TAX_NUM;
else /*非法数据*/
return;
/* 先Copy需要显示的菜单内容到缓冲区 -- 纯文本区域*/
for (i=0;i<MAX_TAX_NUM;i++)
{
memcpy(Lcd_Text_Buf[i],(char*)Str_ProgTaxRateTaxVatGst[Base+i],MAX_LCD_TEXT);
}
/*显示税率,如果税率为0,则不显示. 如果不为0,则先擦除前面的SET UP字样,
*然后显示相对应的税率
*/
for (i=0;i<MAX_TAX_NUM;i++)
{
char temp[20];
if (Tax_Rate.rate[i].rate != 0) /*Rate 不为0,则需要显示Rate*/
{ /*Clear the SET UP characters*/
memset((char*)&Lcd_Text_Buf[i][5],' ', MAX_LCD_TEXT-5);
sprintf(temp,"%.5l",Tax_Rate.rate[i].rate); /*Change to ASCII*/
temp[6] = '%';
temp[5] = temp[4];
temp[4] = temp[3];
temp[3] = temp[2];
temp[2] = '.';
memcpy((char*)&Lcd_Text_Buf[i][MAX_LCD_TEXT-7], temp, 7);
}
}
/*每次都需要重新刷新*/
r = Menu_Select(Lcd_Text_Buf,Str_Prompt,MAX_TAX_NUM,idx,1,0,&result);
switch(r)
{
case KD_ENTER:
if (TaxRate_SetUsaVatRateUpdate(result)) /*Ascii input change to Binary*/
{
idx = ( result + 1 ) % MAX_TAX_NUM; /*编程步骤的Index*/
}
else
{
Bell_Special_Alarm(0); /*输入非法*/
idx = result % MAX_TAX_NUM;
}
break;
case KD_CANCEL: /*用户取消输入*/
case CTRL_LOCK_CHG: /*控制锁取消*/
loop = false;
break;
default:
Bell_Special_Alarm(0); /*输入非法*/
break;
}
}
}
/*------------------------------------------------------------------------------
* 显示文本在文本显示区域,
* 此函数主要用在一些提示场合,比如需要在屏幕上显示一串提示符,然后在底部要求用户
* 输入等场合.
* 由于此函数把屏幕内容已经清除,所以在函数返回以后需要再次刷新屏幕方可.
*
* char **str -- 需要显示的字符串指针 -- 二维数组
* char line -- 需要显示的字符串的行数
*
* 此处有一点需要考虑的是: 函数可以考虑更加强大一些,即自动判断行数,通过判断单词
* 结束来决定. (以后再考虑 -- 这样的话,翻译成其它语言的时候,就比较容易一些
*-----------------------------------------------------------------------------*/
void Lcd_DispNormalText(const char str[][MAX_LCD_TEXT+1],char line)
{
char r;
Rst_Lcd_Text(); /*Clear the LCD buffer*/
for (r = 0;r < line; r ++)
{ /*Send to buffer first*/
Lcd_Send_Text_Buff_Str(BUF_ID_LCD_TEXT, 1,str[r],ALIGN_LEFT);
Lcd_Disp_Text_Buff(BUF_ID_LCD_TEXT); /*Send it to LCD display*/
}
}
/*------------------------------------------------------------------------------
* 屏幕上显示一串提示字符,然后接受用户数据的输入
* Input:
* char **Str_Prompt -- 需要提示用户的提示符指针
* char MaxCntr -- 最多允许输入的数字 --不理会小数点的输入
* long MaxNum -- 最大的允许输入的数值
*
* Output:
* long *ret -- 用户输入的数字(小数和整数部分)
* Return:
* OK/NG
*
*-----------------------------------------------------------------------------*/
char Lcd_GetTenKey(const char **Str,char line,char MaxCntr,long MaxNum,long *ret)
{
char rtn = NG; //程序执行结果判断
char loop = true; //循环结束控制判断
char flag;
Lcd_DispNormalText(Str,line); /*display the message*/
while(loop)
{
if (GetIn() == NG)
continue;
GetMainMode();
if(MainMode != CurrMode) /* The control lock is changed */
{
rtn = NG;
loop = false;
break;
}
switch(InCmd)
{
case KD_ENTER: /*确认输入,判断输入是否合法*/
if((numcnt == 0) ||(numcnt > MaxCntr) || (lnum> MaxNum))
{
errorType(ERR_DIGIT_ILLEGAL);
break;
}
*ret = lnum; /*保存需要返回的参数&*/
rtn = OK; /*正常返回*/
loop = false;
break;
case KD_CANCEL:
rtn = NG; /*异常返回 -- 用户放弃输入*/
loop = false;
break;
case KD_CLEAR: /*Clear key, 继续输入*/
break;
default:
break;
}
}
return(rtn);
}
/*Reserved function*/
void Bell_Special_Alarm(char flag)
{
flag = flag+1;
}
/*----------------------------------------------------------------------------*
函数功能
操作menu
输入参数
**Str_Menu: 需要显示的菜单
**Str_Prompt: 需要显示的提示符内容
: 当前操作的步骤(对应当前需要反显的行数), 返回时, 也更新当前操作的步骤.
Menu_Line: 菜单长度
FirstLine: 起始行数(1~48)
mode: 0-整屏刷新 1 -- 单行刷新
输出参数:
*result -- 光标当前反显行的行号(0--Menu_Line -1)
返回参数:
KD_ENTER -- 用户按下ENTER键盘 --- *result中数据有效
KD_CANCEL -- 用户按下CANCEL键盘 --- *result中数据无效
考虑把此函数做的更加完善,上层程序无需判断是否需要全屏或者单行刷新,
在此函数中根据传下来的**Str_Menu 和 Text_Lcd.text内容来确定 .......
*----------------------------------------------------------------------------*/
WORD Menu_Select(const char **Str_Menu, const char *Str_Prompt[],BYTE Menu_Line,
BYTE CurrLine,BYTE FirstLine, BYTE mode, BYTE *result)
{
BOOL loop = true;
WORD r = KD_CANCEL;
if(mode == 0) /*全屏刷新*/
{
Rst_Lcd_Text(); /* Reset the text */
Insert_Full_Text_List(Str_Menu, Menu_Line, FirstLine);
if ((CurrLine < Text_Lcd.EndLine) && (CurrLine >=Text_Lcd.FirstLine))
Text_Lcd.CurrLine = CurrLine + Text_Lcd.FirstLine;
Lcd_Reflush_List(0);
}
else /* 单行刷新*/
{
if(CurrLine < (Text_Lcd.EndLine-Text_Lcd.FirstLine))
Text_Lcd.CurrLine = CurrLine +Text_Lcd.FirstLine;
memcpy(Text_Lcd.text[Text_Lcd.LastLine], *Str_Menu+(Text_Lcd.LastLine)*MAX_TEXT, MAX_TEXT);
Lcd_Reflush_List(1);
}
while(loop)
{
/*暂时只显示两行字符即可, 以后可以考虑滚动显示*/
Lcd_Disp_Str_Btn(BUF_ID_TL_INPUT,Str_Prompt[Text_Lcd.CurrLine]);
if( GetIn()==NG)
continue;
GetMainMode();
if (MainMode != CurrMode) /*Control Lock changed*/
{
r = CTRL_LOCK_CHG;
break;
}
switch(InCmd)
{
case KD_PAGE_DOWN:
case KD_PAGE_UP:
case KD_DOWN:
case KD_UP:
Lcd_Reflush_List(Do_Menu_Roll(InCmd));
break;
case KD_CANCEL:
r = KD_CANCEL; /*函数返回参数*/
loop = false; /*退出While循环*/
break;
case KD_ENTER: /*Enter for accept the input index*/
*result = Text_Lcd.CurrLine-Text_Lcd.FirstLine;
r = KD_ENTER; /*函数返回参数*/
loop = false; /*退出While循环*/
break;
default:
bellcnt = 0x10;
break;
}
}
return(r);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -