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

📄 keyprocess.c

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