📄 keyprocess.c
字号:
UpdateDisp(TRUE);
break;
}
case Key_Three: // PageUp
{
// 向上翻2行
for (i=1; i<(sizeof(SetupMenu)/sizeof(t_Menu)); i++)
{
if (SetupMenu[i].NextMenu == SystemStatus.lParam)
{
SystemStatus.lParam = i;
break;
}
}
for (i=1; i<(sizeof(SetupMenu)/sizeof(t_Menu)); i++)
{
if (SetupMenu[i].NextMenu == SystemStatus.lParam)
{
SystemStatus.lParam = i;
break;
}
}
InitDispBuffer(TRUE);
UpdateDisp(TRUE);
break;
}
case Key_Nine: // PageDown
{
// 向下翻2行
SystemStatus.lParam = SetupMenu[SystemStatus.lParam].NextMenu;
SystemStatus.lParam = SetupMenu[SystemStatus.lParam].NextMenu;
InitDispBuffer(TRUE);
UpdateDisp(TRUE);
break;
}
default:
break;
}
break;
}
case Status_SetupTime: // 如果是在设置时间的界面,数字键则表示修改时间
{
// 将按键的值放到缓冲区中
if (KeyBuffer[0] < 10)
{
KeyBuffer[++KeyBuffer[0]] = nKey;
// 更新显示缓冲
DispBuffer[1][SetupTimeDispOrder[KeyBuffer[0]]] = nKey+0x30;
DispBuffer[1][0] = 0x01;
UpdateDisp(FALSE);
}
break;
}
case Status_SetupEnterPassword:
case Status_SetupPasswordBefore:
case Status_SetupPasswordFirst:
case Status_SetupPasswordVerify:// 确认输入的密码
{
// 将按键的值放到缓冲区中
if (KeyBuffer[0] < MAX_SYSTEM_PASSWORD_LENGTH)
{
KeyBuffer[++KeyBuffer[0]] = nKey;
// 更新显示缓冲
for (i=1; i<DISP_BUF_LENGTH; i++)
{
DispBuffer[1][i] = DispBuffer[1][i+1];
}
DispBuffer[1][DISP_BUF_LENGTH] = '*'; // 以*显示密码字符
DispBuffer[1][0] = 0x01;
UpdateDisp(FALSE);
}
break;
}
case Status_SetupAddTempCardByNum:
case Status_SetupDelTempCardByNum:
{
// 将按键的值放到缓冲区中
if (KeyBuffer[0] < MAX_RFCARD_NUM_LENGTH)
{
KeyBuffer[++KeyBuffer[0]] = nKey;
// 更新显示缓冲
for (i=0; i<KeyBuffer[0]; i++)
{
DispBuffer[1][DISP_BUF_LENGTH-i] = KeyBuffer[KeyBuffer[0]-i]+0x30;
}
DispBuffer[1][0] = 0x01;
UpdateDisp(FALSE);
}
break;
}
case Status_SetupAddTempCardDoor: // 输入该卡持卡人所在的房间号
{
if (KeyBuffer[0] < 4)
{
KeyBuffer[++KeyBuffer[0]] = nKey;
// 更新显示
for (i=1; i<=KeyBuffer[0]; i++)
{
DispBuffer[1][SetupAddTempCardDoorDispOrder[i]] = KeyBuffer[i]+0x30;
}
DispBuffer[1][0] = 0x01;
UpdateDisp(FALSE);
}
break;
}
case Status_SetupAddTempCardEndTime:// 输入射频卡的使用期限
{
if (KeyBuffer[0] < 10)
{
KeyBuffer[++KeyBuffer[0]] = nKey;
// 更新显示缓冲
DispBuffer[1][SetupTimeDispOrder[KeyBuffer[0]]] = nKey | 0x30;
DispBuffer[1][0] = 0x01;
UpdateDisp(FALSE);
}
break;
}
case Status_SetupDoubleClickTime: // 设置按键双击间隔时间
{
if (KeyBuffer[0] < 2)
{
KeyBuffer[++KeyBuffer[0]] = nKey;
// 更新显示缓冲
DispBuffer[1][12] = DispBuffer[1][13];
DispBuffer[1][13] = nKey | 0x30;
DispBuffer[1][0] = 0x01;
UpdateDisp(FALSE);
}
break;
}
case Status_SetupCheckDoorIntervalTime:
{
if (KeyBuffer[0] < 2)
{
KeyBuffer[++KeyBuffer[0]] = nKey;
// 更新显示缓冲
DispBuffer[1][12] = DispBuffer[1][13];
DispBuffer[1][13] = nKey | 0x30;
DispBuffer[1][0] = 0x01;
UpdateDisp(FALSE);
}
break;
}
case Status_FindAlarmRecord: // 查询报警记录的界面,数字键代替方向键
{
switch (nKey)
{
case Key_Two: // 查询上一条报警记录
{
if (AlarmRecord.PreRecord == AlarmRecordStartAddr) // 如果上一条记录是第一条空记录,则
{
I2CReadString(0x00, AlarmRecordStartAddr, I2CBuffer, sizeof(t_AlarmRecord));
pAlarmRecord = (t_AlarmRecord *)(I2CBuffer);
if (pAlarmRecord->PreRecord != AlarmRecordStartAddr)// 如果上面还有记录
{
I2CReadString(0x00, pAlarmRecord->PreRecord, (BYTE *)(&AlarmRecord), sizeof(t_AlarmRecord));
}
}
else
{
I2CReadString(0x00, AlarmRecord.PreRecord, (BYTE *)(&AlarmRecord), sizeof(t_AlarmRecord));
}
break;
}
case Key_Eight: // 查询下一条报警记录
{
if (AlarmRecord.NextRecord == AlarmRecordStartAddr) // 如果下一条记录是第一条记录,则
{
I2CReadString(0x00, AlarmRecordStartAddr, I2CBuffer, sizeof(t_AlarmRecord));
pAlarmRecord = (t_AlarmRecord *)(I2CBuffer);
if (pAlarmRecord->NextRecord != AlarmRecordStartAddr)// 如果下面还有记录
{
I2CReadString(0x00, pAlarmRecord->NextRecord, (BYTE *)(&AlarmRecord), sizeof(t_AlarmRecord));
}
}
else
{
I2CReadString(0x00, AlarmRecord.NextRecord, (BYTE *)(&AlarmRecord), sizeof(t_AlarmRecord));
}
break;
}
case Key_Four: // 退出
{
SystemStatus.Status = Status_Idle;
break;
}
case Key_Six: // 进入上下文菜单,即是否删除该菜单
{
SystemStatus.PreStatus = SystemStatus.Status;
SystemStatus.Status = Status_DelAlarmRecordFirst;
break;
}
case Key_Three: // 到第一条报警记录
{
I2CReadString(0x00, AlarmRecordStartAddr, I2CBuffer, sizeof(t_AlarmRecord));
pAlarmRecord = (t_AlarmRecord *)(I2CBuffer);
if (pAlarmRecord->NextRecord != AlarmRecordStartAddr)// 如果下面还有记录
{
I2CReadString(0x00, pAlarmRecord->NextRecord, (BYTE *)(&AlarmRecord), sizeof(t_AlarmRecord));
}
break;
}
case Key_Nine: // 到最后一条报警记录
{
I2CReadString(0x00, AlarmRecordStartAddr, I2CBuffer, sizeof(t_AlarmRecord));
pAlarmRecord = (t_AlarmRecord *)(I2CBuffer);
if (pAlarmRecord->PreRecord != AlarmRecordStartAddr)// 如果下面还有记录
{
I2CReadString(0x00, pAlarmRecord->PreRecord, (BYTE *)(&AlarmRecord), sizeof(t_AlarmRecord));
}
break;
}
default:
break;
}
InitDispBuffer(TRUE);
UpdateDisp(TRUE);
break;
}
case Status_DelAlarmRecordFirst: // 询问是否删除这项报警记录
{
switch (nKey)
{
case Key_One: // 确认删除
{
I2CReadString(0x00, AlarmRecord.NextRecord, I2CBuffer+sizeof(t_AlarmRecord), sizeof(t_AlarmRecord));
pAlarmRecord = (t_AlarmRecord *)(I2CBuffer+sizeof(t_AlarmRecord));
I2CWriteString(0x00, pAlarmRecord->PreRecord, NullString, sizeof(t_AlarmRecord)); // 删除当前报警记录
// 同时修改其前一条和后一条报警记录的指针
pAlarmRecord->PreRecord = AlarmRecord.PreRecord;
I2CWriteString(0x00, AlarmRecord.NextRecord, I2CBuffer+sizeof(t_AlarmRecord), sizeof(t_AlarmRecord));
I2CReadString(0x00, AlarmRecord.PreRecord, I2CBuffer+sizeof(t_AlarmRecord), sizeof(t_AlarmRecord));
pAlarmRecord->NextRecord = AlarmRecord.NextRecord;
I2CWriteString(0x00, AlarmRecord.PreRecord, I2CBuffer+sizeof(t_AlarmRecord), sizeof(t_AlarmRecord));
// 删除这条报警记录后显示上一条报警记录
if (AlarmRecord.PreRecord == AlarmRecordStartAddr) // 如果上一条记录是第一条空记录,则显示最后一条记录
{
if (pAlarmRecord->PreRecord != AlarmRecordStartAddr) // 如果上面还有记录
{
I2CReadString(0x00, pAlarmRecord->PreRecord, I2CBuffer+sizeof(t_AlarmRecord), sizeof(t_AlarmRecord));
memcpy((BYTE *)(&AlarmRecord), (BYTE *)pAlarmRecord, sizeof(t_AlarmRecord));
}
else // 如果已经没有报警记录了,则显示提示
{
memcpy(&DispBuffer[0][1], "报警记录已经为空", DISP_BUF_LENGTH);
memcpy(&DispBuffer[1][1], "请返回! ", DISP_BUF_LENGTH);
SystemStatus.PreStatus = Status_Idle;
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 200; // 消息显示时间为2s
break;
}
}
else
{
memcpy((BYTE *)(&AlarmRecord), (BYTE *)pAlarmRecord, sizeof(t_AlarmRecord));
}
memcpy(&DispBuffer[0][1], "删除操作完成 ", DISP_BUF_LENGTH);
memcpy(&DispBuffer[1][1], "请返回 ", DISP_BUF_LENGTH);
SystemStatus.PreStatus = Status_FindAlarmRecord;
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 150;
break;
}
case Key_Zero: // 取消删除
{
SystemStatus.Status = Status_FindAlarmRecord;
break;
}
default:
break;
}
InitDispBuffer(TRUE);
UpdateDisp(TRUE);
break;
}
case Status_Alarming_F: // 正在报警
{
break;
}
default:
break;
}
}
// 按下"取消"按键
void CancelKeyPress(void)
{
BYTE i;
if((SystemStatus.Status == Status_SetupAddTempCardByCard)
||SystemStatus.Status == Status_SetupDelTempCardByCard)
{
KeyBuffer[0] = 0x00;
CardBuffer[0] = 0x00;
}
if (SystemStatus.Status == Status_ShowingMessage) // 如果当前正在显示提示消息
{
SystemStatus.PreStatus = Status_Idle;
SystemStatus.Status = Status_Idle;//SystemStatus.PreStatus;
InitDispBuffer(TRUE);
}
else if (KeyBuffer[0] > 0x00) // 前面的输入当中输入了数字
{
if ((SystemStatus.Status == Status_Alarming_F) // 正在响应分机报警
|| (SystemStatus.Status == Status_Alarming_M)) // 正在响应门口机报警
{
SystemStatus.Status = SystemStatus.PreStatus;
SystemStatus.PreStatus = Status_Idle;
InitDispBuffer(TRUE);
ClosePower(); // 关闭报警电源
}
else if (LastKeyTimer < DoubleKeyPressTimer) // 如果两次按"取消"键的时间间隔小于设置的时间间隔,则认为是双击
{
// 双击"取消"按键
switch (SystemStatus.Status)
{
case Status_SetupTime:
case Status_SetupPasswordBefore:
case Status_SetupPasswordFirst:
case Status_SetupPasswordVerify:
case Status_SetupAddTempCardByNum:
case Status_SetupDelTempCardByNum:
SystemStatus.Status = Status_SetupMenu;
break;
case Status_SetupAddTempCardEndTime:
case Status_SetupAddTempCardDoor: // 确认该卡所在的房间号
break;
case Status_SetupCheckDoorIntervalTime:
break;
default:
SystemStatus.Status = Status_Idle;
SystemStatus.lParam = 0x00;
SystemStatus.wParam = 0x00;
break;
}
KeyBuffer[0] = 0;
// 更新显示缓冲
InitDispBuffer(TRUE);
}
else
{
switch (SystemStatus.Status)
{
case Status_ViewBefore: // 在按下监视键之后的数字输入见面
{
i = ViewBeforeDispOrder[KeyBuffer[0]];
DispBuffer[1][i] = '_';
break;
}
case Status_CallBefore: //
{
i = CallBeforeDispOrder[KeyBuffer[0]];
DispBuffer[1][i] = '_';
break;
}
case Status_SetupTime: // 设置时间
{
i = SetupTimeDispOrder[KeyBuffer[0]];
DispBuffer[1][i] = '_';
break;
}
case Status_Idle: // 空闲情况
case Status_SetupEnterPassword: // 进入设置菜单之前的输入管理员密码的阶段按取消键
case Status_SetupPasswordBefore:
case Status_SetupPasswordFirst:
case Status_SetupPasswordVerify:
case Status_SetupAddTempCardByNum:
case Status_SetupDelTempCardByNum:
{
// 全体数字右移一位
for (i=DISP_BUF_LENGTH; i>1; i--)
{
DispBuffer[1][i] = DispBuffer[1][i-1];
}
DispBuffer[1][1] = ' '; // 前面补空格
break;
}
case Status_SetupAddTempCardDoor: // 确认该卡所在的房间号
{
i = SetupAddTempCardDoorDispOrder[KeyBuffer[0]];
DispBuffer[1][i] = '_';
break;
}
case Status_SetupAddTempCardEndTime:
{
i = SetupTimeDispOrder[KeyBuffer[0]];
DispBuffer[1][i] = '_';
break;
}
case Status_SetupDoubleClickTime: // 设置按键双击间隔时间
case Status_SetupCheckDoorIntervalTime: // 设置管理机轮检门口机的时间间隔
{
DispBuffer[1][13] = DispBuffer[1][12];
DispBuffer[1][12] = '_';
break;
}
default: //
{
SystemStatus.Status = Status_Idle;
SystemStatus.lParam = 0x00;
SystemStatus.wParam = 0x00;
break;
}
}
DispBuffer[1][0] = 0x01;
KeyBuffer[0] --;
}
}
else if (KeyBuffer[0] == 0x00) // 如果按键缓冲区中没有按键值,
{
switch (SystemStatus.Status)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -