📄 menu.c
字号:
#include "dtm_v3.h"
#include "dtm.h"
#include "externdef.h"
#include <stdio.h>
_BYTE DeviceInit(void);
_BYTE ChangeDriver(_BYTE *cDCBSeq);
void MenuDisplayWin(_BYTE cWinMin,_BYTE cWinMax,_BYTE cBarPos,_BYTE *cpBuf);
_BYTE Estimantation(void);
//=================================================================
// 名称:DeviceInit
// 函数:设备初始化,首次使用设备时初始化FLASH
// 返回:成功返回C_OK,否则返回错误码
//=================================================================
_BYTE DeviceInit(void)
{
struct StruCSI sCSI;
struct StruSPB sSPB;
_BYTE cpDATBuf[LENOFDAT];
int i;
_BYTE cRetCode;
DispLCDClearScreen();
DispOutText(0,0,11,(_BYTE *)" 初始化确认 ");
DispOutText(2,0,11,(_BYTE *)" 确认初始化吗? ");
DispOutText(4,0,9,(_BYTE *)"按[确认]键初始化");
DispOutText(6,0,10,(_BYTE *)" 按其它键取消 ");
DispRefresh(0,0,8,VIDEOCOL,1);
i=0;
while(i<0x2200) {
KeyReadKey();
if (gcKeyUp) {
gcKeyUp = FALSE;
if (gdwKeyNum!=ENTER_MENU_KEY)
return(C_OK);
else
break;
}
Delayms(1);
i++;
}
// 初始化CSI
sCSI.cStatus = S_WAIT; // 手持机的当前状态
sCSI.cCurDCB = 0xff; // 当前DCB序号,仅在训练状态下有效
cRetCode = FlashReadWriteCSI(&sCSI,ICWRITE);
if (cRetCode!=C_OK) return(cRetCode);
// 初始化DAT
for (i=0;i<LENOFDAT;i++) cpDATBuf[i]=0x00;
cRetCode = FlashReadWriteDAT(cpDATBuf,ICWRITE);
if (cRetCode!=C_OK) return(cRetCode);
// 初始化SPB
sSPB.wKParm = 970; // K系数
sSPB.cVerifyCycle = 120; // 验证指纹的时间周期
sSPB.cSpeedLimit = 60; // 速度上限
sSPB.cSpeedLine = 10; // 区分场地和道路训练的临界值
sSPB.cTimeCycle = 4; // 区分训练类型的时间周期
for (i=0;i<12;i++)
sSPB.cpDayNightLine[i] = 18<<3; // 区分日训和夜训的时间临界值
cRetCode = FlashReadWriteSPB(&sSPB,ICWRITE);
if (cRetCode!=C_OK) return(cRetCode);
// 初始化队列指针
for (i=0;i<LENOFQUEUEPOINT/2;i++) cpDATBuf[i]=0x00;
cRetCode = FlashReadWriteQueuePoint(cpDATBuf,ICWRITE,INQUEUE,0);
if (cRetCode!=C_OK) return(cRetCode);
cRetCode = FlashReadWriteQueuePoint(cpDATBuf,ICWRITE,OUTQUEUE,0);
if (cRetCode!=C_OK) return(cRetCode);
cRetCode = FlashReadWriteQueuePoint(cpDATBuf,ICWRITE,INQUEUE,1);
if (cRetCode!=C_OK) return(cRetCode);
cRetCode = FlashReadWriteQueuePoint(cpDATBuf,ICWRITE,OUTQUEUE,1);
if (cRetCode!=C_OK) return(cRetCode);
ReBoot();
return(C_OK);
}
//=================================================================
// 变更驾驶员
// 返回选择的驾驶员的编号
//=================================================================
_BYTE ChangeDriver(_BYTE *cDCBSeq)
{
_BYTE i,cCurPos,cBarPos,cMaxPos,cWinMin,cWinMax;
_BYTE cpBuf[LENOFDCBT];
// 初始化变量
for (i=0;i<LENOFDCBT;i++) cpBuf[i]=0xff;
cBarPos=0;
cCurPos=0;
for (i=1;i<LENOFDCBT;i++) {
if (CSI.cCurDCB==i) cCurPos=cBarPos;
if (DCBT[i].cFlag==1) cpBuf[cBarPos++]=i;
}
cMaxPos = cBarPos-1;
cBarPos = cCurPos;
// 设置初始窗口的位置
if ((cBarPos+3)<=cMaxPos) {
cWinMin = cBarPos;
cWinMax = (cBarPos+3>cMaxPos?cMaxPos:cBarPos+3);
}
else {
cWinMin = (cMaxPos>3?cMaxPos-3:0);
cWinMax = cMaxPos;
}
if ((cBarPos<cWinMin)||(cBarPos>cWinMax)) cBarPos=cWinMin;
// 显示
MenuDisplayWin(cWinMin,cWinMax,cBarPos,cpBuf);
while(1) {
KeyReadKey();
if (gcKeyUp) {
gcKeyUp = FALSE;
switch(gdwKeyNum) {
case CANCEL_CHANGE_KEY:
return(C_CANCELED);
case ENTER_MENU_KEY:
*cDCBSeq = cpBuf[cBarPos];
if (*cDCBSeq<LENOFDCBT)
return(C_OK);
else
return(C_NOTOK);
case LOGOUT_PGDN_KEY:
if (cBarPos<cWinMax) {
DispRefresh((cBarPos-cWinMin)*2,0,2,VIDEOCOL,1);
cBarPos++;
DispRefresh((cBarPos-cWinMin)*2,0,2,VIDEOCOL,0);
}
else {
if (cWinMax<cMaxPos) {
cCurPos = (cWinMax+4>cMaxPos?cMaxPos:cWinMax+4);
cCurPos = cCurPos - cWinMax;
cWinMax = (cWinMax+4>cMaxPos?cMaxPos:cWinMax+4);
cWinMin += cCurPos;
if (cBarPos<cWinMax) cBarPos++;
// 整屏刷新
MenuDisplayWin(cWinMin,cWinMax,cBarPos,cpBuf);
}
}
break;
case LOGIN_PGUP_KEY:
if (cBarPos>cWinMin) {
DispRefresh((cBarPos-cWinMin)*2,0,2,VIDEOCOL,1);
cBarPos--;
DispRefresh((cBarPos-cWinMin)*2,0,2,VIDEOCOL,0);
}
else {
if (cWinMin>0) {
cCurPos = (cWinMin>4?cWinMin-4:0);
cCurPos = cWinMin - cCurPos; // 计算移动步长
cWinMin = (cWinMin>4?cWinMin-4:0);
cWinMax -= cCurPos;
if (cBarPos>cWinMin) cBarPos--;
// 整屏刷新
MenuDisplayWin(cWinMin,cWinMax,cBarPos,cpBuf);
}
}
break;
}
}
}
return(C_OK);
}
//=================================================================
// 刷新显示屏
// cWinMin:显示屏起始行在cpBuf的位置
// cWinMax:显示屏中止行在cpBuf的位置
// cBarPos:光标条在cpBuf的位置
// cpBuf:DCBT序号的列表,反映当前所有学员
//=================================================================
void MenuDisplayWin(_BYTE cWinMin,_BYTE cWinMax,_BYTE cBarPos,_BYTE *cpBuf)
{
_BYTE cPage,i;
_BYTE cpSeq[2];
DispLCDClearScreen();
for (i=cWinMin;i<=cWinMax;i++) {
cPage = i-cWinMin;
DispOutText(cPage*2,0,2,(_BYTE *)" ");
cpSeq[0]=((i+1)/10)+0x30;
cpSeq[1]=((i+1)%10)+0x30;
DispOutText(cPage*2,16,2,cpSeq);
DispOutText(cPage*2,32,1,(_BYTE *)" ");
DispOutImage(cPage*2,5*8,2,8*8,&DCBT[cpBuf[i]].cpName[0]); // 显示姓名
if (i==cBarPos)
DispRefresh(cPage*2,0,2,VIDEOCOL,0);
else
DispRefresh(cPage*2,0,2,VIDEOCOL,1);
cPage++;
}
while(cPage<4) {
DispOutText(cPage*2,0,14,(_BYTE *)" ");
DispRefresh(2*cPage,0,2,VIDEOCOL,1);
cPage++;
}
}
//=================================================================
// 显示菜单,选择对教练员的评价
// 评价分:满意,一般,不满意 三个级别,进入评价窗口时缺省显示一般
// 函数的返回值为:3表示满意,2表示一般,1表示不满意
//=================================================================
_BYTE Estimantation(void)
{
_BYTE cRow;
DispLCDClearScreen(); // 请屏
DispOutText(0,0,10,(_BYTE *)" *对教练满意度* "); // 显示初始信息
DispOutText(2,0,14,(_BYTE *)" 1. 满 意 "); //
DispOutText(4,0,14,(_BYTE *)" 2. 中 等 "); //
DispOutText(6,0,13,(_BYTE *)" 3. 不满意 "); //
DispRefresh(0,0,VIDEOPAGE,VIDEOCOL,1);
cRow=2;
DispRefresh(2*cRow,0,2,VIDEOCOL,0); //
while(1) {
KeyReadKey();
if (gcKeyUp) {
gcKeyUp = FALSE;
switch(gdwKeyNum) {
case CANCEL_CHANGE_KEY:
break;
case ENTER_MENU_KEY:
DispRefresh(2*cRow,0,2,VIDEOCOL,1); //
return(4-cRow);
case LOGIN_PGUP_KEY:
DispRefresh(2*cRow,0,2,VIDEOCOL,1); //
cRow = (cRow==1?3:cRow-1);
DispRefresh(2*cRow,0,2,VIDEOCOL,0); //
break;
case LOGOUT_PGDN_KEY:
DispRefresh(2*cRow,0,2,VIDEOCOL,1); //
cRow = (cRow==3?1:cRow+1);
DispRefresh(2*cRow,0,2,VIDEOCOL,0); //
break;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -