From 974181bcefe299fbed4c1dcd6d39be3e9f674c0e Mon Sep 17 00:00:00 2001
From: chen <15335560115@163.com>
Date: 星期五, 13 六月 2025 18:04:16 +0800
Subject: [PATCH] 成功增加sscom03shell配置指令功能,但是需要输入3次才能进入函数处理未解决

---
 keil/include/main/main.c |  382 ++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 325 insertions(+), 57 deletions(-)

diff --git a/keil/include/main/main.c b/keil/include/main/main.c
index c4205db..58edd5a 100644
--- a/keil/include/main/main.c
+++ b/keil/include/main/main.c
@@ -61,6 +61,8 @@
 #include "HIDO_ATLite.h"
 #include "HIDO_Timer.h"
 #include "TCPClient.h"
+#include "DBG.h"
+#include "Shell.h"
 
 //#define DEBUG_MODE
 extern int simple_main(void);
@@ -98,6 +100,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 +157,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 +165,9 @@
 						sys_reset(0);
             int_unlock(lock);
 }
+uint8_t control_close_flag;
+int16_t control_close_count;
+uint8_t close_state_flag;
 static void adc_callback(void *data, uint32_t number)
 {
     uint32_t *result = (uint32_t *)data;
@@ -183,16 +190,28 @@
             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;
+						close_state_flag=2;
+//						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 +223,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 +249,30 @@
 		}
 	}
 }
+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)
+	if(nomove_count>g_com_map[NOMOVESLEEP_TIME]&&g_com_map[IMU_ENABLE]==1&&active_flag)
 	{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;
+		close_state_flag=3;
 	}
 }
-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 +280,7 @@
         second_count = 0;
         MinuteTask();
     }
-		if(!power_low_flag)
+		if(!power_low_flag&&active_flag)
 		{Gps_change();
 		MotorPoll();
 		}else{
@@ -272,10 +290,35 @@
 		gps_need_data_flag=1;
 		gps_wait_count2=0;
 		gps_wait_count=0;
+		beepontime=0;
+		beep_start_flag=0;
 		}
-		
+		if(control_close_flag)
+		{
+			if(control_close_count++>=5)
+			{
+			gps_air780_power_change(0,0);//gps,4G关闭
+				
+
+				if(close_state_flag==4)
+				{active_flag=0;
+					TCP_reconnect_timer=0;//重置4G重连条件
+					flag_TCP_reconnectting = 1;
+				}else if(close_state_flag==3)
+				{
+				mcu_deep_sleep();
+				}
+				close_state_flag=0;
+			  control_close_flag=0;
+			  control_close_count=0;
+			}
+		}else{
+		control_close_count=0;
+		}
+//		HIDO_TimerTick();
+		LED_Task();
     //UWB状态检测
-if(!power_low_flag)//低供电下不需要检测重连
+if(!power_low_flag&&active_flag)//低供电下不需要检测重连
 	{
     if(IfTCPConnected())
     {
@@ -310,24 +353,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 +374,179 @@
 {
     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;
+		close_state_flag=4;
+		
+    //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;
+	}
+	nomove_count=0;
+}
+void  handle_single_click(void)
+{
+//beepontime=1;
+//beep_start_flag=1;
+motor_off();
+//		motor_on_and_off(&motor_power_state);
+//		motor_power_state=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();
+if(!power_low_flag&&active_flag)
+motor_on();
+}
+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;	
+		}
+		motor_off();
+		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");
@@ -384,12 +589,12 @@
 		}
     g_com_map[MODBUS_MODE] = 0;
 		log_4g_enable_flag=g_com_map[LOG_4G_ENABLE];
-    ip0 = (g_com_map[TCP_IP_0]>>12&0xf)*1000+(g_com_map[TCP_IP_0]>>8&0xf)*100+(g_com_map[TCP_IP_0]>>4&0xf)*10+(g_com_map[TCP_IP_0]&0xf);
-    ip1 = (g_com_map[TCP_IP_1]>>12&0xf)*1000+(g_com_map[TCP_IP_1]>>8&0xf)*100+(g_com_map[TCP_IP_1]>>4&0xf)*10+(g_com_map[TCP_IP_1]&0xf);
-    ip2 = (g_com_map[TCP_IP_2]>>12&0xf)*1000+(g_com_map[TCP_IP_2]>>8&0xf)*100+(g_com_map[TCP_IP_2]>>4&0xf)*10+(g_com_map[TCP_IP_2]&0xf);
-    ip3 = (g_com_map[TCP_IP_3]>>12&0xf)*1000+(g_com_map[TCP_IP_3]>>8&0xf)*100+(g_com_map[TCP_IP_3]>>4&0xf)*10+(g_com_map[TCP_IP_3]&0xf);
-    port = g_com_map[TCP_PORT];
-    g_com_map[VERSION] = (1<<8)|15;
+    ip0 = g_com_map[IP_0];
+    ip1 = g_com_map[IP_1];
+    ip2 = g_com_map[IP_2];
+    ip3 = g_com_map[IP_3];
+    port = g_com_map[PORT];
+    g_com_map[VERSION] = (1<<8)|20;
     LOG_INFO(TRACE_MODULE_APP,"设备ID: %x .\r\n",dev_id);
     LOG_INFO(TRACE_MODULE_APP,"固件版本:4G-GPS定位手环 V%d.%d. \r\n",g_com_map[VERSION]>>8,g_com_map[VERSION]&0xff);
     LOG_INFO(TRACE_MODULE_APP,"服务器地址: %d.%d.%d.%d:%d.\r\n",ip0,ip1,ip2,ip3,port);
@@ -412,6 +617,64 @@
             //UartInit();
         }
 
+				//检测到5V输入
+				     while(1)
+            {
+                nomove_count = 0;
+                wdt_ping(WDT_ID0);//喂狗
+			if(DBG_GetMode() == DBG_MODE_SHELL)
+			{
+			
+//					if(flag_secondtask)
+//					{
+//							flag_secondtask = 0;
+//							SecondTask();
+//					}
+      }
+			if(flag_TCP_reconnectting||IfTCPConnected())
+        {
+					  if(flag_4G_recdata==1)
+            {
+                flag_4G_recdata = 2;
+                Socket_RecvAll();
+            }
+            Internet_Poll();
+            HIDO_ATLitePoll();
+            HIDO_TimerPoll();
+            TCPClient_Poll();
+        }
+                UART_CheckReceive();
+									UserKeyTask();
+									IMUTask();
+                if(flag_secondtask)
+                {
+                    flag_secondtask = 0;
+                    SecondTask();
+                }
+                if(DBG_GetMode() == DBG_MODE_SHELL)
+                {
+                    if(g_com_map[CNT_RESTART]==1)
+                    {
+                        g_com_map[CNT_RESTART]=0;
+                        save_com_map_to_flash();
+                        NVIC_SystemReset();
+
+                    }
+                }
+                else
+                {
+									
+                }
+//                if(input5v_time)
+//                {
+                if(!gpio_pin_get_val(INPUT_5V_Pin))
+                {
+                break;
+                }
+								
+//                }
+            }
+						//NVIC_SystemReset();//重启
         //UART_CheckSend();
     } else {
         if(state5v==1)
@@ -480,7 +743,7 @@
         .callback = app_wdt_callback,
     };
 int main(void)
-{
+{		__enable_irq();
     board_clock_run();
     boot_deinit();
     board_pins_config();
@@ -516,6 +779,8 @@
 
     // TODO 4G
     Uart_Register(UART_ID_4G, UART_ID0);
+		Uart_Register(UART_ID_DBG_GPS, UART_ID1);
+    DBG_Init();
     Internet_Init();
     TCPClient_Init();
 
@@ -552,6 +817,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 +826,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 +856,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 +888,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