From 38c1a38c08b6dfbc4632def361ddf8398a9f2107 Mon Sep 17 00:00:00 2001
From: chen <15335560115@163.com>
Date: 星期日, 20 四月 2025 18:38:09 +0800
Subject: [PATCH] 修改GPS4G灯充电灯闪灯逻辑,修改发送逻辑,处理4G立即关闭无法发送心跳包逻辑,完成3连击单击长按按钮逻辑,初步测试成功版本

---
 keil/include/main/main.c |  285 +++++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 235 insertions(+), 50 deletions(-)

diff --git a/keil/include/main/main.c b/keil/include/main/main.c
index c4205db..72d51b7 100644
--- a/keil/include/main/main.c
+++ b/keil/include/main/main.c
@@ -98,6 +98,8 @@
 uint8_t recev_error_num,send_messgae_count,send_flag,control_state,power_low_flag;
 uint8_t flag_4g_usart_rx_state = 1;  //4G 串口RX当前是 RX状态,不是GPIO状态
 int input_5v_flag,air780e_flag1,air780e_flag2,air780e_flag3,air780e_flag4;
+uint8_t active_flag=1;
+uint8_t TCP_reconnect_timer,flag_TCP_reconnectting = 1,flag_alam_state = 0,userkey_state;
 typedef enum
 {		UN_BIND=0,
         LINK_SUCCESS,
@@ -153,7 +155,7 @@
             trace_flush();
             lock = int_lock();
 						LOG_INFO(TRACE_MODULE_APP, "进入深度休眠\r\n");
-						gps_air780_power_change(0,0);//关闭gps,4G 
+//						gps_air780_power_change(0,0);//关闭gps,4G 
 							sleep_timer_stop();	
 						//adc_close();
             power_enter_power_down_mode(1);
@@ -161,6 +163,8 @@
 						sys_reset(0);
             int_unlock(lock);
 }
+uint8_t control_close_flag;
+int16_t control_close_count;
 static void adc_callback(void *data, uint32_t number)
 {
     uint32_t *result = (uint32_t *)data;
@@ -183,16 +187,27 @@
             bat_percent = ((fVoltage_mv - 3300) /8);
         }
     }
-				if(fVoltage_mv<3300)
+		if(active_flag)
+		{		if(fVoltage_mv<3300)
 				{
+					if(!power_low_flag)
+					{
+						userkey_state=2;
+					TCPHeartBeatUpload();//低电量休眠
+						control_close_flag=1;
+//						delay_ms(1000);//等待发送完成
+					}
 					power_low_flag=1;
-					gps_air780_power_change(gps_power_state,0);//gps原样,关闭4G 
-					LOG_INFO(TRACE_MODULE_APP, "电池电压低于3.3V,4G,GPS停止工作\r\n");
+					
+					LOG_INFO(TRACE_MODULE_APP, "激活状态,电池电压低于3.3V,4G,GPS停止工作\r\n");
 				}else{
 					power_low_flag=0;
 					gps_air780_power_change(gps_power_state,1);//gps原样,开启4G
-					LOG_INFO(TRACE_MODULE_APP, "电池电压正常,4G,GPS,正常工作\r\n");
+					LOG_INFO(TRACE_MODULE_APP, "激活状态,电池电压正常,4G,GPS,正常工作\r\n");
 				}
+		}else{
+		LOG_INFO(TRACE_MODULE_APP, "未激活状态,电池电量%02u%%,4G,GPS,停止工作\r\n",bat_percent);
+		}
 		gpio_pin_set(ADC_GND_ENABLE);//在拉高
   //  LOG_INFO(TRACE_MODULE_APP, "The voltage is %%%d \r\n",bat_percent);
 }
@@ -204,12 +219,19 @@
 //uart_receive(UART_ID1,m_EUART_DMA_RXBuf,EUART_RX_BUF_SIZE,uart_receive_callback);
 //}
 extern uint8_t gps_uwb_flag,gps_need_data_flag;
-uint8_t TCP_reconnect_timer,flag_TCP_reconnectting = 1,flag_alam_state = 0,userkey_state;
+
 uint8_t gps_enable_flag,motor_open_air_flag,moter_open_uwb_flag,flag_fenli_alarm = 0,fenli_alarm_count,delaysleep_count,enbale_blink_flag;
 int need_open_gps_count;
-uint32_t keystarttime,keystarttime2;
+uint32_t keystarttime,keystarttime2,keystarttime3;
 extern int16_t beepontime;
 extern uint8_t beep_start_flag;
+typedef enum {
+		KEY_IDLE,
+		KEY_CLICK_ONCE,
+    KEY_CLICK_DOUBLE,
+    KEY_CLICK_TRIPLE
+} KEY_Click_State;
+KEY_Click_State key_click_state=KEY_IDLE;
 void MotorPoll(void)
 {
 	if(beep_start_flag)
@@ -223,38 +245,29 @@
 		}
 	}
 }
+extern int16_t beepontime;
+extern uint8_t beep_start_flag;
+
+
 void IMUTask(void)
 {
 	if(nomove_count>g_com_map[NOMOVESLEEP_TIME]&&g_com_map[IMU_ENABLE]==1)
 	{power_wakeup_enable((enum POWER_WAKEUP_SOURCE_T)ACCLERATE_DETECT_Pin, POWER_WAKEUP_LEVEL_HIGH);
-		mcu_deep_sleep();
+		userkey_state=3;
+		if(control_close_flag==0)
+			TCPHeartBeatUpload();//静止休眠
+			//		delay_ms(1000);
+		control_close_flag=1;
 	}
 }
-void UserKeyTask(void)
- {
-     if(!GET_USERKEY)
-     {
-        if(HIDO_TimerGetTick() - keystarttime>3)
-        {
-            userkey_state = 1;
-            keystarttime =  HIDO_TimerGetTick();
-						UDPClient_UploadGPS();
-        }
-        if(HIDO_TimerGetTick() - keystarttime2>10)
-        {
-            g_com_map[CNT_RESTART] = 1;
-        }
-     }else
-     {
-       keystarttime =  HIDO_TimerGetTick(); 
-       keystarttime2 =  HIDO_TimerGetTick(); 
-     }
- } 
+
 void MinuteTask(void)
 {		gpio_pin_clr(ADC_GND_ENABLE);//拉低
     adc_get(&sample[0], NUM_SAMPLES, adc_callback);//adc采样
+	
 }
 uint8_t link_error_time;
+
 void SecondTask(void)
 {static uint8_t second_count;
     if(second_count++>60)
@@ -262,7 +275,7 @@
         second_count = 0;
         MinuteTask();
     }
-		if(!power_low_flag)
+		if(!power_low_flag&&active_flag)
 		{Gps_change();
 		MotorPoll();
 		}else{
@@ -273,9 +286,27 @@
 		gps_wait_count2=0;
 		gps_wait_count=0;
 		}
-		
+		if(control_close_flag)
+		{
+			if(control_close_count++>=5)
+			{
+			gps_air780_power_change(0,0);//gps,4G关闭
+				
+			control_close_flag=0;
+			control_close_count=0;
+				if(userkey_state==4)
+				active_flag=0;
+				else if(userkey_state==3)
+				{
+				mcu_deep_sleep();
+				}
+			}
+		}else{
+		control_close_count=0;
+		}
+		LED_Task();
     //UWB状态检测
-if(!power_low_flag)//低供电下不需要检测重连
+if(!power_low_flag&&active_flag)//低供电下不需要检测重连
 	{
     if(IfTCPConnected())
     {
@@ -310,24 +341,14 @@
 static void sleep_timer_callback(void *dev, uint32_t time)
 {
     IO_control_init();
-		if(enbale_blink_flag)
-	{
-	green_charge_state=0;
-	charge_red_on();
-	}
-	charge_state_change();//充电状态判断
+		
 if(secondtask_count++%2==0)
     {
         flag_secondtask = 1;
     }else{
         flag_secondtask = 0;
     }
-		if(enbale_blink_flag)
-	{
-		delay_us(5000);
-	green_charge_state=0;
-	charge_red_off();
-	}		
+		
  if(delaysleep_count>0)
      delaysleep_count--;
     //GPS工作逻辑
@@ -341,7 +362,168 @@
 {
     nomove_count=0;
 }
+uint32_t current_time,first_press_time,press_duration,press_start_time,click_count,single_click_timer,rising_time,falling_time,temp_rising_time;
+uint8_t long_press_flag,triple_click_flag,single_click_pending,single_click_flag;
+void air_send_Task(void);
+void handle_long_press(void)
+{
+	userkey_state = 1;
+//	keystarttime =  HIDO_TimerGetTick();
+	TCPHeartBeatUpload();//立即上传心跳包
+}
+
+void handle_triple_click(void)
+{
+	if(active_flag)
+	{	userkey_state=4;
+		TCPHeartBeatUpload();//立即上传心跳包
+		control_close_flag=1;
+    //air_send_Task();
+//		gps_air780_power_change(0,0);//gps,4G关闭
+//		active_flag=0;
+	}else{
+	gps_air780_power_change(1,1);//gps,4G关闭
+		active_flag=1;
+	}
+}
+void  handle_single_click(void)
+{
+beepontime=1;
+beep_start_flag=1;
+}
+
+// 时间阈值定义
+#define LONG_PRESS_TIME   2    // 长按3秒阈值(单位:ms)
+#define TRIPLE_CLICK_TIME 2    // 三连击总时间窗口
+#define CLICK_TIMEOUT     1     // 单击确认超时
+#define NEXT_CLICK_WAIT_TIMEOUT     1      // 按键下次单击等待时间
+
+// 按键状态机
+typedef enum {
+    IDLE,           // 空闲状态
+    WAIT_NEXT_RISING,        // 已按下待确认
+    WAIT_NEXT_FALLING    // 等待释放状态
+} ButtonState;
+
+volatile ButtonState sos_state = IDLE,temp_state;
+
+static void sos_fall_handler(enum IO_PIN_T pin)
+{
+sos_state=WAIT_NEXT_RISING;
+falling_time=HIDO_TimerGetTick();
+}
+void click_Task(void)
+{
+// 事件处理(按优先级顺序)
+    if (long_press_flag) {
+        handle_long_press();
+        long_press_flag = 0;
+    } else if (triple_click_flag) {
+        handle_triple_click();
+        triple_click_flag = 0;
+    } else if (single_click_flag) {
+        handle_single_click();
+        single_click_flag = 0;
+    }		
+}
 uint8_t flag_4G_recdata;
+void air_send_Task(void)
+{
+if(flag_TCP_reconnectting||IfTCPConnected())
+        {
+//					if(flag_TCP_reconnectting)
+//					{
+//					link_error_time++;
+//					}//后加的
+        //    LOG_INFO(TRACE_MODULE_APP, "处理4G任务\r\n");
+           
+//            if(flag_4guart_needinit)
+//            {
+//                flag_4guart_needinit = 0;
+//                AIR780EUartInit();
+//            }//yuan
+					  if(flag_4G_recdata==1)
+            {
+                flag_4G_recdata = 2;
+               
+                //LOG_INFO(TRACE_MODULE_APP, "运行Socket_RecvAll tt2 %d\r\n",tt2);
+                Socket_RecvAll();
+            }
+//						air780_led_on();
+            Internet_Poll();
+            HIDO_ATLitePoll();
+            HIDO_TimerPoll();
+            TCPClient_Poll();
+//            air780_led_off();
+        }
+}
+void UserKeyState_change(void)
+{
+if(sos_state==WAIT_NEXT_RISING)
+{
+	if(GET_USERKEY)
+	{
+	rising_time=HIDO_TimerGetTick();
+		if(rising_time-falling_time<=NEXT_CLICK_WAIT_TIMEOUT)
+		{
+		click_count++;
+		sos_state=WAIT_NEXT_FALLING;
+		if(click_count==3)
+		{
+		click_count=0;
+		sos_state=IDLE;
+		triple_click_flag=1;
+		}
+		long_press_flag=0;
+		}else if(rising_time-falling_time>LONG_PRESS_TIME&&click_count==0)
+		{
+		click_count=0;
+		long_press_flag=1;
+		sos_state=IDLE;	
+		}else{
+		click_count=0;
+		sos_state=IDLE;	
+		}
+		temp_rising_time=rising_time;
+	}
+}else if(sos_state==WAIT_NEXT_FALLING)
+	{
+		if(HIDO_TimerGetTick()-temp_rising_time>NEXT_CLICK_WAIT_TIMEOUT)
+		{
+
+			if(click_count==1)
+			{
+			single_click_flag=1;
+			}
+			click_count=0;
+			sos_state=IDLE;
+		}
+	}
+}
+void UserKeyTask(void)
+ {
+//     if(!GET_USERKEY)
+//     {
+//        if(HIDO_TimerGetTick() - keystarttime>3)
+//        {
+//            userkey_state = 1;
+//            keystarttime =  HIDO_TimerGetTick();
+//						UDPClient_UploadGPS();
+//        }
+//        if(HIDO_TimerGetTick() - keystarttime2>10)
+//        {
+//            g_com_map[CNT_RESTART] = 1;
+//        }
+//     }else
+//     {
+//       keystarttime =  HIDO_TimerGetTick(); 
+//       keystarttime2 =  HIDO_TimerGetTick(); 
+//     }
+UserKeyState_change();
+click_Task();
+
+ }
+
 void _4gUsart_handler(enum IO_PIN_T pin)
 {
      //LOG_INFO(TRACE_MODULE_APP, "4G RX 唤醒\r\n");
@@ -480,7 +662,7 @@
         .callback = app_wdt_callback,
     };
 int main(void)
-{
+{		__enable_irq();
     board_clock_run();
     boot_deinit();
     board_pins_config();
@@ -552,6 +734,8 @@
  //   board_5V_input_init(voltage_input_handler);
 		 adc_get(&sample[0], NUM_SAMPLES, adc_callback);//adc采样
     board_acceleration_detection_init(move_handler);
+		board_SOS_fall_detection_init(sos_fall_handler);
+//		board_SOS_rise_detection_init(sos_rise_handler);
 //		 LOG_INFO(TRACE_MODULE_APP, "测试进入app");
 		board_4GUsart_detection_init(_4gUsart_handler);
 		
@@ -559,7 +743,7 @@
     { 
 			test4=gpio_pin_get_val(SCL_PIN);
 			wdt_ping(WDT_ID0);//喂狗
-			if(!power_low_flag)//确认是否休眠下才开启功能
+			if(!power_low_flag&&active_flag)//确认是否休眠下才开启功能
 			{
         if(flag_TCP_reconnectting||IfTCPConnected())
         {
@@ -589,15 +773,16 @@
 //            air780_led_off();
         }
 		}
-        if(flag_secondtask)
+
+				UserKeyTask();
+				IMUTask();
+        IdleTask();
+		        if(flag_secondtask)
         {
             flag_secondtask = 0;
             SecondTask();
 				//	time_count++;
         }
-				UserKeyTask();
-				IMUTask();
-        IdleTask();
 #ifndef DEBUG_MODE
 //if(flag_sleeptimer)
 //        if(!gps_need_data_flag&&!gpio_pin_get_val(INPUT_5V_Pin)&&((IfTCPConnected()&&Socket_IsSendQueueEmpty(0))||!flag_TCP_reconnectting&&!IfTCPConnected())) //进入休眠条件(与关系,全满足才进):1.没有5V输入 2 TCP已连接时发送队列为空||TCP无连接时不在重连状态。
@@ -620,7 +805,7 @@
 //        }//yuan
 
 				if(delaysleep_count==0)
-        if(!gps_power_state&&!gpio_pin_get_val(INPUT_5V_Pin)&&((IfTCPConnected()&&AIR780E_IsIPIdle()&&Socket_IsSendQueueEmpty(0))||((!flag_TCP_reconnectting)&&!IfTCPConnected())||power_low_flag)) 
+        if(!gps_power_state&&!gpio_pin_get_val(INPUT_5V_Pin)&&((IfTCPConnected()&&AIR780E_IsIPIdle()&&Socket_IsSendQueueEmpty(0))||((!flag_TCP_reconnectting)&&!IfTCPConnected())||power_low_flag||!active_flag)) 
         {
 //					test1=gpio_pin_get_val(_4G_USART_RX_Pin);
             uint32_t lock;

--
Gitblit v1.9.3