📄 keyprocess.c
字号:
}
// 初始化报警记录存储空间
memcpy(I2CBuffer, NullString, sizeof(t_AlarmRecord));
pAlarmRecord = (t_AlarmRecord *)(I2CBuffer);
pAlarmRecord->Index = 0x00; // 报警记录的长度
pAlarmRecord->PreRecord = AlarmRecordStartAddr; // 报警记录最后一条记录的地址
pAlarmRecord->NextRecord = AlarmRecordStartAddr; // 报警记录第一条记录的地址
I2CWriteString(0x00, AlarmRecordStartAddr, I2CBuffer, sizeof(t_AlarmRecord));
memcpy(&DispBuffer[0][1], "初始化操作完成 ", DISP_BUF_LENGTH);
memcpy(&DispBuffer[1][1], "请返回! ", DISP_BUF_LENGTH);
MessageShowTimer = 200; // 消息显示时间为2s
SystemStatus.PreStatus = Status_Idle;
SystemStatus.Status = Status_ShowingMessage;
UpdateDisp(TRUE);
}
//
// 保存报警记录,
// 参数: pSourceAlarm: 指向需要保存的报警记录结构体的指针,其中关于存储位置有关的变量在这个函数中自动填入
// 返回: 成功则返回TRUE,不成功则返回FALSE
BOOL SaveAlarmRecord(t_AlarmRecord *pSourceAlarm)
{
BYTE i;
BYTE j;
bit bTemp;
UINT temp;
//
I2CReadString(0x00, AlarmRecordStartAddr, I2CBuffer, sizeof(t_AlarmRecord));
pAlarmRecord = (t_AlarmRecord *)(I2CBuffer);
if (((pAlarmRecord->PreRecord) >= AlarmRecordStartAddr)
&& ((pAlarmRecord->PreRecord) < (AlarmRecordStartAddr+AlarmRecordLength))
&& ((pAlarmRecord->NextRecord) >= AlarmRecordStartAddr)
&& ((pAlarmRecord->NextRecord) < (AlarmRecordStartAddr+AlarmRecordLength))) // 如果读出的数据是有效的
{
// 从报警记录空间中找到一块空闲的存储区域,用来存放当前的报警记录
bTemp = FALSE;
for (temp=0; temp<AlarmRecordLength; )
{
if ((AlarmRecordLength - temp) > sizeof(I2CBuffer))
{
i = sizeof(I2CBuffer);
}
else
{
i = AlarmRecordLength - temp;
}
I2CReadString(0x00, AlarmRecordStartAddr+temp, I2CBuffer, i);
for (j=0; j<i; )
{
pAlarmRecord = (t_AlarmRecord *)(&I2CBuffer[j]);
if ((pAlarmRecord->PreRecord == 0x0000)
&& (pAlarmRecord->NextRecord == 0x0000)) // 如果这个地址没有记录
{
bTemp = TRUE;
temp = AlarmRecordStartAddr + temp; // 将找到的这个空闲地址保存到变量temp当中
break;
}
j += sizeof(t_AlarmRecord);
temp += sizeof(t_AlarmRecord);
}
if (bTemp == TRUE)
{
break;
}
}
if (bTemp == TRUE)
{
// 重新改写第一条记录的PreRecord指针
I2CReadString(0x00, AlarmRecordStartAddr, I2CBuffer, sizeof(t_AlarmRecord)); // 重新读回报警记录的第一条
pAlarmRecord = (t_AlarmRecord *)(I2CBuffer);
pSourceAlarm->PreRecord = pAlarmRecord->PreRecord; // 更新指针
pAlarmRecord->PreRecord = temp;
I2CWriteString(0x00, AlarmRecordStartAddr, I2CBuffer, sizeof(t_AlarmRecord)); // 保存更新
// 重新改写上一条报警记录的NextRecord指针
I2CReadString(0x00, pSourceAlarm->PreRecord, (I2CBuffer+sizeof(t_AlarmRecord)), sizeof(t_AlarmRecord));
pAlarmRecord = (t_AlarmRecord *)(I2CBuffer + sizeof(t_AlarmRecord));
AlarmRecord.NextRecord = pAlarmRecord->NextRecord;
pAlarmRecord->NextRecord = temp;
I2CWriteString(0x00, pSourceAlarm->PreRecord, I2CBuffer+sizeof(t_AlarmRecord), sizeof(t_AlarmRecord));
pSourceAlarm->Index = pAlarmRecord->Index + 1;
I2CWriteString(0x00, temp, (BYTE *)(pSourceAlarm), sizeof(t_AlarmRecord));
return TRUE; // 成功返回
}
}
else // 如果第一个地址存放的是无效的地址,则初始化整个报警记录存储区域
{
// 清空报警记录
for (temp=AlarmRecordStartAddr; temp<(AlarmRecordStartAddr+AlarmRecordLength); )
{
I2CWriteString(0x00, temp, NullString, NULL_STRING_LENGTH);
temp += NULL_STRING_LENGTH;
}
// 初始化报警记录存储空间
for (i=0; i<sizeof(t_AlarmRecord); i++)
{
I2CBuffer[i] = 0x00;
}
pAlarmRecord = (t_AlarmRecord *)(I2CBuffer);
pAlarmRecord->Index = 0x00; // 报警记录的长度
pAlarmRecord->PreRecord = AlarmRecordStartAddr; // 报警记录最后一条记录的地址
pAlarmRecord->NextRecord = AlarmRecordStartAddr; // 报警记录第一条记录的地址
I2CWriteString(0x00, AlarmRecordStartAddr, I2CBuffer, sizeof(t_AlarmRecord));
}
return FALSE;
}
//
// 通过楼栋号和单元号查表得到该单元的路由信息
// p_RouteInfo: 存放传入的楼栋和单元地址以及传出的路由器和门口机地址的指针
// 返回: 成功找到则返回TRUE,没有找到该单元的路由信息则返回FALSE
BOOL GetRouteInfoByDoorAddr(t_RouteInfo *p_RouteInfo)
{
UINT i;
BYTE j;
t_RouteInfo *p_temp;
/*
BYTE temp;
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 ((p_temp->House == p_RouteInfo->House)
&& (p_temp->Door == p_RouteInfo->Door))
{
// 找到该单元的路由地址,
p_RouteInfo->RouteAddr = p_temp->RouteAddr; // 路由器地址
p_RouteInfo->DoorAddr = p_temp->DoorAddr; // 门口机地址
p_RouteInfo->StartNum = p_temp->StartNum; // 单元起始房号
p_RouteInfo->EndNum = p_temp->EndNum; // 单元终止房号
return TRUE;
}
}
}
*/
for (i=0, j=0; i<RouteInfoLength; i+=sizeof(t_RouteInfo))
{
p_temp = (t_RouteInfo *)(&RouteInfoTable[j++]);
if ((p_temp->House == p_RouteInfo->House)
&& (p_temp->Door == p_RouteInfo->Door))
{
// 找到该单元的路由地址,
p_RouteInfo->RouteAddr = p_temp->RouteAddr; // 路由器地址
p_RouteInfo->DoorAddr = p_temp->DoorAddr; // 门口机地址
p_RouteInfo->StartNum = p_temp->StartNum; // 单元起始房号
p_RouteInfo->EndNum = p_temp->EndNum; // 单元终止房号
return TRUE;
}
}
return FALSE; // 没有找到该单元的路由地址,表示该单元补存在
}
//
// 通过路由地址查表得到该单元的路由信息,包括楼栋号和单元号以及该单元的分机号码的范围
// 参数: p_RouteInfo: 存放传入的楼栋和单元地址以及传出的路由器和门口机地址
// 返回: 成功找到则返回TRUE,没有找到该单元的路由信息则返回FALSE
BOOL GetRouteInfoByRouteAddr(t_RouteInfo *p_RouteInfo)
{
UINT i;
BYTE j;
t_RouteInfo *p_temp;
/*
BYTE temp;
for (i=0; i<RouteInfoLength; )
{
if ((RouteInfoLength-i) > sizeof(I2CBuffer))
{
temp = sizeof(I2CBuffer);
}
else
{
temp = RouteInfoLength-i;
}
I2CReadString(0x00, RouteInfoStartAddr+i, I2CBuffer, temp);
for (j=0; j<temp; )
{
p_temp = (t_RouteInfo *)(&I2CBuffer[j]);
if ((p_temp->RouteAddr == p_RouteInfo->RouteAddr)
&& (p_temp->DoorAddr == p_RouteInfo->DoorAddr))
{
// 找到该单元的路由地址,
p_RouteInfo->House = p_temp->House; // 路由器地址
p_RouteInfo->Door = p_temp->Door; // 门口机地址
p_RouteInfo->StartNum = p_temp->StartNum; // 单元起始房号
p_RouteInfo->EndNum = p_temp->EndNum; // 单元终止房号
// 由分机地址得到分机的房间号码,分机地址存放在p_RouteInfo->User当中
i = p_RouteInfo->EndNum - p_RouteInfo->StartNum + 1; // 该单元每层楼具有的房间数
p_RouteInfo->Floor = (p_RouteInfo->User + 1)/i; // 该分机所在的楼层号
j = (p_RouteInfo->User)%i;
if (j == 0) j = i;
p_RouteInfo->User = j + p_RouteInfo->StartNum - 1; // 该分机所在的房间号
return TRUE;
}
i += sizeof(t_RouteInfo);
j += sizeof(t_RouteInfo);
}
}
*/
for (i=0, j=0; i<RouteInfoLength; i+=sizeof(t_RouteInfo))
{
p_temp = (t_RouteInfo *)(&RouteInfoTable[j++]);
if ((p_temp->RouteAddr == p_RouteInfo->RouteAddr)
&& (p_temp->DoorAddr == p_RouteInfo->DoorAddr))
{
// 找到该单元的路由地址,
p_RouteInfo->House = p_temp->House; // 路由器地址
p_RouteInfo->Door = p_temp->Door; // 门口机地址
p_RouteInfo->StartNum = p_temp->StartNum; // 单元起始房号
p_RouteInfo->EndNum = p_temp->EndNum; // 单元终止房号
// 由分机地址得到分机的房间号码,分机地址存放在p_RouteInfo->User当中
i = p_RouteInfo->EndNum - p_RouteInfo->StartNum + 1; // 该单元每层楼具有的房间数
p_RouteInfo->Floor = (p_RouteInfo->User + 1)/i; // 该分机所在的楼层号
j = (p_RouteInfo->User)%i;
if (j == 0) j = i;
p_RouteInfo->User = j + p_RouteInfo->StartNum - 1; // 该分机所在的房间号
return TRUE;
}
}
return FALSE;
}
// */
// 通过卡号,在给定的存储器地址首地址和长度范围内找到存放该卡的首地址
// CardNum: 需要查找的卡号
// StartAddr: 存放卡信息的存储器空间首地址
// nLength: 存放卡信息的存储器空间的长度
// 返回:如果找到则返回该卡的首地址,如果没有找到则返回0x0000
UINT FindRFCardByNum(BYTE *CardNum, UINT StartAddr, UINT nLength)
{
UINT i;
BYTE j;
BYTE temp;
for (i=0; i<nLength; )
{
if ((nLength-i) > sizeof(I2CBuffer))
{
temp = sizeof(I2CBuffer);
}
else
{
temp = nLength-i;
}
I2CReadString(0x00, StartAddr+i, I2CBuffer, temp);
// 比较卡号
for (j=0; j<temp; )
{
p_RFCardUser = (t_RFCardUser *)(&I2CBuffer[j]);
// 比较卡号,以4个字节来表示卡号
if ((p_RFCardUser->CardNum[0] == CardNum[0])
&& (p_RFCardUser->CardNum[1] == CardNum[1])
&& (p_RFCardUser->CardNum[2] == CardNum[2])
&& (p_RFCardUser->CardNum[3] == CardNum[3]))
{
//如果卡号相同,则返回TRUE
return StartAddr+i;
}
i += sizeof(t_RFCardUser);
j += sizeof(t_RFCardUser);
}
}
return 0x0000;
}
//
// 选择菜单后进入设置系统时间的界面
void EnterSetupSystemTime(void)
{
SystemStatus.PreStatus = SystemStatus.Status;
SystemStatus.Status = Status_SetupTime;
}
// 进入设置系统密码界面
void EnterSetupSystemPassword(void)
{
SystemStatus.PreStatus = SystemStatus.Status;
if (I2CReadString(0x00, SystemPasswordAddress, SystemPassword, 1)) // 读出密码的长度来,
{
if (SystemPassword[0] == 0x00) // 如果长度为0,则表示密码为空,跳过输入密码的界面,直接进入菜单界面
{
SystemStatus.Status = Status_SetupPasswordFirst;
}
else
{
SystemStatus.Status = Status_SetupPasswordBefore;
}
}
else
{
SystemStatus.Status = Status_SetupPasswordBefore;
}
}
// 进入通过刷卡增加刷卡用户的界面
void EnterAddTempCardByCard(void)///////////////////////////////////////////////////////////////////
{
// KeyBuffer[0] = 0x00;
// CardBuffer[0] = 0x00;
// EX2 = 1;
SystemStatus.PreStatus = SystemStatus.Status;
SystemStatus.Status = Status_SetupAddTempCardByCard;
}
// 进入通过输入卡号增加刷卡用户的界面
void EnterAddTempCardByNum(void)
{
SystemStatus.PreStatus = SystemStatus.Status;
SystemStatus.Status = Status_SetupAddTempCardByNum;
}
// 进入通过刷卡删除刷卡用户的界面 //////////////////////////////////////////////////////////
void EnterDelTempCardByCard(void)
{
KeyBuffer[0] = 0x00;
CardBuffer[0] = 0x00;
// EX2 = 1;
SystemStatus.PreStatus = SystemStatus.Status;
SystemStatus.Status = Status_SetupDelTempCardByCard;
}
// 进入通过输入卡号删除刷卡用户的界面
void EnterDelTempCardByNum(void)
{
SystemStatus.PreStatus = SystemStatus.Status;
SystemStatus.Status = Status_SetupDelTempCardByNum;
}
// 删除所有过期的卡号
void EnterDelTimeoutCard(void)
{
UINT i;
BYTE j;
BYTE temp;
bit bTemp;
// 显示提示消息
memcpy(&DispBuffer[1][1], "执行中,请稍候 ", DISP_BUF_LENGTH);
DispBuffer[1][0] = 0x01;
UpdateDisp(FALSE);
for (i=0; i<RFCardTabLength; )
{
if ((RFCardTabLength-i) > sizeof(I2CBuffer))
{
temp = sizeof(I2CBuffer);
}
else
{
temp = RFCardTabLength - i;
}
I2CReadString(0x00, RFCardTabStartAddr+i, I2CBuffer, temp);
for (j=0; j<temp; )
{
p_RFCardUser = (t_RFCardUser *)(&I2CBuffer[j]);
bTemp = FALSE;
if ((p_RFCardUser->CardNum[0] == 0)
&& (p_RFCardUser->CardNum[1] == 0)
&& (p_RFCardUser->CardNum[2] == 0)
&& (p_RFCardUser->CardNum[3] == 0))
{
}
else if (p_RFCardUser->EndTime.Year < Time.Year)
{
bTemp = TRUE;
}
else if (p_RFCardUser->EndTime.Year == Time.Year) // 判断卡是否过期
{
if (p_RFCardUser->EndTime.Month < Time.Month)
{
bTemp = TRUE;
}
else if (p_RFCardUser->EndTime.Month == Time.Month)
{
if (p_RFCardUser->EndTime.Date == Time.Date)
{
if (p_RFCardUser->EndTime.Date == Time.Date)
{
if (p_RFCardUser->EndTime.Hour < Time.Hour)
{
bTemp = TRUE;
}
}
else if (p_RFCardUser->EndTime.Date < Time.Date)
{
bTemp = TRUE;
}
}
else if (p_RFCardUser->EndTime.Month < Time.Month)
{
bTemp = TRUE;
}
}
}
RESET_WDT;
if (bTemp == TRUE) // 如果找到这张卡号,但是已经过期了,则删
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -