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;