/* * 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; }