📄 keyprocess.c
字号:
SystemStatus.PreStatus = Status_SetupMenu;
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 200;
}
}
break;
}
case Status_SetupDelTempCardByCard: ////////////////////////////////////////////////////////////////
case Status_SetupDelTempCardByNum: // 删除刷卡用户,卡号存放在KeyBuffer[]中
{
// 从I2C存储器中寻找相应的卡号,如果找到则将其删除,如果找不到则提示
// 要先判断输入的卡号的长度
if ( KeyBuffer[0] == MAX_RFCARD_NUM_LENGTH )
{
RFCardNumChange();
// 显示提示消息
memcpy(&DispBuffer[1][1], "执行中,请稍候 ", DISP_BUF_LENGTH);
DispBuffer[1][0] = 0x01;
UpdateDisp(FALSE);
// 搜索该卡存放在存储器中的地址
j = FindRFCardByNum(&(RFCardUser.CardNum[0]), RFCardTabStartAddr, RFCardTabLength);
if ((j >= RFCardTabStartAddr) && (j < (RFCardTabStartAddr+RFCardTabLength))) // 找到了存放该卡的首地址
{
// 删除该卡信息
I2CWriteString(0x00, j, NullString, sizeof(t_RFCardUser));
// 删除卡的操作顺利完成
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);
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);
SystemStatus.PreStatus = Status_SetupMenu;
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 200;
}
break;
}
case Status_SetupDoubleClickTime:
{
if ((KeyBuffer[0] == 1) || (KeyBuffer[0] == 2))
{
if (KeyBuffer[0] == 1)
{
i = KeyBuffer[1];
}
else
{
i = KeyBuffer[1] * 10;
i += KeyBuffer[2];
}
DoubleKeyPressTimer = i;
I2CWriteString(0x00, 0x0002, &i, 1);
memcpy(&DispBuffer[1][1], "设置完成,请返回", DISP_BUF_LENGTH);
SystemStatus.PreStatus = Status_SetupMenu;
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 200;
}
break;
}
case Status_SetupCheckDoorIntervalTime:
{
if (KeyBuffer[0] == 0) // 没有输入数字,表示用户的意思为输入0
{
i = 0;
}
else if (KeyBuffer[0] == 1) // 输入大数字为1位数
{
i = KeyBuffer[1];
}
else if (KeyBuffer[0] == 2) // 输入的数字位2位数
{
i = KeyBuffer[1] * 10;
i += KeyBuffer[2];
}
CheckDoorIntervalTimer = i; //
I2CWriteString(0x00, 0x0003, &i, 1);
// 重置各个门口机对应的心跳变量
for (j=0; j<DoorNumber; j++)
{
if (CheckDoorIntervalTimer == 0)
{
CheckDoorIntervalArray[j] = 0;
}
else
{
CheckDoorIntervalArray[j] = CheckDoorIntervalTimer;
}
}
memcpy(&DispBuffer[1][1], "设置完成,请返回", DISP_BUF_LENGTH);
SystemStatus.PreStatus = Status_SetupMenu;
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 200;
break;
}
default:
return;
break;
}
// 清空按键缓冲区
KeyBuffer[0] = 0x00;
InitDispBuffer(TRUE);
UpdateDisp(TRUE);
}
// 按下"监视"按键
void ViewKeyPress(void)
{
BYTE i;
if (SystemStatus.Status == Status_ViewBefore)
{
if (KeyBuffer[0] == 0x04)
{
// 找到该单元号对应的路由地址
i = KeyBuffer[1]<<4;
i |= KeyBuffer[2]&0x0F;
RouteInfo.House = i; // 楼栋号
i = KeyBuffer[3]<<4;
i |= KeyBuffer[4]&0x0F;
RouteInfo.Door = i; // 单元号
if (GetRouteInfoByDoorAddr(&RouteInfo))
{
// 准备需要发送的数据帧,先向其中填入地址
TxFrame.Frame.Addr[0] = 0x00; // 首地址必定为0x00
TxFrame.Frame.Addr[1] = RouteInfo.RouteAddr; // 路由器地址
TxFrame.Frame.Addr[2] = RouteInfo.DoorAddr; // 门口机地址
TxFrame.Frame.Addr[3] = 0x00; // 分机地址,此处为0x00
TxFrame.Frame.nLength = 0x01; // 监视请求,命令长度为一个字节
TxFrame.Frame.aData[0] = Command_ViewRequest;
// 发送该数据包
TxFrameLength = 6; // 发送数据帧的长度为6个字节,不包括校验和停止字节
RS485SendWaitTimer = MAX_RS485_WAIT_TIMES * 3;
RS485SendTxFrame();
SystemStatus.Status = Status_ViewSendingRequest;
KeyBuffer[0] = 0x00;
InitDispBuffer(FALSE);
}
else // 没有找到该单元对应的单元信息,说明该单元不存在,即用户输入错误
{
memcpy(&DispBuffer[1][1], "该单元不存在! ", DISP_BUF_LENGTH);
KeyBuffer[0] = 0x00;
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 200;
}
}
else if (KeyBuffer[0] ==0x00) // 没有输入数字,再次按下"监视"按键没有任何作用
{
//
}
else // 输入的数字长度不对
{
memcpy(&DispBuffer[1][1], "单元号输入错误!", DISP_BUF_LENGTH);
KeyBuffer[0] = 0x00;
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 200;
}
}
else if (SystemStatus.Status == Status_Idle)
{
SystemStatus.Status = Status_ViewBefore;
KeyBuffer[0] = 0x00;
InitDispBuffer(TRUE);
}
UpdateDisp(TRUE); // 更新显示
}
// 按下"呼叫"按键
void CallKeyPress(void)
{
UINT i;
BYTE j;
BYTE temp;
bit bTemp;
t_RouteInfo *p_temp;
if (SystemStatus.Status == Status_CallBefore)
{
if (KeyBuffer[0] == 0x06)
{
// 找到该房间对应的路由器地址
temp = KeyBuffer[1] << 4;
temp |= KeyBuffer[2]&0x0F;
RouteInfo.House = temp; // 楼栋号
temp = KeyBuffer[5] * 10; // 房间号
temp += KeyBuffer[6];
RouteInfo.Door = temp; // 用单元号来暂存一下房间号
// 通过查找路由表,寻找出该房间对应的单元号及对应的路由地址
bTemp = FALSE;
/*
for (i=RouteInfoStartAddr; i<(RouteInfoStartAddr+RouteInfoLength); )
{
if ((RouteInfoStartAddr+RouteInfoLength-i) >= sizeof(I2CBuffer))
{
temp = sizeof(I2CBuffer);
}
else
{
temp = RouteInfoLength-i;
}
I2CReadString(0x00, i, I2CBuffer, temp);
i += temp;
for (j=0; j<temp; j+=sizeof(t_RouteInfo))
{
p_temp = (t_RouteInfo *)(&I2CBuffer[j]);
if ((RouteInfo.House == p_temp->House) // 楼栋号相同
&& (RouteInfo.Door >= p_temp->StartNum) // 房间号在该单元的房号范围内
&& (RouteInfo.Door <= p_temp->EndNum))
{
RouteInfo.RouteAddr = p_temp->RouteAddr;
RouteInfo.DoorAddr = p_temp->DoorAddr;
RouteInfo.StartNum = p_temp->StartNum;
RouteInfo.EndNum = p_temp->EndNum;
RouteInfo.Door = p_temp->Door; // 补充单元地址
bTemp = TRUE;
break;
}
}
if (bTemp == TRUE)
{
break;
}
}
*/
for (i=0, j=0; i<RouteInfoLength; i+=sizeof(t_RouteInfo))
{
p_temp = (t_RouteInfo *)(&RouteInfoTable[j++]);
if ((RouteInfo.House == p_temp->House) // 楼栋号相同
&& (RouteInfo.Door >= p_temp->StartNum) // 房间号在该单元的房号范围内
&& (RouteInfo.Door <= p_temp->EndNum))
{
RouteInfo.RouteAddr = p_temp->RouteAddr;
RouteInfo.DoorAddr = p_temp->DoorAddr;
RouteInfo.StartNum = p_temp->StartNum;
RouteInfo.EndNum = p_temp->EndNum;
RouteInfo.Door = p_temp->Door; // 补充单元地址
bTemp = TRUE;
break;
}
}
if (bTemp == TRUE)
{
if (bHandleUp == TRUE) // 如果手柄已经被提起,则可以呼叫出去
{
temp = (KeyBuffer[3]&0x0F)*10 + (KeyBuffer[4]&0x0F); // 楼层号
temp -= 1;
temp *= (RouteInfo.EndNum - RouteInfo.StartNum + 1); //
temp += KeyBuffer[5]*10 + KeyBuffer[6]; // 分机地址
temp -= (RouteInfo.StartNum - 1);
TxFrame.Frame.Addr[0] = 0x00;
TxFrame.Frame.Addr[1] = RouteInfo.RouteAddr;
TxFrame.Frame.Addr[2] = RouteInfo.DoorAddr;
TxFrame.Frame.Addr[3] = temp;
TxFrame.Frame.nLength = 0x01;
TxFrame.Frame.aData[0] = Command_CallRequest;
// 发送该数据包
TxFrameLength = 6;
RS485SendWaitTimer = MAX_RS485_WAIT_TIMES * 3;
RS485SendTxFrame();
SystemStatus.Status = Status_CallSendingRequest;
KeyBuffer[0] = 0x00;
InitDispBuffer(FALSE);
}
else // 手柄没有提起来,不能呼叫出去
{
memcpy(&DispBuffer[1][1], "请先提起手柄! ", DISP_BUF_LENGTH);
DispBuffer[1][0] = 0x01;
// KeyBuffer[0] = 0x00;// 这一句是否需要加在这儿?
SystemStatus.PreStatus = SystemStatus.Status;
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 200;
}
}
else
{
memcpy(&DispBuffer[1][1], "该房号不存在! ", DISP_BUF_LENGTH);
KeyBuffer[0] = 0x00;
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 200;
}
}
else if (KeyBuffer[0] == 0x00) // 没有输入数字,再次按下"呼叫"键没有任何用处
{
}
else
{
memcpy(&DispBuffer[1][1], "房间号输入错误!", DISP_BUF_LENGTH);
KeyBuffer[0] = 0x00;
SystemStatus.Status = Status_ShowingMessage;
MessageShowTimer = 200;
}
}
else if (SystemStatus.Status == Status_Idle)
{
SystemStatus.Status = Status_CallBefore;
KeyBuffer[0] = 0x00;
InitDispBuffer(TRUE);
}
UpdateDisp(TRUE); // 更新显示
}
// 按下"开锁"按键
void UnlockKeyPress(void)
{
if ((SystemStatus.Status == Status_Talking)
&& (ConnectingAddr[3] == 0x00))
{
// 发送开锁请求
TxFrame.Frame.Addr[0] = ConnectingAddr[0];
TxFrame.Frame.Addr[1] = ConnectingAddr[1];
TxFrame.Frame.Addr[2] = ConnectingAddr[2];
TxFrame.Frame.Addr[3] = 0x00;
TxFrame.Frame.nLength = 1;
TxFrame.Frame.aData[0] = Command_Unlock;
TxFrameLength = 6;
RS485SendWaitTimer = MAX_RS485_WAIT_TIMES * 3;
RS485SendTxFrame();
// SystemStatus.PreStatus = SystemStatus.Status;
SystemStatus.Status = Status_UnlockSendingRequest;
KeyBuffer[0] = 0x00;
InitDispBuffer(FALSE);
}
}
// 按下"查询"按键
void FindKeyPress(void)
{
UINT temp;
if (SystemStatus.Status == Status_FindAlarmRecord)
{
SystemStatus.Status = Status_Idle;
InitDispBuffer(TRUE);
UpdateDisp(TRUE);
}
else if (SystemStatus.Status == Status_Idle)
{
KeyBuffer[0] = 0; // 查询报警信息的时候情况按键缓冲区
I2CReadString(0x00, AlarmRecordStartAddr, I2CBuffer, sizeof(t_AlarmRecord));
pAlarmRecord = (t_AlarmRecord *)(I2CBuffer);
temp = pAlarmRecord->PreRecord; // 最后一条报警记录的地址
if ((temp >= AlarmRecordStartAddr) && (temp < (AlarmRecordStartAddr+AlarmRecordLength)))
{
if (temp == AlarmRecordStartAddr) // 上一条报警记录指向它本身,表示没有报警记录,直接显示报警记录为空
{
memcpy(&DispBuffer[0][1], "报警记录为空 ", DISP_BUF_LENGTH);
memcpy(&DispBuffer[1][1], "请返回! ", DISP_BUF_LENGTH);
MessageShowTimer = 300; // 消息显示时间为3s
SystemStatus.Status = Status_ShowingMessage;
}
else // 有报警记录,读出最后一条
{
I2CReadString(0x00, temp, (BYTE *)(&AlarmRecord), sizeof(t_AlarmRecord));
SystemStatus.Status = Status_FindAlarmRecord;
}
InitDispBuffer(TRUE);
UpdateDisp(TRUE);
}
else // 存储器内容不正确,重新初始化报警记录
{
memcpy(&DispBuffer[0][1], "报警记录格式错误", DISP_BUF_LENGTH);
memcpy(&DispBuffer[1][1], "重新格式化...00%", DISP_BUF_LENGTH);
UpdateDisp(TRUE);
InitAlarmRecordArea();
}
}
}
///////////////////////////////////////////////////////////////////////////////
// 初始化报警记录存储空间
void InitAlarmRecordArea(void)
{
BYTE i;
BYTE j;
BYTE k;
UINT temp;
// 清空报警记录
i = 0; // i表示当前是第几次循环
j = (BYTE)(AlarmRecordLength / NULL_STRING_LENGTH); // j为完成初始化操作需要的循环次数
for (temp=AlarmRecordStartAddr; temp<(AlarmRecordStartAddr+AlarmRecordLength); )
{
I2CWriteString(0x00, temp, NullString, NULL_STRING_LENGTH);
temp += NULL_STRING_LENGTH;
// 更新显示当前进度
if (((++i)%5) == 0)
{
k = (BYTE)(((UINT)(i)*100)/j);
DispBuffer[1][14] = (k/10) | 0x30;
DispBuffer[1][15] = (k%10) | 0x30;
DispBuffer[1][0] = 0x01;
UpdateDisp(FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -