?? 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 + -