📄 keyprocess.c
字号:
case Status_SetupMenu: // 在设置的菜单界面,判断当前菜单是否子菜单项,如果是则后退一步,否则退到初始状态
{
if (SetupMenu[SystemStatus.lParam].Parent != 0x00)
{
SystemStatus.lParam = SetupMenu[SystemStatus.lParam].Parent;
SystemStatus.wParam = 0x01;
}
else
{
SystemStatus.Status = Status_Idle;
SystemStatus.lParam = 0x00;
SystemStatus.wParam = 0x00;
}
break;
}
case Status_SetupTime:
case Status_SetupPasswordBefore:
case Status_SetupPasswordFirst:
case Status_SetupPasswordVerify:
case Status_SetupAddTempCardByCard:
case Status_SetupDelTempCardByCard:
case Status_SetupAddTempCardByNum:
case Status_SetupDelTempCardByNum:
case Status_SetupAddTempCardEndTime:
case Status_SetupDoubleClickTime:
case Status_SetupCheckDoorIntervalTime:
{
// EX2 = 0;//////////////////
SystemStatus.Status = Status_SetupMenu;
break;
}
case Status_ViewSendingRequest:
case Status_CallSendingRequest:
{
ClearConnectingAddr();
RS485SendWaitTimer = 0;
TxFrame.Frame.aData[0] = Command_Disconnect;
RS485SendTxFrame();
SystemStatus.PreStatus = Status_Idle;
SystemStatus.Status = Status_Idle;
SystemStatus.lParam = 0x00;
SystemStatus.wParam = 0x00;
break;
}
case Status_Viewing: // 正在监视的时候按"取消"
case Status_Talking: // 正在通话的时候按"取消"
case Status_Calling: // 正在呼叫室内分机
{
ViewTimeCounter = 0; // 将监视定时器清零
// 发送取消连接的命令
RS485SendCancelCommand();
ClosePower();
SystemStatus.PreStatus = Status_Idle;
SystemStatus.Status = Status_Idle;
SystemStatus.lParam = 0x00;
SystemStatus.wParam = 0x00;
break;
}
case Status_Alarming_F: // 正在响应分机报警
case Status_Alarming_M: // 正在响应门口机报警
{
// 发送取消连接的命令
// RS485SendCancelCommand();
SystemStatus.Status = Status_Idle;
SystemStatus.lParam = 0x00;
SystemStatus.wParam = 0x00;
ClosePower(); // 关闭报警电源
break;
}
case Status_bCallingIn_F: // 正在被室内机呼叫的时候按"取消"
case Status_bCallingIn_M: // 正在被门口机呼叫的时候按"取消"
{
SystemStatus.Status = Status_Idle;
SystemStatus.lParam = 0x00;
SystemStatus.wParam = 0x00;
// 发送断开连接的命令
RS485SendCancelCommand();
// 关闭音频、视频电源
ClosePower();
break;
}
default:
{
SystemStatus.Status = Status_Idle;
ClosePower();
SystemStatus.lParam = 0x00;
SystemStatus.wParam = 0x00;
break;
}
}
// 更新显示缓冲
InitDispBuffer(TRUE);
}
else
{
SystemStatus.Status = Status_Idle;
SystemStatus.lParam = 0x00;
SystemStatus.wParam = 0x00;
}
if (SystemStatus.Status == Status_Idle) // 如果状态处于空闲状态,但是音频或视频电源却是打开了,则关闭这些电源
{
ClosePower();
}
UpdateDisp(TRUE);
}
// 按下"确认"按键
void EnterKeyPress(void)
{
void (*MenuFunc)(void);
bit bTemp;
BYTE i;
UINT j;
bTemp = FALSE;
switch (SystemStatus.Status)
{
case Status_Idle: // 空闲模式,进入设置菜单界面
{
if (I2CReadString(0x00, SystemPasswordAddress, SystemPassword, 1)) // 读出密码的长度来,
{
if (SystemPassword[0] == 0x00) // 如果长度为0,则表示密码为空,跳过输入密码的界面,直接进入菜单界面
{
// 进入设置菜单界面
SystemStatus.Status = Status_SetupMenu;
SystemStatus.lParam = 0x00; // 从第一行菜单开始显示
SystemStatus.wParam = 0x01; // 当前选中屏幕上的第一行菜单
}
else
{
SystemStatus.Status = Status_SetupEnterPassword;
}
}
else
{
SystemStatus.Status = Status_SetupEnterPassword;
}
break;
}
case Status_ViewBefore: //
{
ViewKeyPress();
return;
break;
}
case Status_SetupEnterPassword:
{
// 将I2C存储器中读出系统密码,与输入的密码相比较
if (!I2CReadString(0x00, SystemPasswordAddress, SystemPassword, sizeof(SystemPassword)))
{
// 密码读失败,退出
memcpy(&DispBuffer[1][1], " 系统读出错! ", DISP_BUF_LENGTH);
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 200;
break;
}
bTemp = TRUE;
for (i=0; i<=SystemPassword[0]; i++)
{
if (KeyBuffer[i] != SystemPassword[i]) // 输入的密码不正确
{
bTemp = FALSE;
break;
}
}
if (bTemp == FALSE) // 如果和I2C中存放的密码不一样,那么再试一下万能密码
{
bTemp = TRUE;
for (i=0; i<pwd[0]; i++)
{
if (KeyBuffer[i] != pwd[i])
{
bTemp = FALSE;
break;
}
}
}
if (bTemp == TRUE) // 如果输入的密码正确
{
// 进入设置菜单界面
SystemStatus.Status = Status_SetupMenu;
SystemStatus.lParam = 0x00; // 从第一行菜单开始显示
SystemStatus.wParam = 0x01; // 当前选中屏幕上的第一行菜单
}
else // 如果输入的密码错误
{
memcpy(&DispBuffer[1][1], "输入密码错误! ", DISP_BUF_LENGTH);
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 200;
}
break;
}
case Status_SetupMenu: // 正在主菜单状态下,再按"设置"键表示进入该菜单
{
if (SystemStatus.wParam == 0x01)
{
i = SystemStatus.lParam;
}
else if (SystemStatus.wParam == 0x02)
{
i = SetupMenu[SystemStatus.lParam].NextMenu;
}
// 判断这是一个父菜单项还是一个执行菜单项,分别执行程序或显示其子菜单
if (SetupMenu[i].Child != 0x00)
{
// 显示其子菜单
SystemStatus.lParam = SetupMenu[i].Child;
SystemStatus.wParam = 0x01;
}
else
{
// 执行菜单函数
MenuFunc = SetupMenu[i].MenuFunction;
if (MenuFunc != NULL)
{
MenuFunc();
}
}
break;
}
case Status_SetupTime: // 确认时间修改
{
if (KeyBuffer[0] == 10) // 修改时间一次需要输入10个数字
{
ModifyTime(&KeyBuffer[1]);
SystemStatus.PreStatus = Status_Idle;
SystemStatus.Status = Status_Idle; //Status_SetupMenu; // 回到初始状态
}
break;
}
case Status_SetupPasswordBefore: // 设置密码的前面输入管理员密码的时候
{
// 判断输入的密码是否正确,如果正确则进入下一步,否则回到初始状态
// 将I2C存储器中读出系统密码,与输入的密码相比较
if (!I2CReadString(0x00, SystemPasswordAddress, SystemPassword, sizeof(SystemPassword)))
{
// 密码读失败,退出
memcpy(&DispBuffer[1][1], " 系统读出错! ", DISP_BUF_LENGTH);
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 200;
break;
}
bTemp = TRUE;
for (i=0; i<=SystemPassword[0]; i++)
{
if (KeyBuffer[i] != SystemPassword[i]) // 输入的密码不正确
{
bTemp = FALSE;
break;
}
}
if (bTemp == FALSE) // 如果和I2C中存放的密码不一样,那么再试一下万能密码
{
bTemp = TRUE;
for (i=0; i<pwd[0]; i++)
{
if (KeyBuffer[i] != pwd[i])
{
bTemp = FALSE;
break;
}
}
}
if (bTemp == TRUE) // 如果输入的密码正确
{
SystemStatus.Status = Status_SetupPasswordFirst;
}
else // 如果输入的密码错误
{
memcpy(&DispBuffer[1][1], "输入密码错误! ", DISP_BUF_LENGTH);
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 200;
}
break;
}
case Status_SetupPasswordFirst:
{
// 先清除旧密码
for (i=0; i<sizeof(SystemPassword); i++)
{
SystemPassword[i] = 0x00;
}
// 然后保存新密码
for (i=0; i<=KeyBuffer[0]; i++)
{
SystemPassword[i] = KeyBuffer[i];
}
SystemStatus.Status = Status_SetupPasswordVerify;
break;
}
case Status_SetupPasswordVerify:
{
// 比较两次输入的密码是否相同,如果相同则写进I2C,否则取消这一次的修改
bTemp = TRUE;
for (i=0; i<SystemPassword[0]; i++)
{
if (KeyBuffer[i] != SystemPassword[i]) // 两次输入的密码不一样
{
bTemp = FALSE;
break;
}
}
if (bTemp == TRUE) // 两次密码相同,可以保存
{
if (!I2CWriteString(0x00, SystemPasswordAddress, &SystemPassword, sizeof(SystemPassword)))
{
// 如果写密码失败,则
memcpy(&DispBuffer[1][1], "修改密码失败! ", DISP_BUF_LENGTH);
SystemStatus.PreStatus = Status_SetupMenu;
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 200;
}
else
{
// 密码修改成功
memcpy(&DispBuffer[1][1], "密码修改完成! ", DISP_BUF_LENGTH);
SystemStatus.PreStatus = Status_SetupMenu;
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 200;
}
}
else // 两次密码不相同,放弃修改
{
memcpy(&DispBuffer[1][1], "两次密码不相同!", DISP_BUF_LENGTH);
SystemStatus.PreStatus = Status_SetupMenu;
SystemStatus.Status = Status_ShowingMessage;
}
break;
}
case Status_SetupAddTempCardByCard:////////////////////////////////////////////////////////////////////
case Status_SetupAddTempCardByNum: // 增加刷卡用户,卡号存放在KeyBuffer[]中
{
// 要先判断输入的卡号的长度
if (KeyBuffer[0] == MAX_RFCARD_NUM_LENGTH)
{
RFCardNumChange();
// 进入下一个状态
SystemStatus.Status = Status_SetupAddTempCardDoor;
}
else
{
// 输入的卡号长度不对
memcpy(&DispBuffer[1][1], "卡号输入错误! ", DISP_BUF_LENGTH);
SystemStatus.PreStatus = Status_SetupMenu;
SystemStatus.Status = Status_ShowingMessage;
}
break;
}
case Status_SetupAddTempCardDoor: // 确认输入该卡持卡人所在的房间号
{
if (KeyBuffer[0] == 0x04)
{
// 解析出该卡所在的房间地址并将该卡信息存入相应的单元空间
i = KeyBuffer[1]<<4;
i += KeyBuffer[2];
RouteInfo.House = i;
RFCardUser.CardAddr[0] = i; // 楼栋
i = KeyBuffer[3]<<4;
i += KeyBuffer[4];
RouteInfo.Door = i;
RFCardUser.CardAddr[1] = i; // 单元
// 首先判断输入的楼栋和单元是否存在
if (GetRouteInfoByDoorAddr(&RouteInfo))
{
SystemStatus.Status = Status_SetupAddTempCardEndTime;
}
else
{
// 提示输入的楼栋和单元号错误
memcpy(&DispBuffer[1][1], "单元号输入有误!", DISP_BUF_LENGTH);
SystemStatus.PreStatus = Status_SetupMenu;
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 200;
}
}
break;
}
case Status_SetupAddTempCardEndTime: // 确认输入的射频卡的使用期限
{
// 判断输入的时间是否正确
if (KeyBuffer[0] == 10)
{
if (CheckBufferTime(&KeyBuffer[1]))
{
// 在给定的首地址和长度范围内找到一个空闲的位置,将卡的信息保存下来,空闲位置的卡号为"\x00\x00\x00\x00"
j = FindRFCardByNum("\x00\x00\x00\x00", RFCardTabStartAddr, RFCardTabLength);
if ((j >= RFCardTabStartAddr) && (j < (RFCardTabStartAddr+RFCardTabLength)))
{
memcpy((BYTE *)(&RFCardUser.EndTime), (BYTE *)(&TempTime), sizeof(t_Time));
// 将卡的信息存放到找到的地址空间中去
I2CWriteString(0x00, j, (BYTE *)(&RFCardUser), sizeof(t_RFCardUser));
// 提示卡信息已经保存
memcpy(&DispBuffer[1][1], "操作完成,请返回", DISP_BUF_LENGTH);
SystemStatus.PreStatus = Status_SetupMenu;
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 200;
}
else
{
// 提示没有多余的空间用来存放这张卡
memcpy(&DispBuffer[1][1], "卡号空间已满! ", DISP_BUF_LENGTH);
SystemStatus.PreStatus = Status_SetupMenu;
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 200;
}
}
else
{
memcpy(&DispBuffer[0][1], "时间输入有误, ", DISP_BUF_LENGTH);
memcpy(&DispBuffer[1][1], "请返回! ", DISP_BUF_LENGTH);
DispBuffer[0][0] = 0x01;
DispBuffer[1][0] = 0x01;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -