forked from SZV10X_Software/SZV103_FM33A0xxEV_SiZhu

wujiazhi
2024-06-11 65062d0d5b21f838aa0043a15ce54cfab8d72c43
Function/KEY/key.c
@@ -1,90 +1,319 @@
#include "key.h"
#include "gpio.h"
#include "multi_button.h"
#include "uart.h"
#include "valve_control.h"
#include "extern_rtc.h"
#include "e2p.h"
#include "power_manage.h"
#include "adc.h"
#include "master_slave_inter.h"
#include "ir_nec.h"
#include "lcd.h"
#include "main.h"
#include "system_run_fun.h"
#include "low_pwr_test.h"
#include "gprs.h"
#include "administrator.h"
#include "system_parameter.h"
#include "system_log.h"
#include "sundry.h"
#include "tim.h"
#include "working_time_calculate.h"
#include "gpio.h"
/******************************************************************************
 *   °´¼ü¸÷¹¦ÄÜ
 *-----------------------------------------------------------------------------
 *   ³¤°´B£ºÔ¶´«·¢ËÍ£¨Ð軽ÐÑÆÁÄ»£©
 *   µã°´C£ºÄ£Äâ»ñÈ¡¿ª¸ÇÊÚȨ
 *   µã°´A£º»½ÐÑÆÁÄ»/·­Ò³
 *   Ë«»÷A£º»ñÈ¡ÏÔʾ²ÎÊýÊÚȨ
 *   ³¤°´A£ºÌض¨Ìõ¼þÏÂÇл»Ä£Ê½£¨Õý³£/¼ì¶¨/²ÎÊý»ñÈ¡£©
 *    A + B£º¿ª/¹Ø·§
 *
 *****************************************************************************/
FlagStatus key_awaken_flag_g = RESET;
/*******************************************************************************
 * Function Name: Key_GPIO_Init
 * Parameters: none
 * Return: none
 * Description:
 ******************************************************************************/
void Key_GPIO_Init(void)
{
   InputtIO(KEY1_PORT,KEY1_PIN,IN_NORMAL);
   InputtIO(KEY2_PORT,KEY2_PIN,IN_NORMAL);
   InputtIO(KEY3_PORT,KEY3_PIN,IN_NORMAL);
//   InputtIO(KEY4_PORT,KEY4_PIN,IN_PULLUP);
}
struct Button btn_B;//ÉêÇë°´¼üB½á¹¹Ìå
struct Button btn_C;//ÉêÇë°´¼üC½á¹¹Ìå //Ô¤Áô
struct Button btn_A;//ÉêÇë°´¼üA½á¹¹Ìå
void Key_GPIO_Close(void)
struct Button btnA_B;//×éºÏ°´¼ü
void KEY_IO_Init(void)
{
   CloseIO(KEY2_PORT,KEY2_PIN);
   CloseIO(KEY3_PORT,KEY3_PIN);
//   InputtIO(KEY4_PORT,KEY4_PIN,IN_PULLUP);
   CMU_PERCLK_SetableEx(PADCLK, ENABLE);  //PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
   InputtIO( KEYA_S1_PORT, KEYA_S1_PIN, IN_PULLUP);//ÈôΪ°´¼üµÍÓÐЧ£¬Õý³£½ÓÉÏÀ­µç×裬±£³Ö¶Ï¿ª
   InputtIO( KEYB_S2_PORT, KEYB_S2_PIN, IN_PULLUP);//ÈôΪ°´¼üµÍÓÐЧ£¬Õý³£½ÓÉÏÀ­µç×裬±£³Ö¶Ï¿ª
   InputtIO( KEYC_S3_PORT, KEYC_S3_PIN, IN_PULLUP);
}
void keyPro(void)
//°´¼üB״̬¶ÁÈ¡½Ó¿Ú
uint8_t read_buttonB_GPIO(void)//B
{
   static uint8_t P_Key1Cnt=0,R_Key2Cnt=0,L_Key3Cnt=0;
   P_Key1Cnt = (KEY1_IO_READ==Bit_RESET)? P_Key1Cnt+1:0;
   R_Key2Cnt = (KEY2_IO_READ==Bit_RESET)? R_Key2Cnt+1:0;
   L_Key3Cnt = (KEY3_IO_READ==Bit_RESET)? L_Key3Cnt+1:0;
   return KEY_B_READ;
}
//°´¼üC״̬¶ÁÈ¡½Ó¿Ú
uint8_t read_buttonC_GPIO(void)//C
{
   return KEY_C_READ;
}
//°´¼üA״̬¶ÁÈ¡½Ó¿Ú
uint8_t read_buttonA_GPIO(void)//A
{
   return KEY_A_READ;
}
//×éºÏ°´¼ü״̬¶ÁÈ¡½Ó¿Ú
uint8_t read_buttonA_B_GPIO(void)
{
   return KEY_B_READ | KEY_A_READ;
}
//°´¼ü»Øµ÷
void button_callback(void *button)
{
   uint32_t btn_event_val;
   
   //Èç¹ûûÓм¤»î£¬Ôò°´¼ü2ºÍ3²»ÉúЧ
   if(__SYS_DELAY_SEC_TIME_GET_(sys_active_time) ==0){
      R_Key2Cnt = L_Key3Cnt = 0;
   }
   btn_event_val = get_button_event((struct Button *)button);
   
   if(R_Key2Cnt== 5)
   switch(btn_event_val)
   {
      //ÀýÈçÓÒ¼ü³¤°´5Ãë½øÈë²éѯģʽ
      R_Key2Cnt = 0;
      if(sys_display_para_g.sys_and_display_mode == NORMAL_MODE){
         sys_display_para_g.sys_and_display_mode = DISPLAY_PARA;
      }else if(sys_display_para_g.sys_and_display_mode == DISPLAY_PARA){
         sys_display_para_g.sys_and_display_mode = NORMAL_MODE;
      }else{
         sys_display_para_g.sys_and_display_mode = NORMAL_MODE;
      case PRESS_DOWN:
            printf("---> key12 press down! <---\r\n");
         break;
      case PRESS_UP:
            printf("***> key12 press up! <***\r\n");
         break;
      case PRESS_REPEAT:
            printf("---> key12 press repeat! <---\r\n");
         break;
      case SINGLE_CLICK:
            printf("---> key12 single click! <---\r\n");
         break;
      case DOUBLE_CLICK:
            printf("***> key12 double click! <***\r\n");
         break;
      case LONG_PRESS_START:
            printf("---> key12 long press start! <---\r\n");
         break;
      case LONG_PRESS_HOLD:
            printf("***> key12 long press hold! <***\r\n");
         break;
   }
}
//°´¼ü1/S1/B°´ÏÂʼþ»Øµ÷º¯Êý
//void BTN_B_PRESS_DOWN_Handler(void* btn)
//{
//   printf("---> key1/S1/B press down! <---\r\n");
//}
////°´¼ü1/S1/BËÉ¿ªÊ¼þ»Øµ÷º¯Êý
//void BTN_B_PRESS_UP_Handler(void* btn)
//{
//   printf("***> key1/S1/B press up! <***\r\n");
//}
//°´¼ü1/S1/Bµ¥»÷ʼþ»Øµ÷º¯Êý
//void BTN_B_SINGLE_Click_Handler(void* btn)//°´¼üB
//{
//   printf("***> key11/S1/B single click! <***\r\n");
//}
//°´¼ü1/S1/B³¤°´Ê¼þ»Øµ÷º¯Êý
void BTN_B_LONG_PRESS_START_Handler(void* btn)//°´¼üB
{
   if((KEY_B_READ || KEY_A_READ) == 0)
   {}
   else
   {
#ifdef RS232_PRINTF
      printf("***> Ô¶´«·¢ËÍ£¨Ð軽ÐÑÆÁÄ»£© <***\r\n");
#endif
      if(sys_display_para_g.sys_and_display_mode == SET_PARA_MODE)
         __LITH_BAT_WORKINGTIME_RECOVER__;
      else if(__SYS_DELAY_SEC_FLAG_GET(sys_active_time) != SET)
      {
         gprs_soft_para_g.gprs_send_type_flag = GPRS_MEANS_KEY;
         key_save_send_data_flag_g = SET;
      }
   }
   /**ÓÉÓÚĿǰKey2ºÍkey3ÓõÄPE14ºÍPE15Òý½ÅûÓÐÖжϣ¬ÔÝʱֻÄÜÂÖѯ²éѯ*/
   if(P_Key1Cnt ==0 && R_Key2Cnt >0 && L_Key3Cnt ==0) //µ¥»÷key2 ÓÒ¼ü
}
//°´¼üCµ¥»÷ʼþ»Øµ÷º¯Êý
void BTN_C_SINGLE_Click_Handler(void* btn)//Ô¤Áô°´¼üC
{
#ifdef RS232_PRINTF
   printf("***> »ñÈ¡¿ª¸ÇÊÚȨ <***\r\n");
#endif
   if(sys_some_flag_g.uncap_flag == RESET && sys_display_para_g.sys_and_display_mode != SET_PARA_MODE)
   {
      lcd_wake_up_flag_g = SET;
      if(__SYS_DELAY_SEC_TIME_GET_(sys_active_time) >0){ //¼¤»îºóÈÎÒâ°´¼üÖØÖü¤»îʱ¼ä
         __SYS_DELAY_SEC_TIME_SET_(sys_active_time,SYS_WAKE_UP_TIME);
      __SYS_DELAY_SEC_TIME_SET_(mode_flag_active_time,10);
      __SYS_PARA_FLAG_SET_(uncap_flag);
   }
}
////°´¼üC³¤°´Ê¼þ»Øµ÷º¯Êý
//void BTN_C_LONG_PRESS_START_Handler(void* btn)
//{
//}
//°´¼üAµ¥»÷ʼþ»Øµ÷º¯Êý
void BTN_A_SINGLE_Click_Handler(void* btn)//°´¼üA
{
   //¹ÒÆð°´¼üÖжÏ
   //»½ÐÑÐÝÃß/ÆÁĻʱ°´¼üΪÍⲿÖжϣ¬»½ÐѺó±äΪ¶¨Ê±Æ÷ÂÖѯ£¬Èç¹û²»Çå³ý°´¼üÖжϱêÖ¾£¬»áµ¼Ö¶à´Î°´¼üʱ£¬½áÊøÐÝÃßÔٴνøÈëÒ»´ÎÖжÏ
   GPIO_EXTI_EXTIISR_ClrEx(KEYA_S1_PORT, KEYA_S1_PIN);
#ifdef RS232_PRINTF
   printf("***> »½ÐÑÆÁÄ»/·­Ò³ <***\r\n");
#endif
   if(sys_display_para_g.sys_and_display_mode == NORMAL_MODE)
   {
      lcd_wake_up_flag_g = 1;
      if(__SYS_DELAY_SEC_TIME_GET_(sys_active_time) < SYS_WAKE_UP_TIME)
         __SYS_DELAY_SEC_TIME_SET_(sys_active_time,SYS_WAKE_UP_TIME);//ÉèÖû½ÐÑʱ¼äÃëÊý
      if(key_awaken_flag_g != SET)
      {
         if(++sys_display_para_g.display_page_status.normal_page_status > PRESS_SC_TOTAL)
            sys_display_para_g.display_page_status.normal_page_status = SC_INSTANT_TOTAL;
      }
      else
      {
         lcd_wake_up_flag_g = 0;
         key_awaken_flag_g = RESET;
      }
   }
   else if(sys_display_para_g.sys_and_display_mode == DISPLAY_PARA)
   {
      lcd_wake_up_flag_g = 1;
      if(__SYS_DELAY_SEC_TIME_GET_(sys_active_time) < DISPLAY_PARA_TIME)
         __SYS_DELAY_SEC_TIME_SET_(sys_active_time, DISPLAY_PARA_TIME); //½oDISPLAY_PARA_TIMEÃëµÄ»½ÐÑʱ¼ä
      if(++sys_display_para_g.display_page_status.para_page_status > SEC_CORR_OLD_PARA_5)
         sys_display_para_g.display_page_status.para_page_status = METER_NUM;
   }
}
//°´¼üAË«»÷ʼþ»Øµ÷º¯Êý
void BTN_A_DOUBLE_Click_Handler(void* btn)
{
   //¹ÒÆð°´¼üÖжÏ
   GPIO_EXTI_EXTIISR_ClrEx(KEYA_S1_PORT, KEYA_S1_PIN);
   
   if(P_Key1Cnt ==0 && R_Key2Cnt ==0 && L_Key3Cnt >0) //µ¥»÷key3 ×ó¼ü
#ifdef RS232_PRINTF
   printf("***> »ñÈ¡ÏÔʾ²ÎÊýÊÚȨ <***\r\n");
#endif
   if(sys_some_flag_g.para_display_flag == RESET && sys_display_para_g.sys_and_display_mode != SET_PARA_MODE)
   {
      lcd_wake_up_flag_g = SET;
      if(__SYS_DELAY_SEC_TIME_GET_(sys_active_time) >0){ //¼¤»îºóÈÎÒâ°´¼üÖØÖü¤»îʱ¼ä
            __SYS_DELAY_SEC_TIME_SET_(sys_active_time,SYS_WAKE_UP_TIME);
      }
   }else if(P_Key1Cnt ==0 && R_Key2Cnt >0 && L_Key3Cnt >0) //µ¥»÷key2 + key3
   {
      lcd_wake_up_flag_g = SET;
      if(__SYS_DELAY_SEC_TIME_GET_(sys_active_time) >0){ //¼¤»îºóÈÎÒâ°´¼üÖØÖü¤»îʱ¼ä
            __SYS_DELAY_SEC_TIME_SET_(sys_active_time,SYS_WAKE_UP_TIME);
      }
      //²É¼¯Á÷Á¿¼ÆÊý¾Ý²¢´¥·¢Éϱ¨
      start_rs485_g = RS485_START_REASON_KEY;
      start_wrc_g = WRC_MEANS_KEY;
      __SYS_DELAY_SEC_TIME_SET_(mode_flag_active_time,10);
      __SYS_PARA_FLAG_SET_(para_display_flag);
   }
}
//°´¼üA³¤°´Ê¼þ»Øµ÷º¯Êý
void BTN_A_LONG_PRESS_START_Handler(void* btn)
{
   //¹ÒÆð°´¼üÖжÏ
   GPIO_EXTI_EXTIISR_ClrEx(KEYA_S1_PORT, KEYA_S1_PIN);
   if((KEY_B_READ || KEY_A_READ) == 0)
   {}
   else
   {
#ifdef RS232_PRINTF
      printf("***> Çл»Ä£Ê½£¨Õý³£/¼ì¶¨/²ÎÊý»ñÈ¡£© <***\r\n");
#endif
      if(sys_display_para_g.sys_and_display_mode == NORMAL_MODE && sys_some_flag_g.uncap_flag == SET)
         sys_display_para_g.temp_sys_mode_flag = CNV_PARA_MODE_ENTER;
      else if(sys_display_para_g.sys_and_display_mode == NORMAL_MODE && sys_some_flag_g.para_display_flag == SET)
         sys_display_para_g.temp_sys_mode_flag = CNV_DISPLAY_MODE_ENTER;
      else if(sys_display_para_g.sys_and_display_mode == NORMAL_MODE &&  __SYS_STATUS_BYTES_GET(media_status) == AIR)
         sys_display_para_g.temp_sys_mode_flag = CNV_CAL_MODE_ENTER;
      else if(sys_display_para_g.sys_and_display_mode == SET_PARA_MODE)
         sys_display_para_g.temp_sys_mode_flag = CNV_PARA_MODE_EXIT;
      else if(sys_display_para_g.sys_and_display_mode == CALIB_MODE)
         sys_display_para_g.temp_sys_mode_flag = CNV_CAL_MODE_EXIT;
      else if(sys_display_para_g.sys_and_display_mode == DISPLAY_PARA)
         sys_display_para_g.temp_sys_mode_flag = CNV_DISPLAY_MODE_EXIT;
      else
         sys_mode_conversion_show_g = ERROR_1;
      sys_some_flag_g.uncap_flag = sys_some_flag_g.para_display_flag = RESET;
//      __SYS_PARA_FLAG_CLEAR_(uncap_flag);
//      __SYS_PARA_FLAG_CLEAR_(para_display_flag);
   }
}
void BTNA_B_LONG_PRESS_START_Handler(void* btn)
{
   //¹ÒÆð°´¼üÖжÏ
   GPIO_EXTI_EXTIISR_ClrEx(KEYA_S1_PORT, KEYA_S1_PIN);
#ifdef RS232_PRINTF
   printf("---> key1/S1/B + key2/S3/A long press start! <---\r\n");
#endif
   if(__SYS_STATUS_BYTES_GET(valve_state) == VALVE_OP)//·§Ä¿Ç°×´Ì¬ÊÇ¿ª
   {
      if(__SYS_STATUS_BYTES_GET(account_state) == 0)//먦»§
         sys_valve_ctl_id_g = V_KEY_CL;
      else
         sys_mode_conversion_show_g = ERROR_1;
   }
   else if(__SYS_STATUS_BYTES_GET(valve_state) == VALVE_CL)
   {
      if(__SYS_STATUS_BYTES_GET(valve_lock) == 0) //ÅжÏÊÇ·ñ½âËø
         pwr_vol_g.lith_flag  = LMS_OPEN_VALVE_BEFORE;//         sys_valve_ctl_id_g = V_KEY_OP;
      else
         sys_mode_conversion_show_g = ERROR_1;
   }
}
void CalMode_Exit_A_LongHandler(void)
{
   __IO static uint8_t cnt_long = 0;
   if(KEY_A_READ == 0)
   {
      // 9 * 0.25 = 2.25Ãë
      if((cnt_long++ >= 9) && (sys_display_para_g.sys_and_display_mode == CALIB_MODE))
      {
         //¹ÒÆð°´¼üÖжÏ
         GPIO_EXTI_EXTIISR_ClrEx(KEYA_S1_PORT, KEYA_S1_PIN);
         cnt_long = 0;
         sys_display_para_g.temp_sys_mode_flag = CNV_CAL_MODE_EXIT;
      }
   }else
      cnt_long = 0;
}
//°´¼ü¹¦Äܳõʼ»¯
void Key_Config_Init(void)
{
   //³õʼ»¯°´¼ü¶ÔÏó
   button_init(&btn_B, read_buttonB_GPIO, 0);
   button_init(&btn_C, read_buttonC_GPIO, 0);
   button_init(&btn_A, read_buttonA_GPIO, 0);
   button_init(&btnA_B, read_buttonA_B_GPIO, 0);
   //×¢²á°´¼üʼþ
//   button_attach(&btn1, PRESS_DOWN,       BTN1_PRESS_DOWN_Handler);//°´ÏÂ
//   button_attach(&btn1, PRESS_UP,         BTN1_PRESS_UP_Handler);//ËÉ¿ª
//   button_attach(&btn1, PRESS_REPEAT,     BTN1_PRESS_REPEAT_Handler);
//   button_attach(&btn1, SINGLE_CLICK,     BTN1_SINGLE_Click_Handler);
   
   button_attach(&btn_B, LONG_PRESS_START, BTN_B_LONG_PRESS_START_Handler);//³¤°´´¥·¢Ò»´Î
//   button_attach(&btn1, LONG_PRESS_HOLD,  BTN1_LONG_PRESS_HOLD_Handler);
   
   button_attach(&btn_C, SINGLE_CLICK,     BTN_C_SINGLE_Click_Handler);
//   button_attach(&btn2, LONG_PRESS_START, BTN2_LONG_PRESS_START_Handler);//³¤°´´¥·¢Ò»´Î
   
   button_attach(&btn_A, SINGLE_CLICK,     BTN_A_SINGLE_Click_Handler);
   button_attach(&btn_A, DOUBLE_CLICK,     BTN_A_DOUBLE_Click_Handler);//Ë«»÷
   button_attach(&btn_A, LONG_PRESS_START, BTN_A_LONG_PRESS_START_Handler);//³¤°´´¥·¢Ò»´Î
//   ×¢²á°´Å¥Ê¼þ»Øµ÷º¯Êý
   button_attach(&btnA_B, LONG_PRESS_START, BTNA_B_LONG_PRESS_START_Handler);
   //Æô¶¯°´¼ü
   button_start(&btn_B);
   button_start(&btn_C);
   button_start(&btn_A);
   button_start(&btnA_B);
}