chen
4 天以前 8aa343c68337975234072baae5eda592487c4271
keil/include/main/main.c
@@ -62,7 +62,7 @@
#include "HIDO_Timer.h"
#include "TCPClient.h"
//#define DEBUG_MODE
#define DEBUG_MODE
extern int simple_main(void);
extern int temp_main(void);
#define TEST_UART_POLL_MODE 0
@@ -87,7 +87,7 @@
uint8_t group_id;
uint16_t tag_frequency;
uint16_t disoffset;
uint16_t warning_distance,prewarning_distance;
int16_t fVoltage_mv,first_search_flag;
uint8_t bat_percent,g_start_send_flag=1;
uint8_t link_success_flag,motor_count;
@@ -106,8 +106,8 @@
        SEARCH_DEV,
} Operation_step;
Operation_step UWB_work_state;
void UWB_LED_Task(void);
void POWER_LED_Task(void);
Commend_SendDate send_struct;
struct ADC_CFG_T usr_adc_cfg = {
    .mode = ADC_MODE_CONTINUE,    /* Selected single conversion mode  */
@@ -145,10 +145,50 @@
    .int_tx = false,
#endif
};
struct UART_CFG_T test_uart_cfg_uart0 =
{
    .parity = UART_PARITY_NONE,
    .stop = UART_STOP_BITS_1,
    .data = UART_DATA_BITS_8,
    .flow = UART_FLOW_CONTROL_NONE,
    .rx_level = UART_RXFIFO_CHAR_1,
    .tx_level = UART_TXFIFO_EMPTY,
    .baud = BAUD_9600,
#if (TEST_UART_MODE == TEST_UART_POLL_MODE)
    .dma_en = false,
    .int_rx = false,
    .int_tx = false,
#elif (TEST_UART_MODE == TEST_UART_INTERUPT_MODE)
    .dma_en = false,
    .int_rx = true,
    .int_tx = true,
#elif (TEST_UART_MODE == TEST_UART_DMA_MODE)
    .dma_en = true,
    .int_rx = false,
    .int_tx = false,
#endif
};
static void app_wdt_callback(void *dev, uint32_t status)
{
    ASSERT(status, "WDT TIMEOUT,程序复位");
      //LOG_INFO(TRACE_MODULE_APP, "程序卡死,看门狗复位");
}
 struct WDT_CFG_T app_wdt_cfg = {
        .timeout = 32768 * 30,
        .rst_en = true,
        .int_en = true,
        .callback = app_wdt_callback,
    };
int tt1,tt2;
void uart_receive_callback(void *dev, uint32_t err_code)
{
    uart_receive(UART_ID1,m_EUART_DMA_RXBuf,EUART_RX_BUF_SIZE,uart_receive_callback);
}
void uart0_receive_callback(void *dev, uint32_t err_code)
{
    uart_receive(UART_ID0,m_EUART0_DMA_RXBuf,EUART_RX_BUF_SIZE,uart0_receive_callback);
}
void mcu_deep_sleep(void)
{
@@ -191,11 +231,11 @@
            {
               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马达停止工作\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, "电池电压正常,马达正常工作\r\n");
            }
      //tt2=gpio_pin_get_val(ADC_GND_ENABLE);
  //  LOG_INFO(TRACE_MODULE_APP, "The voltage is %%%d \r\n",bat_percent);
@@ -216,54 +256,20 @@
int need_open_gps_count;
uint8_t change_vibration=2;
HIDO_UINT32 u32CurTick_Motor;
void UserKeyState_change(void);
void click_Task(void);
void MotorPoll(void)
{
   if(!power_low_flag)//确认是否休眠下才开启功能
   { //马达震动逻辑
    if(g_com_map[MOTOR_ENABLE])
    {
        if(motor_open_air_flag||moter_open_uwb_flag)
        {motor_power_state=0;
               if(motor_open_flag)
               {
                  if (motor_count>=change_vibration)
                   {
                     change_vibration=VIBRATION_TIME;
                     motor_power_state = 1;
                     motor_count=0;
                     motor_open_flag=0;
                     update_led_power_state();
                   }
                   motor_count++;
               }else {//修改
                        motor_power_state = 1;
                      if(motor_count>=NO_VIBRATION_TIME)
                      {
                        motor_power_state = 0;
                        motor_count=0;
                        motor_open_flag=1;
                     update_led_power_state();
                   }
                      motor_count++;
                }
        } else {
                  motor_open_flag=1;
                  motor_count=0;
            motor_power_state=1;
        }
    }else{
            motor_open_flag=1;
            motor_count=0;
        motor_power_state=1;
    }
   if(change_by_distance()&&active_flag)
   {
         if(motor_count++%2==0)
         motor_power_state=0;//开启
         else{
         motor_power_state=1;//关闭
         }
   }else{
   motor_open_flag=1;
   motor_count=0;
  motor_power_state=1;
   motor_power_state=1;//关闭
   }
}
void MotorPollCheck(void)
@@ -396,23 +402,25 @@
}
void UserKeyTask(void)
 {
     if(!GET_USERKEY)
     {
        if(HIDO_TimerGetTick() - keystarttime>3)
        {
            userkey_state = 1;
            keystarttime =  HIDO_TimerGetTick();
                  TCPHeartBeatUpload();//立即上传该包
        }
        if(HIDO_TimerGetTick() - keystarttime2>10)
        {
            g_com_map[CNT_RESTART] = 1;
        }
     }else
     {
       keystarttime =  HIDO_TimerGetTick();
       keystarttime2 =  HIDO_TimerGetTick();
     }
//     if(!GET_USERKEY)
//     {
//        if(HIDO_TimerGetTick() - keystarttime>3)
//        {
//            userkey_state = 1;
//            keystarttime =  HIDO_TimerGetTick();
//                  //TCPHeartBeatUpload();//立即上传该包
//        }
//        if(HIDO_TimerGetTick() - keystarttime2>10)
//        {
//            //g_com_map[CNT_RESTART] = 1;
//        }
//     }else
//     {
//       keystarttime =  HIDO_TimerGetTick();
//       keystarttime2 =  HIDO_TimerGetTick();
//     }
UserKeyState_change();
click_Task();
 } 
void MinuteTask(void)
{      gpio_pin_clr(ADC_GND_ENABLE);//先拉低
@@ -427,38 +435,41 @@
    }
    //UWB更新列表
    TagListUpdate();
      if(!power_low_flag)
      {
    GPS_Poll();
      }else{
      gps_power_state=0;//关闭GPS
      update_led_power_state();
      //初始化GPS计数数据
      gps_need_data_flag=1;
      gps_wait_count=0;
      gps_timeout_flag=0;
      }
      POWER_LED_Task();
      UWB_LED_Task();
//      if(!power_low_flag)
//      {
//    GPS_Poll();
//         //gps_power_state=1;//常开GPS
//      }else{
//      gps_power_state=0;//关闭GPS
//      update_led_power_state();
//      //初始化GPS计数数据
//      gps_need_data_flag=1;
//      gps_wait_count=0;
//      gps_timeout_flag=0;
//      }
      //gps_power_state=1;//测试gps长开
    //UWB状态检测
if(!power_low_flag)//低供电下不需要检测重连
{
    if(IfTCPConnected())
    {
        TCP_reconnect_timer =0;
        flag_TCP_reconnectting = 0;
    } else {
        if(TCP_reconnect_timer<30)//如果TCP没有连接,每隔10分钟尝试连接30秒
        {
            flag_TCP_reconnectting = 1;
        } else {
            flag_TCP_reconnectting = 0;
        }
        if(TCP_reconnect_timer++>600)
        {
            TCP_reconnect_timer = 0;
        }
   {
//    if(IfTCPConnected())
//    {
//        TCP_reconnect_timer =0;
//        flag_TCP_reconnectting = 0;
//    } else {
//        if(TCP_reconnect_timer<30)//如果TCP没有连接,每隔10分钟尝试连接30秒
//        {
//            flag_TCP_reconnectting = 1;
//        } else {
//            flag_TCP_reconnectting = 0;
//        }
//        if(TCP_reconnect_timer++>600)
//        {
//            TCP_reconnect_timer = 0;
//        }
    }
//    }
   }
    HIDO_TimerTick();
      if(nomove_count<=g_com_map[NOMOVESLEEP_TIME])//防止溢出
@@ -471,23 +482,34 @@
uint8_t flag_sleeptimer,flag_secondtask,secondtask_count,log_4g_enable_flag;
uint8_t uwb_enable_flag=0;
uint8_t enable_system_function_flag;
static void sleep_timer_callback(void *dev, uint32_t time)
void POWER_LED_Task(void)
{
   // IO_control_init();
   if(enbale_blink_flag)
if(enbale_blink_flag)
   {
   green_charge_state=0;
   charge_red_on();
   }
   if(tt)
    UWBPoll();
   //车载poll
      UWB_Tag_Poll();
    StatusChange();
   charge_state_change();//充电状态判断
   if(enbale_blink_flag)
   {
   delay_us(5000);
   green_charge_state=0;
   charge_red_off();
   }
}
extern uint8_t taglist_num;
void UWB_LED_Task(void)
{
   if(taglist_num!=0&&active_flag)
   {
      blink_led(&uwb_state);
   }else{
   uwb_led_off();
   }
}
static void sleep_timer_callback(void *dev, uint32_t time)
{
    IO_control_init();
      
      MotorPoll();
      update_led_power_state();
@@ -500,21 +522,113 @@
    flag_sleeptimer = 1;
      charge_state_change();//充电状态判断
      if(enbale_blink_flag)
   {
   green_charge_state=0;
   charge_red_off();
   }
 if(delaysleep_count>0)
        delaysleep_count--;
    //GPS工作逻辑
}
// 时间阈值定义
#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 voltage_input_handler(enum IO_PIN_T pin)
{
}
uint8_t long_press_flag,double_click_flag,single_click_flag;
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 active_flag=1;
void handle_long_press(void)
{
}
void handle_doouble_click(void)
{
   if(active_flag==1)
   {
   active_flag=0;
   }else{
   active_flag=1;
   }
}
void  handle_single_click(void)
{
}
void click_Task(void)
{
// 事件处理(按优先级顺序)
    if (long_press_flag) {
        handle_long_press();
        long_press_flag = 0;
    } else if (double_click_flag) {
        handle_doouble_click();
        double_click_flag = 0;
    } else if (single_click_flag) {
        handle_single_click();
        single_click_flag = 0;
    }
}
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)
}
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==2)
      {
      click_count=0;
      sos_state=IDLE;
      double_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;
      }
   }
}
static void move_handler(enum IO_PIN_T pin)
{
@@ -562,6 +676,7 @@
void Program_Init(void)
{
    Usart1ParseDataCallback = UsartParseDataHandler;//需改为默认为gps处理,UsartParseDataHandler为升级处理当调试时候改为
      Usart0ParseDataCallback=Usart0ParseDataHandler;
    parameter_init_anchor();//g_com_map表初始化角色默认为基站
    dev_id=g_com_map[DEV_ID];//这里不太对
    group_id=g_com_map[GROUP_ID];//组ID
@@ -569,12 +684,12 @@
    memcpy(&disoffset,&g_com_map[DIST_OFFSET],2);
//    g_com_map[ALARM_DISTANCE1] = 40;
//    g_com_map[ALARM_DISTANCE2] = 40;
    warning_distance=g_com_map[ALARM_DISTANCE1];
    prewarning_distance=g_com_map[ALARM_DISTANCE2];
    send_struct.warnDistence=warning_distance;
    send_struct.alarmDistence=prewarning_distance;//更新报警距离
    memcpy(&send_struct.gunLableId,&g_com_map[BIND_DEV_ID],2);//更新绑定ID
    send_struct.tagId=dev_id;//更新设备ID
//    warning_distance=g_com_map[ALARM_DISTANCE1];
//    prewarning_distance=g_com_map[ALARM_DISTANCE2];
//    send_struct.warnDistence=warning_distance;
//    send_struct.alarmDistence=prewarning_distance;//更新报警距离
//    memcpy(&send_struct.gunLableId,&g_com_map[BIND_DEV_ID],2);//更新绑定ID
//    send_struct.tagId=dev_id;//更新设备ID
    if(g_com_map[BIND_DEV_ID]==0)
    {
@@ -586,17 +701,19 @@
//        g_com_map[SEND_4G_SECOND]=60;
      if(g_com_map[SEND_4G_MINUTE]<1)
         g_com_map[SEND_4G_MINUTE]=1;
      air780e_send_second=g_com_map[SEND_4G_MINUTE]*60;
    g_com_map[MODBUS_MODE] = 0;
      //air780e_send_second=g_com_map[SEND_4G_MINUTE]*60;//yuan
    air780e_send_second=g_com_map[SEND_4G_MINUTE];
      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)|12;
    g_com_map[VERSION] = (1<<8)|0;
    LOG_INFO(TRACE_MODULE_APP,"设备ID: %x .\r\n",dev_id);
    LOG_INFO(TRACE_MODULE_APP,"固件版本:UWB-4G车载手环 V%d.%d. \r\n",g_com_map[VERSION]>>8,g_com_map[VERSION]&0xff);
    LOG_INFO(TRACE_MODULE_APP,"固件版本:UWB-4G防丢手环 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);
}
@@ -630,6 +747,7 @@
            //UartDeinit();
        }
    }
      UART0_CheckReceive();
      UART_CheckReceive();
}
int bind_check(void)
@@ -670,8 +788,9 @@
int test1,test3;
uint32_t test4;
int16_t Voltage_input;
extern uint8_t uwb_rx_flag;
int main(void)
{
 {
    board_clock_run();
    boot_deinit();
    board_pins_config();
@@ -699,18 +818,21 @@
    // Disable watchdog timer
    wdt_close(WDT_ID0);
      wdt_open(WDT_ID0,&app_wdt_cfg);//30s最大上限检测喂狗
    LOG_INFO(TRACE_MODULE_APP, "UWB simple example\r\n");
    // open system timer
    //sys_timer_open();
    // TODO 4G
    Uart_Register(UART_ID_4G, UART_ID0);
    Internet_Init();
    TCPClient_Init();
//    // TODO 4G
//    Uart_Register(UART_ID_4G, UART_ID0);
//    Internet_Init();
    //TCPClient_Init();
    gpio_open();
      board_output_init();
      //uart_open(UART_ID0, &test_uart_cfg_uart0);
    //board_led_init();
      //检测通过后改为正常adc采集模式
    adc_open(&usr_adc_cfg);
@@ -719,7 +841,7 @@
    Accelerometer_Init();
    IO_control_init();
  
    gps_air780_power_change(0,1);//开启gps,4G
    gps_air780_power_change(0,0);//开启gps,4G
      //加速度计初始化必须在IO_control_init之前因为复用SDA引脚
         Program_Init();
    //uart_open(UART_ID1, &test_uart_cfg);
@@ -727,7 +849,7 @@
   // uart1_change_from_gps_to_debug();   
    //Uart1GpsRecDebugSend();   
    uart_receive(UART_ID1,m_EUART_DMA_RXBuf,EUART_RX_BUF_SIZE,uart_receive_callback);
      uart_receive(UART_ID0,m_EUART0_DMA_RXBuf,EUART_RX_BUF_SIZE,uart0_receive_callback);
// Initialize low power mode
    power_init();
      //AIR780E_Reset(); //4G模块重启,耗时1.5秒,这个是无法同步的关键
@@ -738,36 +860,31 @@
      gpio_pin_clr(ADC_GND_ENABLE);//先拉低
      adc_get(&sample[0], NUM_SAMPLES, adc_callback);//adc采样
      board_acceleration_detection_init(move_handler);
      board_SOS_fall_detection_init(sos_fall_handler);
      Uwb_init();
      OpenUWB();
//       LOG_INFO(TRACE_MODULE_APP, "测试进入app");
      board_4GUsart_detection_init(_4gUsart_handler);
      //board_4GUsart_detection_init(_4gUsart_handler);
    while (1)
    { tt1=gpio_pin_get_val(ADC_GND_ENABLE);
         //tt2 = gpio_pin_get_val(_4G_USART_RX_Pin);
    {
//         tt1=gpio_pin_get_val(ADC_GND_ENABLE);
         if(active_flag)
         {
         if(!uwb_rx_flag)
         {
         OpenUWB();
         }
         uwb_app_poll();
         }else{
         CloseUWB();
         }
         wdt_ping(WDT_ID0);//喂狗
         if(!power_low_flag)//确认是否休眠下才开启功能
         {
        if(flag_TCP_reconnectting||IfTCPConnected())
        {
        //    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();
        }
         }
        if(flag_secondtask)
        {