⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyprocess.c

📁 程序概述: 这是个具体产品程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	}
	// 初始化报警记录存储空间
	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 + -