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

📄 keyprocess.c

📁 程序概述: 这是个具体产品程序
💻 C
📖 第 1 页 / 共 5 页
字号:
				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 + -