📄 prog_cm.c
字号:
else
CM_Idx = 0;
Refresh_mode = 0;
}
break;
case KD_UP:
if(Curr_Line > 0)//页内变化
{
Lcd_Text_Line_Disp(Curr_Line--, FALSE);
Lcd_Text_Line_Disp(Curr_Line, TRUE);
Refresh_mode = 0xff;
}
else //跨页更新,类同KD_PAGE_UP
{
CM_Idx = CM_Curr_Disp[0]-1;
Refresh_mode = 1;
}
break;
case KD_ENTER:
{/*使用按键选择方式选择编辑方式*/
const char *tmp_str[3];
Lcd_Disp_Str_Btn(BUF_ID_TL_SUB, Str_Modify_Step[3]);
tmp_str[0] = Str_CM_Prog_Sel[0];
tmp_str[1] = Str_CM_Prog_Sel[1];
tmp_str[2] = Str_CM_Prog_Sel[2];
if(Get_Btn_Choice_Input(tmp_str, 0x22,3) != OK)//先弹出操作提示按键
break;
}
//选择好操作后,进入对应操作体系
CM_Idx = CM_Curr_Disp[Curr_Line] - 1;
if(lnum < 2)
{
if(lnum == 1)
{//查找最近的一个未使用的C.M., 如果向后查找没有找到,就从头开始查找
byte tmp_CM_Idx = CM_Idx;
while((tmp_CM_Idx < MAX_KP_SFX_NUM)&&(KP_Sfx_Desc[tmp_CM_Idx][0] != '\0'))
tmp_CM_Idx ++;
if(tmp_CM_Idx >= MAX_KP_SFX_NUM)
{
tmp_CM_Idx = 0;
while((tmp_CM_Idx < CM_Idx)&&(KP_Sfx_Desc[tmp_CM_Idx][0] != '\0'))
tmp_CM_Idx ++;
if(tmp_CM_Idx >= CM_Idx)//说明没有剩余空间存放新的C.M.
{errorType(ERR_CM_FULL);break; }
}
CM_Idx = tmp_CM_Idx; /*找到对应的空位*/
}
//编辑cooking Msg
Lcd_Disp_Str_Btn(BUF_ID_TL_SUB, Str_Cooking_message_desc);
Lcd_Disp_Str_Btn(BUF_ID_TL_INPUT, Str_Modify_Step[1]);
if(Get_Desc(KP_Sfx_Desc[CM_Idx],MAX_PRN_LEN,NO) != OK)
break;
//注意要对编辑的Cooking Msg 添加结束符。
KP_Sfx_Desc[CM_Idx][Get_Desc_Len(KP_Sfx_Desc[CM_Idx], MAX_PRN_LEN)] = '\0';
}
else//delete
{
byte ret = NG;
if(Get_Sure_Done(&ret)!= OK)//确定操作后,删除指定的Cooking Msg
break;
if(ret == KD_NO)
break;
memset(KP_Sfx_Desc[CM_Idx], 0, MAX_PRN_LEN+1);
CM_Prog_Dept_Ex(CM_Idx); // 当删除了此Cooking Message后, 对部门中指向此Cooking Message指针也进行修改.
}
Refresh_mode = lnum + 2;//设置更新方式
break;
case KD_CANCEL:
return;
}
}
}
/*-----------------------------------------------------------------------------
* Display the full Cooking Message lists
*-----------------------------------------------------------------------------
*/
void Disp_Full_CM_List_Ex(void)
{
WORD i,j;
Rst_Lcd_Text(); /* Reset the text*/
for (i = 0,j=0; i < DISP_LCD_TEXT_LINE*3; i++) // Display 8CMs information
{
memset(Text_Lcd.text[i], 0x20, MAX_TEXT);
if (KP_Sfx_Desc[i][0] != 0)
{
xtr_strcpy(Text_Lcd.text[i], KP_Sfx_Desc[i]);
j ++;
}
}
Text_Lcd.FirstLine = 0;
Text_Lcd.EndLine = j;
Text_Lcd.StartLine = 0;
Text_Lcd.CurrLine = Text_Lcd.FirstLine;
Lcd_Reflush_List(0);
}
/*-----------------------------------------------------------------------------
*显示某个部门所连接的所有C.M.信息,
*先把所有的C.M.信息都送到文本显示缓冲区Text_Lcd.text中,然后再刷新显示器.
*由于有可能一屏不能全部显示,所以此处需要留意换屏的问题
*---------------------------------------------------------------------------*/
void Dept_Disp_Cm(WORD Dept_Idx)
{
byte i;
byte idx;
byte len;
Rst_Lcd_Text();
for (i = 0; i < dept[Dept_Idx].cm_cnt; i++)
{
memset(Text_Lcd.text[i], 0x20, MAX_TEXT);
idx = dept[Dept_Idx].CkMsg[i];
#if 0
if (idx == 0) /*没有数据需要显示了*/
break;
#endif
if(idx > MAX_KP_SFX_NUM) /*数据非法-强制设定为第一条*/
{
dept[Dept_Idx].CkMsg[i] = 1;
idx = 1;
}
xtr_strcpy(Text_Lcd.text[i], KP_Sfx_Desc[idx-1]);/*送到显示缓冲区*/
}
Text_Lcd.FirstLine = 0;
Text_Lcd.EndLine = i;
Text_Lcd.StartLine = 0;
Text_Lcd.CurrLine = Text_Lcd.FirstLine;
for (; i < DISP_LCD_TEXT_LINE; i++) // 临时的一个修补
{
memset(Text_Lcd.text[i], 0x20, MAX_TEXT);
}
Lcd_Reflush_List(0); /*刷新并送到显示器上 -- 整屏刷新(文本区域)*/
}
/*-----------------------------------------------------------------------------
*需要显示所有的部门按钮和最下面的命令按钮供用户选择,此处需要设定按钮的值 -
*设定为KD_DP_1 ----KD_DP-60
*同时也预设好最下面的命令按钮的按钮值和按钮大小
*
* Note: 此处不显示,仅仅是设定按钮的属性(按键键码和大小)
* 10/14/2006 11:51PM
*----------------------------------------------------------------------------*/
void Get_Dpet_key_Map(void)
{
byte i;
word key;
for(i = 0; i < MAX_LAYOUT_KEY-LINE_KEY_NUM; i++) /*最下面会显示一排命令按钮*/
{
key = KD_DP_ST + i;
if(key <= KD_DP_END)
Dept_Pop_Key_Tabl[i] = key; /*默认的部门值*/
else
Dept_Pop_Key_Tabl[i] = KD_NULL; /*不足部门,则设定为Null*/
Dept_Pop_Key_Tabl_Size[i] = 0x11; /*All are Normal size*/
}
for(; i < MAX_LAYOUT_KEY; i++) /*命令按钮处理*/
{
Dept_Pop_Key_Tabl[i] = Dept_Pop_Key_Cmd[i-(MAX_LAYOUT_KEY-LINE_KEY_NUM)];
Dept_Pop_Key_Tabl_Size[i] = Dept_Pop_Key_Cmd_Size[i-(MAX_LAYOUT_KEY-LINE_KEY_NUM)];
}
}
/*将每个部门都连接需要的C.M.*/
const char Str_Dept_Link_Step[][MAX_TEXT*2+1] =
{
{"Select a Department first, can use [DEPT SHIFT] key to get more"},
{"Select the right C.M., confirm with [ENTER}"},
};
/*增加一条CM记录到部门上.
*此处仅仅是提供一个选择画面,让用户选择,然后用户可以做的操作:
*Page Up/Down/Line Up/Down/Enter/Cancel
*返回用户输入的键: OK/CANCEL 和选择的CM的行号( 0--CM_MAX_NO-1)
*/
BOOL Dept_Cm_Add(char *ret_line)
{
WORD key = 0;
BYTE line = 0;
BOOL r = NG;
BOOL loop = true;
Disp_Full_CM_List_Ex(); /*display whole CM on left text box*/
while(loop)
{
key = GetKey();
switch(key)
{
case KD_PAGE_DOWN:
case KD_PAGE_UP:
case KD_DOWN:
case KD_UP:
Lcd_Reflush_List(Do_Menu_Roll(key));
break;
case KD_ENTER:
r = OK;
line = Text_Lcd.CurrLine; /*此处需要考虑超过MAX_LCD_LINE*3的情况*/
loop = false;
break;
case KD_CANCEL:
r = NG;
loop = false;
break;
default:
bellcnt = 0x80; /*bell*/
break;
}
}
*ret_line = line + 1;
return(r);
}
/*-----------------------------------------------------------------------------
* Program the CM which linked with a department
* For each department, maximum 20 cooking message can be linked with
*
*----------------------------------------------------------------------------*/
void Dept_Link_CM_Main(void)
{
WORD key;
BYTE idx;
BYTE ret;
bool r = NG;
byte CM_Idx = 0;
bool loop = true;
WORD Dept_Idx = 0xffff;
byte bak_Ddpt_Shift_Inc;
Get_Dpet_key_Map(); /*Get the keyboard layout */
bak_Ddpt_Shift_Inc = sysflag->Dept_Shift_Inc;
sysflag->DPLU_Shift_Inc = MAX_LAYOUT_KEY-LINE_KEY_NUM;
Bak_Ts_Key_Tab1 = Ts_Key_Tab;
Bak_Ts_Key_Table_Size1 = Ts_Key_Table_Size;
Ts_Key_Tab = (const word *)Dept_Pop_Key_Tabl;
Ts_Key_Table_Size = (const byte *)Dept_Pop_Key_Tabl_Size;
Lcd_Layout_Draw_Key();//弹出右界面
Lcd_Send_Text_Buff_Str(BUF_ID_TL_TITLE, 1, "Select Cooking Message", ALIGN_MID);
Lcd_Disp_Text_Buff(BUF_ID_TL_TITLE);
DeptShiftFlag = 0;
Lcd_Disp_Str_Btn(BUF_ID_TL_SUB, Str_Dept_Link_Step[0]);
Rst_Lcd_Text(); /*清除文本框中的内容,因为开始的时候还没有选择任何一个部门*/
Lcd_Clr_Text_Btn(BUF_ID_LCD_TEXT, 0); // Clear the last display
while(loop)
{
GetMainMode();
if(MainMode != CurrMode)
{
loop = false; /*快速退出*/
break;
}
key = GetKey();
switch(key)
{
case KD_CANCEL:
loop = false;
break;
case KD_ADD: /*增加一个C.M到某个部门*/
if(Dept_Idx == 0xffff) /*No department is selected*/
{
errorMsg("Select a Department first");
break;
}
if(Dept_Idx >= Max_Dept_No) /*illegal dept index*/
{
errorMsg("Chosed the illegal Department");
break;
}
if (CM_TtlNumGet() == 0) /*如果可用数量为0, 直接报错后返回*/
{
errorMsg("No Cooking Message can be used");
break;
}
idx = Dept_Cm_FindBlankRcrd(Dept_Idx);
if (idx == 0xff) /*Cannot find a blank record*/
{
errorMsg("No space for store the C.M.");
break;
}
r = Dept_Cm_Add(&CM_Idx); /*调用子程序添加一条记录*/
if (r == OK) /*Add a new record*/
{
dept[Dept_Idx].CkMsg[idx] = CM_Idx;/*Add one record*/
}
Dept_Disp_Cm(Dept_Idx); /*Display the new C.M. for department*/
Lcd_Disp_Str_Btn(BUF_ID_TL_SUB, Str_Dept_Link_Step[1]);
break;
case KD_DEL:
if(Dept_Idx == 0xff) /*No department is selected*/
{
errorMsg("Choose the Department first");
break;
}
if(Dept_Idx >= Max_Dept_No) /*illegal dept index*/
{
errorMsg("Chosed the illegal Department");
break;
}
if (CM_DeptTtlNumGet(Dept_Idx) == 0) /*如果可用数量为0, 直接报错后返回*/
{
errorMsg("No CM can be used");
break;
}
/*事实上,此处还需要考虑某个部门一条C.M.都没有连接的情况下删除,
*但是由于采用此种算法,不会造成错误,故不细究
*/
if(Get_Sure_Done(&ret) != OK)
break;
if(ret == KD_NO) /*用户放弃*/
break;
/*dept[Dept_Idx].CkMsg[Text_Lcd.CurrLine] = 0;*/
memmove(&(dept[Dept_Idx].CkMsg[Text_Lcd.CurrLine]),&(dept[Dept_Idx].CkMsg[Text_Lcd.CurrLine+1]), MAX_DEPT_CM_NO-Text_Lcd.CurrLine-1);
dept[Dept_Idx].CkMsg[MAX_DEPT_CM_NO-1] = 0; /*Delete this line*/
Dept_Disp_Cm(Dept_Idx);
Lcd_Disp_Str_Btn(BUF_ID_TL_SUB, Str_Dept_Link_Step[1]);
break;
#if 0
// case KD_ENTER:
// if(prg_step != 1) /*应该在处于Add C.M.步骤之中方可.*/
// {
// errorType(ERR_KEY_ILLEGAL);
// break;
// }
// for (i=0;i<MAX_DEPT_CM_NO; i++)
// {
// if (dept[Dept_Idx].CkMsg[i] ==0) /*Found one blank record*/
// break;
// }
// if(i >= MAX_DEPT_CM_NO)
// {errorMsg("The CM buffer in this Dept is full");break; }
// dept[Dept_Idx].CkMsg[i] = CM_Curr_Disp[curr_line];/*Add*/
// prg_step = 0;
// curr_line = 0;
// Dept_Disp_Cm(Dept_Idx);
break;
#endif
case KD_PAGE_DOWN:
case KD_PAGE_UP:
case KD_UP:
case KD_DOWN:
if(Dept_Idx != 0xffff) /*已有DEP key被按下*/
Lcd_Reflush_List(Do_Menu_Roll(key)); /*左边文本显示区域上下翻页翻行*/
break;
case KD_DPSF: /*切换部门显示画面*/
DeptShiftFlag = (DeptShiftFlag+1)%4; /*总共最多可以显示4屏部门按钮*/
Lcd_Shift_Exchange(key);
Dept_Idx = 0xffff;
break;
default:
if((key >= KD_DP_ST)&&(key <= KD_DP_END))
{
key -= KD_DP_ST;
key += (word)DeptShiftFlag*(sysflag->DPLU_Shift_Inc);
if(key >= Max_Dept_No)
{
errorType(ERR_KEY_ILLEGAL);
}
else
{
Dept_Idx = key;
Dept_Disp_Cm(Dept_Idx);
Lcd_Disp_Str_Btn(BUF_ID_TL_SUB, Str_Dept_Link_Step[1]);
}
}
break;
}
}
}
#else
void Dept_Link_CM_Main(void)
{
}
void CM_Prog_Main(void)
{
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -