📄 program.c
字号:
#include "ecrsys.h"
#include "ftype.h"
#include "sysdata.h"
#include "data.h"
#include "keydef.h"
#include "iccard.h"
#include "mathes.h"
#include <string.h>
#include "disp.h"
#include "lcd2.h"
#include "PC_Comm.h"
#include "lcd_pop.h"
#include "program.h"
#include "stdio.h"
long Last_Prg_Idx; /*上次编程的Idx */
long Last_Prg_Step; /* 上次编程的步骤*/
BOOL last_modi_flag;
/************************************ *****************************/
void progmain(void) /* Program mode main function */
{
byte step_Idx = 0;
byte Update_Menu_flag = 0;
byte rsult = NG;
modi_flag = 0; /* Clear the flag, indicate the attribute did't modified */
Prog_en_dec_input_flag = 0;
if(sysflag->soft_lock_flag) /* Use the soft control lock mode */
{
Comm_SetStatus(STATUS_PROGRAM);
if(Secr_Pass() == NG) /* Must pass the security authentication */
return;
Comm_SetStatus(STATUS_IDLE);
}
Lcd_Init_Sys_ID(SYS_ID_PROG_MAIN);//画初始键盘布局
Pop_Btn_Init();//初始化弹出窗口
while (TRUE)
{
if (!progflag)
Comm_SetStatus(STATUS_IDLE);
else
Comm_SetStatus(STATUS_PROGRAM);
// RightDisp(0L,sysflag->sysdots);
if(GetMainMode() != CurrMode)
return;
progflag = 0;
Last_Prg_Idx = IDX_NULL;
Last_Prg_Step = STEP_NULL;
if(Update_Menu_flag == 0)
{
Lcd_Send_Text_Buff_Str(BUF_ID_TL_TITLE, 1, Str_Lcd_Title_Prog, ALIGN_MID);
Lcd_Disp_Text_Buff(BUF_ID_TL_TITLE);
Lcd_Disp_Str_Btn(BUF_ID_TL_SUB, Str_Prog_Enter);
}
rsult = Get_Prog_Menu(Str_ProgMain_Menu,&step_Idx, PRG_MAIN_MENU_LINE, 1, Update_Menu_flag, 0);
Update_Menu_flag = 1;
if(rsult != OK)
{
step_Idx =0;
continue;
}
if(numcnt)
{
if(lnum == 12345678)
{
isp_chk();
break;
}
if(lnum <401)
{errorType(ERR_DIGIT_ILLEGAL);break;}
step_Idx = lnum-401;
}
switch(step_Idx)
{
case 0: Update_Menu_flag = 0; pDept(0); break;//401 -- Dept Setting
case 1: Update_Menu_flag = 0; PMD_PLU_Menu(); break;//402 -- PLU Setting
case 2: Update_Menu_flag = 0; pClerk(0); break; // 403 -- Clerk Setting
case 3: Update_Menu_flag = 0; Prog_TaxRate(); break; //404 -- Tax Setting
case 4: Update_Menu_flag = 0; pText_Msg(); break; //405 -- Text Message
case 5: Update_Menu_flag = 0; pOptions(); break; //406 -- options
case 6: Update_Menu_flag = 0; pPara_flag(); break; //407 -- more
default:
if(numcnt)
errorType(ERR_DIGIT_ILLEGAL);
step_Idx = 0;
break;
}
}
} /* end progmain */
/*----------------------------------------------------------------------------*
函数功能
操作menu
输入参数
**Str_Menu: 需要显示的菜单
*step: 当前操作的步骤(对应当前需要反显的行数), 返回时, 也更新当前操作的步骤.
Menu_Line: 菜单长度
FirstLine: 起始行数(1~48)
mode: 0-整屏刷新 否则, 不必整行刷新
flag: 0-整行显示 1-分段显示
返回参数:
注意, 如果menu分段显示, 不能直接将参数传递下来, 需要建立一个完整的缓冲区,
再将缓冲区的首地址传送下来.
另外, 如果Menu 如PLU/DEPT需要划分为多页显示, 不能调用此函数.
*----------------------------------------------------------------------------*/
byte Get_Prog_Menu(const char **Str_Menu, byte *step, byte Menu_Line, byte FirstLine, byte mode, byte flag)
{
if(mode == 0)
{
Rst_Lcd_Text(); /* Reset the text */
Insert_Full_Text_List(Str_Menu, Menu_Line, FirstLine);
if(*step < Text_Lcd.EndLine-Text_Lcd.FirstLine)
Text_Lcd.CurrLine = *step +Text_Lcd.FirstLine;
Lcd_Reflush_List(0);
}
else
{
if(*step < Text_Lcd.EndLine-Text_Lcd.FirstLine)
Text_Lcd.CurrLine = *step +Text_Lcd.FirstLine;
if(flag != 0)//-分段显示, 需要根据flag 的值进行分类, 从而正确显示menu
{
memcpy(Text_Lcd.text[Text_Lcd.LastLine], *Str_Menu+(Text_Lcd.LastLine)*(MAX_TEXT+1), MAX_TEXT);
}
Lcd_Reflush_List(1);
}
while(1)
{
if(GetIn() != OK)
continue;
GetMainMode();
if (MainMode != CurrMode)
return NG;
switch(InCmd)
{
case KD_ENTER: /*Enter for accept the input index*/
*step = Text_Lcd.CurrLine-Text_Lcd.FirstLine;
return OK;
case KD_PAGE_DOWN:
case KD_PAGE_UP:
if(Menu_Line < DISP_LCD_TEXT_LINE)//如果当前屏的显示行数不足一屏, 不用此2键
break;
case KD_DOWN:
case KD_UP:
Lcd_Reflush_List(Do_Menu_Roll(InCmd));
break;
case KD_CANCEL:
return NG;
default:
bellcnt = 0x10;
break;
}
}
return NG;
}
/*return 0--reflush all 1--reflush the last line and the current line*/
byte Do_Menu_Roll(word key)
{
byte reflush_flag = 0;
switch(key)
{
case KD_PAGE_UP:
if(Text_Lcd.EndLine <= DISP_LCD_TEXT_LINE)
break;
if(Text_Lcd.CurrLine >= DISP_LCD_TEXT_LINE)
Text_Lcd.CurrLine -= DISP_LCD_TEXT_LINE;
else
Text_Lcd.CurrLine = Text_Lcd.EndLine -1;
break;
case KD_PAGE_DOWN:
if(Text_Lcd.EndLine <= DISP_LCD_TEXT_LINE)
break;
Text_Lcd.CurrLine += DISP_LCD_TEXT_LINE;
if((Text_Lcd.CurrLine >= Text_Lcd.EndLine)&&(Text_Lcd.CurrLine < Text_Lcd.EndLine +DISP_LCD_TEXT_LINE-Text_Lcd.EndLine%DISP_LCD_TEXT_LINE))
Text_Lcd.CurrLine = Text_Lcd.EndLine-1;
break;
case KD_UP:
if(Text_Lcd.CurrLine % DISP_LCD_TEXT_LINE >0)
{
Text_Lcd.CurrLine --;
reflush_flag = 1;
}
else
{
if(Text_Lcd.EndLine <= DISP_LCD_TEXT_LINE)
{
Text_Lcd.CurrLine = Text_Lcd.EndLine -1;
reflush_flag = 1;
}
else
Text_Lcd.CurrLine = (Text_Lcd.CurrLine + Text_Lcd.EndLine -1)%(Text_Lcd.EndLine);
}
break;
case KD_DOWN:
Text_Lcd.CurrLine = (Text_Lcd.CurrLine+1)%(Text_Lcd.EndLine);
if((Text_Lcd.EndLine <= DISP_LCD_TEXT_LINE)||(Text_Lcd.CurrLine%DISP_LCD_TEXT_LINE >0))
reflush_flag = 1;
break;
}
return reflush_flag;
}
/* Check the department refresh or not */
/*----------------------------------------------------------------------------*
* 检查部门刷新切换的条件
* 1> 如果刚才的操作有信息的更新, 需要刷新
* 2> 如果跳转到上一部门或下一部门, 需要刷新
*****
*----------------------------------------------------------------------------*/
BOOL Chk_Dept_Refresh(byte prg_idx)
{
if (Last_Prg_Idx == IDX_NULL) /* The first programming */
return 0xff;//需要全部刷新
if (prg_idx != Last_Prg_Idx) /* 显示了不同的部门 */
return 0xff;//需要全部刷新
return Last_Prg_Step;
}
/* Do the dept roll */
void Do_Dept_Roll(word key, word *idx_step)
{
word max_step;
word step;
max_step = (word)Max_Dept_No*MAX_DEPT_STEP;
step = *idx_step + max_step;
switch(key)
{
case KD_PAGE_UP:
step -= MAX_DEPT_STEP;
break;
case KD_PAGE_DOWN:
step += MAX_DEPT_STEP;
break;
case KD_UP:
step -= 1;
break;
case KD_DOWN:
step += 1;
break;
}
step %= max_step; /* Get the true step */
*idx_step = step;
}
/*-----------------------------------------------------------------
* Dept binary data changed to ASCII data and display on LCD
* Input : char idx --> the index no. of current dept
* and internal step of program.
* 需要显示当前部门的所有参数, 以及当前操作步骤的内容.
* 现在只需要每屏显示一个部门的参数即可
*----------------------------------------------------------------*/
void Dbin2asc(word Idx_Step)
{
byte prg_step; /* The display step */
byte prg_idx; /* The index department number */
byte pflag; /* The temporary data store the department structure's flag */
char lcd_text_buf[MAX_TEXT];
byte len, len1;
byte mode = 0;
byte step = 0;
#ifdef AUTO_PER /* Support the department auto percent function */
if((sysflag->Auto_Per_Use_Flag == 0) && (Idx_Step % MAX_DEPT_STEP == DEPT_PER_STEP))
return; /* When system flag not support the stock, produce a virtual key */
#endif /* End AUTO_PER */
prg_idx = Idx_Step / MAX_DEPT_STEP; /* Get the index no. */
prg_step = Idx_Step % MAX_DEPT_STEP; /* Get the index step */
Clr_Dsp_Data(); /* Clear the previous display */
mode = Chk_Dept_Refresh(prg_idx);
//prepare for Dbin2Asc
if (mode == 0xff ) //如果发现需要刷新, 执行以下刷新的函数.
{
Rst_Lcd_Text();
Insert_Full_Text_List(Str_Dept_Prog_Step, MAX_DEPT_STEP+1, 2);
//Dpet No.
len = strlen(Str_Dept_Prog_Step[step]);
LongtoAsc(Text_Lcd.text[step]+len-3, (prg_idx+1), 3);
}
step++;
Text_Lcd.CurrLine = prg_step+1;
//Description
if((mode == 0xff)||(mode == DEPT_DESC_STEP))
{
memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
memcpy(Text_Lcd.text[step]+LCD_POSI_NOR, dept[prg_idx].desc, MAX_DESC_LEN);
}
step++;
//HDLO
if((mode == 0xff)||(mode == DEPT_HDLO_STEP))
{
memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
HDLO_To_Asc(Text_Lcd.text[step]+LCD_POSI_NOR, dept[prg_idx].Hdlo, sysflag->sysdots);
}
step++;
//price
if((mode == 0xff)||(mode == DEPT_PRICE_STEP))
{
memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
LnumToTextBuff(Text_Lcd.text[step]+LCD_POSI_NOR, dept[prg_idx].price, sysflag->sysdots);
}
step++;
//Tax
if((mode == 0xff)||(mode == DEPT_VTAX_STEP))
{
memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
if(sysflag->Tax_System == TAX_MODE)//TAX
{
VTAX_to_Asc(Text_Lcd.text[step]+LCD_POSI_NOR, (dept[prg_idx].pflag)&0x0f);
}
else if(sysflag->Tax_System == VAT_MODE)//VAT
{
memset(Text_Lcd.text[step], 0x20, MAX_TEXT);
xtr_strcpy(Text_Lcd.text[step]+2, Str_TaxSys_Sel[1]);
VTAX_to_Asc(Text_Lcd.text[step]+LCD_POSI_NOR, (dept[prg_idx].pflag)&0x0f);
}
else//GST-PST
{
}
}
step++;
//group
if((mode == 0xff)||(mode == DEPT_GROUP_STEP))
{
memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
LnumToTextBuff(Text_Lcd.text[step]+LCD_POSI_NOR, dept[prg_idx].group, 0);
}
step++;
// Normal / Negative / Gallonage
if((mode == 0xff)||(mode == DEPT_MODE_STEP))
{
memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
pflag = (dept[prg_idx].pflag2)&0x0f;
memcpy(Text_Lcd.text[step]+LCD_POSI_NOR, Str_Dept_Mode[pflag], strlen(Str_Dept_Mode[pflag]));
}
step++;
//single/ Normal
if((mode == 0xff)||(mode == DEPT_TYPE_STEP))
{
memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
pflag = (dept[prg_idx].pflag>>4);
memcpy(Text_Lcd.text[step]+LCD_POSI_NOR, Str_Dept_Type[pflag], strlen(Str_Dept_Type[pflag]));
}
step++;
//Allow sale or not
if((mode == 0xff)||(mode == DEPT_SALE_STEP))
{
memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
pflag = (dept[prg_idx].sale);
xtr_strcpy(Text_Lcd.text[step]+LCD_POSI_NOR, Str_Dept_Sale[pflag]);
}
step++;
// Age limit
if((mode == 0xff)||(mode == DEPT_AGE_STEP))
{
memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
pflag = (dept[prg_idx].pflag2>>4)&0x0f;
if (pflag == 0)
memcpy(Text_Lcd.text[step]+LCD_POSI_NOR, Str_None, strlen(Str_None));
else
LWordtoAsc(Text_Lcd.text[step]+LCD_POSI_NOR, Age_Limit[pflag-1], 2);
}
step++;
//KP select
if((mode == 0xff)||(mode == DEPT_KP_STEP))
{
memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
xtr_strcpy(Text_Lcd.text[step]+LCD_POSI_NOR, Str_Act_Sel[dept[prg_idx].send_kp_flag]);
}
step++;
#ifdef AUTO_PER
if((mode == 0xff)||(mode == DEPT_PER_STEP))
{
memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
Text_Lcd.text[step][LCD_POSI_NOR] = (dept[prg_idx].per_flag == 0)?('+'):('-');
LnumToTextBuff(Text_Lcd.text[step]+LCD_POSI_NOR+1, dept[prg_idx].per_rate, PER_DOTS);
}
step++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -