/*
 * File:   __GP22Gas_KEY_APP_C
 * Author:
 *
 * Created on：2015-5-18
 */

#ifdef __cplusplus
extern "C"
{
#endif
/*--------------------------------Including-------------------------------------------*/
#include "UWater_key_app.h"
#include "UWater_frame_app.h"
#include "UWater_timer1uS_driver.h"	
#include "UWater_valve_driver.h"
	
/*------------------------------ Variable Define -------------------------------------*/
static u8 s_g_key_sys_state; //按键应用状态机状态变量
static u8 g_menu_change_msg; //切菜单MSG;
static u8 g_key_res = 0;
static u8 s_key_iropen = 0;
static u8 s_old_tch_state;
u8 s_valve_close_key_cnt=0;
/*************************************************************************************
 * @fun_name:	void KeyMainMachineDriver(void)
 * @brief   :   按键模块应用层处理机；
 * @param[in] :	None
 * @param[out] :None
 * @retval     :    None
 * @other     : 处于MainSpace，处于main函数主循环中。
 *************************************************************************************/
void KeyMachineApp(void)
{
	switch (s_g_key_sys_state)
	{
		case KEY_SYS_S0:
		{
			g_key_res = KeyCheckMsg();
			switch (g_key_res)
			{
				case NO_EVENT:
				{
                    if(((FrameCheckParaApp(FramePara_FuncCfg0_3)>>24)&0xFF) != s_old_tch_state)
                    {
                       s_old_tch_state = FrameCheckParaApp(FramePara_FuncCfg0_3)>>24;
                       if(((FrameCheckParaApp(FramePara_FuncCfg0_3)>>24)&0xFF) == 0xAA)
                       {
                           FrameSetMsgApp(MsgTouchKeyReset);
                       }
                       else
                       {
                           Gpio_WriteOutputIO(TCH_KEY_POWER_GPIO, TCH_KEY_POWER_PIN, FALSE);//关闭按键开关
                       }
                    }
					if(FrameCheckMsgApp(MsgTouchKeyReset) &&(((FrameCheckParaApp(FramePara_FuncCfg0_3)>>24)&0xFF) == 0xAA))
					{
						FrameClearMsgApp(MsgTouchKeyReset);
						if(TchKey_GetPressLimitState() == 0)
						{
						    EnableNvic(TCH_KEY_IRQ, TCH_KEY_PRIORITY, FALSE);
							Gpio_WriteOutputIO(TCH_KEY_POWER_GPIO,TCH_KEY_POWER_PIN,FALSE); 
							Set100msTimer(TIMER_100MS_TOUCH_RESET,10);//1s
							s_g_key_sys_state = KEY_SYS_S1;
						}
						s_valve_close_key_cnt=0;//关阀状态特殊按键次数限制每小时清0
					}
					else
					{
						s_g_key_sys_state = KEY_SYS_S0;
					}
				}
					break;
				case SHORT_PRESS:
				{
					KeyClearMsg(1);
					g_key_res = 0;
					g_menu_change_msg |= MENU_TWO;
					s_key_iropen = TRUE;
					FrameSetMsgApp(Msg_FactoryBleActive);//厂区唤醒蓝牙 
					s_g_key_sys_state = KEY_SYS_S0;
				}
					break;
				case LONG_PRESS:
				{
					KeyClearMsg(2);
					g_key_res = 0;
					if (LcdCheckMeumApp() == ((((u16)A1) << 8) | A1B4) &&FrameCheckParaApp(FramePara_EnableTestFunc)) //在瞬时流量界面长按进入累计时间界面切换到检定
					{
						g_menu_change_msg = g_menu_change_msg | MENU_TEST;
						s_g_key_sys_state = KEY_SYS_S0;
					}
					else
					{
						#if MODULE_BLE_USED
						#else
							if (LcdCheckMeumApp() == ((((u16)A3) << 8) | A3B2))  // A3B1长按进入A3B2发起上报
							{
								g_menu_change_msg |= MENU_ACTIVE_RF;
							}
						#endif
						g_menu_change_msg |= MENU_ONE;
						s_g_key_sys_state = KEY_SYS_S0;
					}
				}
					break;
                case LONGLONG_PRESS:
				{
					KeyClearMsg(4);
					g_key_res = 0;
					#if defined(VALVE)
					//关阀状态减少应急开阀和上报的按键难度
					if((ValveGetState() == VALVE_STATE_CLOSE_EMERGENCY)||(ValveGetState() == VALVE_STATE_CLOSE))
					{
						if(s_valve_close_key_cnt<2)//每小时限制2次
						{
							FrameSetMsgApp(Msg_ValveOpenEmergency);//应急开阀消息
							g_menu_change_msg |= MENU_ACTIVE_RF;
							s_valve_close_key_cnt++;
						}
					}
					#endif
					s_g_key_sys_state = KEY_SYS_S0;
				}
				break;
				case ERR_PRESS:
				{
					KeyClearMsg(3);
					g_key_res = 0;
					g_menu_change_msg |= MENU_DEFAULT;
					s_g_key_sys_state = KEY_SYS_S0;
				}
				break;
			default:
				KeyClearMsg(1);
				KeyClearMsg(2);
				KeyClearMsg(3);
				KeyClearMsg(4);
				KeyClearMsg(5);
				KeyClearMsg(6);
				KeyClearMsg(7);
				KeyClearMsg(8);
				break;
			}
		}
		break;
		case KEY_SYS_S1:
		{
			if(TRUE ==Check100msTimer(TIMER_100MS_TOUCH_RESET))
			{
				Gpio_WriteOutputIO(TCH_KEY_POWER_GPIO,TCH_KEY_POWER_PIN,TRUE);
                EnableNvic(TCH_KEY_IRQ, TCH_KEY_PRIORITY, TRUE);
				s_g_key_sys_state = KEY_SYS_S0;
			}
		}
		break;
		default:
			break;
	}

}

/***********************应用层按键管理初始化***************************
Function:    void KeyInitApp(void)
Description:  应用层按键管理初始化；
Input: 	无；
Return: 无；
Others: 处于MainSpace，第一类接口：初始化接口。
 *****************************************************************/
void KeyInitApp(void)
{
	s_g_key_sys_state = KEY_SYS_S0; //按键应用状态机状态变量
	g_menu_change_msg = FALSE; //切菜单MSG，初始化为0;
	g_key_res = 0;
}

/***********************查询按键对LCD的MSG输出***************************

Function:   u8 KeyCheckLcdMsgApp(void)
Description:  查询按键对LCD的MSG输出；
Input:  无；
Return: bit0=1：切2级菜单MSG；bit1=1：切1级菜单MSG；bit2=1：切默认菜单；bit3=1：切检定状态菜单bit4=1：短按键开阀；bit5=1：按键使能无线进入活跃期MSG for GSM APP
Others: 处于MainSpace，第二类接口：工作接口。
 ****************************************************************/
u8 KeyCheckLcdMsgApp(u8 msg)
{
	return (g_menu_change_msg & msg);
}

/***********************清除按键对LCD的MSG输出***************************

Function:   	u8 KeyClearLcdMessageApp (u8)
Description:  清除按键对LCD的MSG输出；
Input:   清除MSG 0：切2级菜单MSG；1：切1级菜单MSG；2：切默认菜单；3：切检定状态菜单； 4：短按键开阀  5：按键使能无线进入活跃期MSG for GSM APP
Return:   TRUE：操作成功；FALSE：操作失败；
Others: 处于MainSpace，第二类接口：工作接口。
 ****************************************************************/
u8 KeyClearLcdMsgApp(u8 msg)
{
	g_menu_change_msg &= (~msg);
	return TRUE;
}

/***********************查询模块是否允许休眠*****************
Function:    u8 KeyIfSleepApp(void)
Description:  查询模块是否允许休眠；
Input:       无；
Return:     TRUE：允许休眠；     FALSE：不允许休眠。
Others:     处于MainSpace，第三类接口：休眠前接口。
 ****************************************************************/
u8 KeyIfSleepApp(void)
{
	if (s_g_key_sys_state == KEY_SYS_S0)
		return TRUE;
	else
		return FALSE;
}
/***********************设置按键唤醒红外消息***************************
Function:    void KeySetLcdMsgApp(u8 msg)
Description:  设置按键唤醒红外10S
Input: 	无
Return: 无;
Others:
 *****************************************************************/
void KeySetLcdMsgApp(u8 msg)
{
	g_menu_change_msg |= msg;
}

/***********************查询是否有按键唤醒红外10S***************************
Function:    void KeyCheckIrOpenMsg(void)
Description:  查询是否有按键唤醒红外10S
Input: 	无
Return: s_key_iropen;
Others: 
 *****************************************************************/
u8 KeyCheckIrOpenMsg(void)
{
    return s_key_iropen;
}

/***********************清楚按键唤醒红外通信10s标志***************************
Function:    void KeyClearIrOpenMsg(void)
Description:  清楚按键唤醒红外通信10s标志
Input: 无;
Return: 无;
Others: 
 *****************************************************************/
void KeyClearIrOpenMsg(void)
{
    s_key_iropen = FALSE;
}




