Przeglądaj źródła

骑享ota更新测试,程序会卡死,网络连接不顺,下一版重新写tcp逻辑,重新验证程序可靠性。

CHENJIE-PC\QiXiang_CHENJIE 4 lat temu
rodzic
commit
ee738f402f
1 zmienionych plików z 89 dodań i 98 usunięć
  1. 89 98
      src/app.c

+ 89 - 98
src/app.c

@@ -1,6 +1,6 @@
 /*******************************
  * 
- * 骑享程序V2版本
+ * 骑享OTA更新测试
  * 
  * ****************************/
 #include "bsp.h"
@@ -22,16 +22,13 @@
 #include "slpman_ec616.h"
 #include "plat_config.h"
 
-//基础定义
-#define Batt_Cell_Num  (17)//默认数值14、17
-#define Batt_Temp_Num  (7)//默认数值5、7
-#define Batt_Cell_Num_2 (Batt_Cell_Num*2)
-//主任务调度定义
-#define PROC_MAIN_TASK_STACK_SIZE           (512)
-static StaticTask_t             gProcess_Main_Task_t;
-static UINT8                  gProcess_Main_TaskStack[PROC_MAIN_TASK_STACK_SIZE];
+
+//Main Area
+#define PROC_MAIN_TASK_STACK_SIZE           (1024)
 uint8_t deepslpTimerID          = DEEPSLP_TIMER_ID7;
 uint8_t MainSlpHandler          = 0xff;
+static StaticTask_t             gProcess_Main_Task_t;
+static UINT8                  gProcess_Main_TaskStack[PROC_MAIN_TASK_STACK_SIZE];
 typedef enum
 {
     PROCESS_STATE_IDLE = 0,
@@ -40,13 +37,16 @@ typedef enum
 }process_Main;
 static process_Main 		    gProcess_Main_Task = PROCESS_STATE_IDLE;
 #define PROC_MAIN_STATE_SWITCH(a)  (gProcess_Main_Task = a)
-volatile bool Sleep_Flag = false;//主线程睡眠标志位
 
-//Tcp线程定义
+//tcp area
 #define PROC_TCP_TASK_STACK_SIZE           (1024)
 static StaticTask_t             gProcess_Tcp_Task_t;
 static UINT8                  gProcess_Tcp_TaskStack[PROC_TCP_TASK_STACK_SIZE];
-#define APP_EVENT_QUEUE_SIZE    (10)
+static volatile UINT32          Event;
+static UINT8                    gImsi[16] = {0};
+static INT32                    sockfd = -1;
+static UINT32                   gCellID = 0;
+int TcpconnectID = -1;
 volatile uint8_t Tcp_statuts = 0;
 typedef enum
 {
@@ -57,12 +57,7 @@ typedef enum
 }process_TCP;
 static process_TCP 		    gProcess_Tcp_Task = PROCESS_TCP_STATE_IDLE;
 #define PROC_TCP_STATE_SWITCH(a)  (gProcess_Tcp_Task = a)
-
-//Fota线程定义
-#define PROC_FOTA_TASK_STACK_SIZE           (1024)
-static StaticTask_t             gProcess_Fota_Task_t;
-static UINT8                  gProcess_Fota_TaskStack[PROC_FOTA_TASK_STACK_SIZE];
-Fota_Type Fota_Struct;
+volatile bool Tcp_Sleep_Flag = false;
 
 //睡眠进出函数
 static void appBeforeHib(void *pdata, slpManLpState state)
@@ -75,12 +70,14 @@ static void appBeforeHib(void *pdata, slpManLpState state)
 	slpManAONIOLatchEn(AonIOLatch_Enable);
 
 }
+
 static void appAfterHib(void *pdata, slpManLpState state)
 {
     #ifdef USING_PRINTF
         printf("Try Hibernate Failed:%d \n",state);
     #endif
 }
+
 static void appBeforeSlp1(void *pdata, slpManLpState state)
 {
     #ifdef USING_PRINTF
@@ -88,12 +85,15 @@ static void appBeforeSlp1(void *pdata, slpManLpState state)
     #endif
 	slpManAONIOLatchEn(AonIOLatch_Enable);
 }
+
 static void appAfterSlp1(void *pdata, slpManLpState state)
 {
     #ifdef USING_PRINTF
         printf("After Sleep1:%d \n",state);
     #endif
 }
+
+
 static void appBeforeSlp2(void *pdata, slpManLpState state)
 {
     #ifdef USING_PRINTF
@@ -101,6 +101,7 @@ static void appBeforeSlp2(void *pdata, slpManLpState state)
     #endif
 	slpManAONIOLatchEn(AonIOLatch_Enable);
 }
+
 static void appAfterSlp2(void *pdata, slpManLpState state)
 {
     #ifdef USING_PRINTF
@@ -110,26 +111,28 @@ static void appAfterSlp2(void *pdata, slpManLpState state)
 // 主任务线程
 static void Main_Task(void* arg)
 {
-    uint32_t sleep_count = 0;
-    uint32_t Uart_time = 0;
-    uint32_t sleep_time_value;
+    UINT16 Can_index = 0;
+    UINT16 Uart_index = 0;
+    UINT16 Tcp_index  = 0;
+    uint32_t sleep_index = 0;
+    uint32_t sleep_time_flag;
     int32_t inParam = 0xAABBCCDD;
-    uint32_t Chrgend_Work_time = 18000;
-    uint32_t Wakeup_Work_time = 3000;
-    uint32_t Sleep_Time = 20000;
+    uint32_t Chrgend_Work_time = 1800;
+    uint32_t Wakeup_Work_time = 120;
+    uint32_t Sleep_Time = 120;
     //上述参数应写入文件里
-    slpManSlpState_t State;
-    uint8_t cnt;
     slpManWakeSrc_e Wakeup_source;
-
+    PROC_MAIN_STATE_SWITCH(PROCESS_STATE_IDLE);
     NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
     NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
     NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
     NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
     FaultDisplay(LED_TURN_OFF);
     NVIC_EnableIRQ(PadWakeup1_IRQn);
+
     slpManSetPmuSleepMode(true,SLP_HIB_STATE,false);
     slpManApplyPlatVoteHandle("MainSlp",&MainSlpHandler);
+    slpManPlatVoteDisableSleep(MainSlpHandler, SLP_SLP2_STATE); 
     slpManRegisterUsrdefinedBackupCb(appBeforeHib,&inParam,SLPMAN_HIBERNATE_STATE);
     slpManRegisterUsrdefinedRestoreCb(appAfterHib,NULL,SLPMAN_HIBERNATE_STATE);
     slpManRegisterUsrdefinedBackupCb(appBeforeSlp1,NULL,SLPMAN_SLEEP1_STATE);
@@ -137,8 +140,8 @@ static void Main_Task(void* arg)
     slpManRegisterUsrdefinedBackupCb(appBeforeSlp2,NULL,SLPMAN_SLEEP2_STATE);
     slpManRegisterUsrdefinedRestoreCb(appAfterSlp2,NULL,SLPMAN_SLEEP2_STATE);
 
-    slpManPlatVoteDisableSleep(MainSlpHandler, SLP_SLP1_STATE); 
     slpManSlpState_t slpstate = slpManGetLastSlpState();
+
     #ifdef USING_PRINTF
             printf("slpstate:%d \n",slpstate);
     #endif
@@ -146,18 +149,17 @@ static void Main_Task(void* arg)
     #ifdef USING_PRINTF
             printf("Wakeup_source:%d \n",Wakeup_source);
     #endif
-    PROC_MAIN_STATE_SWITCH(PROCESS_STATE_IDLE);
     if (Wakeup_source==0)
     {
-        sleep_time_value = Wakeup_Work_time;
+        sleep_time_flag = Wakeup_Work_time;
     }
     else if (Wakeup_source==1)
     {
-        sleep_time_value = Wakeup_Work_time;
+        sleep_time_flag = Wakeup_Work_time;
     }
     else
     {
-        sleep_time_value = Chrgend_Work_time;
+        sleep_time_flag = Chrgend_Work_time;
     }
     if((slpstate == SLP_SLP2_STATE) || (slpstate == SLP_HIB_STATE))
     {
@@ -167,60 +169,50 @@ static void Main_Task(void* arg)
     {
         PROC_MAIN_STATE_SWITCH(PROCESS_STATE_WORK);
     }
-    //线程初始化完成
     while (true)
     {
         switch(gProcess_Main_Task)
         {
             case PROCESS_STATE_IDLE:
             {
+                // 暂时不区分唤醒
                 PROC_MAIN_STATE_SWITCH(PROCESS_STATE_WORK);
                 break;
             }
             case PROCESS_STATE_WORK:
             {
-                osDelay(100/portTICK_PERIOD_MS);
-                sleep_count++;
-                Uart_time++;
-                if (Uart_time >10)
+                osDelay(10/portTICK_PERIOD_MS);
+                Can_index++;
+                Uart_index++;
+                Tcp_index++;
+                sleep_index++;
+                if (Tcp_index >=100)//Tcp 1s 调用一次
                 {
-                    Uart_time = 0;
-                    PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_WORK);
-                }
-                if(Fota_Struct.Fota_update)
-                {
-                    sleep_count = 0;
+                    #ifdef USING_PRINTF
+                        printf("[%d]_sleep count \r\n",sleep_index);
+                    #endif
+                    Tcp_index = 0;
+                    PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_LINK);
                 }
-                if (sleep_count >=sleep_time_value)
+                if (sleep_index >=sleep_time_flag*100)
                 {
                     PROC_MAIN_STATE_SWITCH(PROCESS_STATE_SLEEP);
-                    sleep_count = 0;
+                    sleep_index = 0;
                 }
                 break;
             }
             case PROCESS_STATE_SLEEP:
             {
-                #ifdef USING_PRINTF
-                        printf("[%d]Main_sleep\r\n",__LINE__);
-                #endif
-                while(true)
-                {
-                    PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_SLEEP);
-                    if(Uart_Sleep_State)
-                        break;
-                    Sleep_Flag = true;
-                    #ifdef USING_PRINTF
-                        printf("Uart_Sleep_State:%d\r\n",Uart_Sleep_State);
-                    #endif
-                    osDelay(1000/portTICK_PERIOD_MS);
-                }
+                osDelay(10000);
+                slpManSlpState_t State;
+                uint8_t cnt;
                 if(slpManCheckVoteState(MainSlpHandler, &State, &cnt)==RET_TRUE)
                 {
                     #ifdef USING_PRINTF
                         printf("[%d]We Can Check Vote Main State, state=%d, cnt=%d\r\n",__LINE__,State,cnt);
                     #endif						
                 }
-                slpManPlatVoteForceEnableSleep(MainSlpHandler, SLP_SLP1_STATE); //增加强制投票
+                slpManPlatVoteForceEnableSleep(MainSlpHandler, SLP_SLP2_STATE); //增加强制投票
                 if(slpManCheckVoteState(MainSlpHandler, &State, &cnt)==RET_TRUE)
                 {
                     #ifdef USING_PRINTF
@@ -230,6 +222,7 @@ static void Main_Task(void* arg)
                 #ifdef USING_PRINTF
                             printf("[%d]Waiting sleep\r\n",__LINE__);
                 #endif
+                FaultDisplay(LED_TURN_ON);
                 slpManSlpState_t slpstate = slpManPlatGetSlpState();
                 #ifdef USING_PRINTF
                     printf("which slpstate can go now :%d \n",slpstate);
@@ -241,14 +234,17 @@ static void Main_Task(void* arg)
                     {
                         slpManDeepSlpTimerDel(deepslpTimerID);
                     }
-                    slpManDeepSlpTimerStart(deepslpTimerID, Sleep_Time);
+                    slpManDeepSlpTimerStart(deepslpTimerID, Sleep_Time*1000);
                     osDelay(60000/portTICK_PERIOD_MS);
                 }
+                break;
             }
         }
+
     }
+    
+
 }
-//NB事件回调函数
 static INT32 socketRegisterPSUrcCallback(urcID_t eventID, void *param, UINT32 paramLen)
 {
     CmiSimImsiStr *imsi = NULL;
@@ -316,28 +312,13 @@ static void Tcp_Task(void* arg)
     CHAR   serverip[] = "120.26.68.165";
     CHAR  serverport[] = "14319";
     struct addrinfo hints, *server_res;
-    int TcpsendID = -1;
     memset( &hints, 0, sizeof( hints ) );
     hints.ai_socktype = SOCK_STREAM;
     hints.ai_protocol = IPPROTO_TCP;
-    PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_IDLE);
-    static INT32   sockfd = -1;
-    int TcpconnectID = -1;
     uint8_t* TcpSendBuffer=NULL;
-    uint8_t Reconnect_Num = 0;//重新连接次数
-    appSetEDRXSettingSync(0,5,1800000);
-    appSetPSMSettingSync(1,3*60*60,10);
-    slpManWakeSrc_e Wakeup_source;
-    Wakeup_source =  slpManGetWakeupSrc();//获取唤醒源
-    if(Wakeup_source==0)
-    {
-        Tcp_statuts = 0;
-    }
-    else
-    {
-        Tcp_statuts = 1;
-    }
-    appSetCFUN(1);
+    uint8_t Reconnect_Num = 0;
+    int TcpsendID = -1;
+    PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_IDLE);
     while(true)
     {
         switch(gProcess_Tcp_Task)
@@ -369,7 +350,6 @@ static void Tcp_Task(void* arg)
                             #ifdef USING_PRINTF
                                 printf("TCP connect unresolved dns\n");
                             #endif
-                            Tcp_statuts=0;
                         }
                         Tcp_statuts=2;
                         break;
@@ -395,7 +375,7 @@ static void Tcp_Task(void* arg)
                                 #ifdef USING_PRINTF
                                     printf("Connect failed!%d,Reconnect:%d\n",TcpconnectID,Reconnect_Num);
                                 #endif
-                                close(sockfd);
+                                // close(sockfd);
                                 Tcp_statuts=2;
                                 PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_IDLE);
                                 Reconnect_Num++;
@@ -405,17 +385,17 @@ static void Tcp_Task(void* arg)
                                 Tcp_statuts=3;
                                 Reconnect_Num = 0;
                             }
-                            if(Reconnect_Num>=20)//重新连接
+                            if(Reconnect_Num>=20)
                             {
                                 appSetCFUN(0);
-                                osDelay(100);
+                                osDelay(10);
                                 appSetCFUN(1);
                                 PSInitEventCallbackTable();
                                 Tcp_statuts=1;
                                 Reconnect_Num = 0;
                             }
                         }
-                        break;   
+                        break;
                     }
                     case 3://3代表连接建立成功
                     {
@@ -432,19 +412,27 @@ static void Tcp_Task(void* arg)
             }
             case PROCESS_TCP_STATE_WORK:
             {
-                TcpSendBuffer = (uint8_t *)malloc(1);
+                TcpSendBuffer = (uint8_t *)malloc(3);
                 *(TcpSendBuffer+0) = 0x23;
-                #ifdef USING_PRINTF
-                        printf("TCP_STATE_WORK!\n");
-                #endif
-                TcpsendID = send(sockfd, TcpSendBuffer, 1, 0 );
-                free(TCPSendBuffer);
+                *(TcpSendBuffer+1) = 0x23;
+                *(TcpSendBuffer+2) = 0x02;
+                TcpsendID = send(sockfd, TcpSendBuffer, 3, 0 );
+                if (TcpsendID<0)
+                {
+                    closesocket(sockfd);
+                    TcpconnectID = -1;
+                    Tcp_statuts = 4;
+                    PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_LINK);
+                }
+                else
+                {
+                    PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_IDLE);
+                }
                 break;
             }
             case PROCESS_TCP_STATE_SLEEP:
             {
                 closesocket(sockfd);
-                //deregisterPSEventCallback(socketRegisterPSUrcCallback);//注销NB网络事件函数
                 #ifdef USING_PRINTF
                     printf("TCP_STATE_SLEEP\n");
                 #endif
@@ -454,6 +442,7 @@ static void Tcp_Task(void* arg)
                 {
                     osDelay(30000/portTICK_PERIOD_MS);
                 }
+                break;
             }
         }
     }
@@ -468,20 +457,22 @@ void Tcp_Task_Init()
     task_attr.name = "Tcp_Task";
     task_attr.stack_mem = gProcess_Tcp_TaskStack;
     task_attr.stack_size = PROC_TCP_TASK_STACK_SIZE;
-    task_attr.priority = osPriorityBelowNormal7;
-    task_attr.cb_mem = &gProcess_Tcp_TaskStack;
+    task_attr.priority = osPriorityNormal;
+    task_attr.cb_mem = &gProcess_Tcp_Task_t;
     task_attr.cb_size = sizeof(StaticTask_t);
     osThreadNew(Tcp_Task, NULL, &task_attr);
+
 }
 //主任务线程初始化
 void Main_Task_Init()
 {
     #ifndef USING_PRINTF
-        if(BSP_GetPlatConfigItemValue(PLAT_CONFIG_ITEM_LOG_CONTROL) != 0)
-        {
-            HAL_UART_RecvFlowControl(false);
-        }
+    if(BSP_GetPlatConfigItemValue(PLAT_CONFIG_ITEM_LOG_CONTROL) != 0)
+    {
+        HAL_UART_RecvFlowControl(false);
+    }
     #endif
+    //slpManDeepSlpTimerRegisterExpCb(slpManTimerCb);
     osThreadAttr_t task_attr;
     memset(&task_attr,0,sizeof(task_attr));
     memset(gProcess_Main_TaskStack, 0xA5, PROC_MAIN_TASK_STACK_SIZE);