X2UWaterWmbusEEI/app/UWater_key_app.c

257 lines
7.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* File: __GP22Gas_KEY_APP_C
* Author:
*
* Created on2015-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级菜单MSGbit1=1切1级菜单MSGbit2=1切默认菜单bit3=1切检定状态菜单<E88F9C>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级菜单MSG1切1级菜单MSG2切默认菜单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;
}