فهرست منبع

GPS测试完善,后续将此部分合并到单步测试中

CHENJIE-PC\QiXiang_CHENJIE 4 سال پیش
والد
کامیت
c6746916ad
5فایلهای تغییر یافته به همراه160 افزوده شده و 42 حذف شده
  1. 0 1
      inc/app.h
  2. 12 0
      inc/hal_module_adapter.h
  3. 47 26
      src/app.c
  4. 1 1
      src/bsp_custom.c
  5. 100 14
      src/hal_module_adapter.c

+ 0 - 1
inc/app.h

@@ -29,7 +29,6 @@ extern "C" {
 #define QMSG_ID_NW_IP_NOREACHABLE  (QMSG_ID_BASE + 2)
 #define QMSG_ID_SOCK_SENDPKG       (QMSG_ID_BASE + 4)
 #define QMSG_ID_SOCK_RECVPKG       (QMSG_ID_BASE + 5)
-
 typedef enum
 {
     APP_INIT_STATE,

+ 12 - 0
inc/hal_module_adapter.h

@@ -121,6 +121,18 @@ typedef struct _Can_TxMsgType
     UINT8 Data[8];
 }Can_TxMsgType;
 
+typedef struct  _GPS_INFO
+{
+	uint8_t timedata[6];
+	uint8_t status;
+	uint8_t satellite_num;
+	uint16_t direction;
+	uint16_t speed;
+	uint16_t height;
+	uint32_t latitude;
+	uint32_t longitude;
+}GPS_INFO;
+
 typedef void (*posGGACallBack )(UINT8 res, UINT8 * params);
 void PowerPinConfig(IOType iotype);
 

+ 47 - 26
src/app.c

@@ -61,7 +61,8 @@ uint8_t battbuffer[100];//电池数据都存在此数组中————电压14
  *          32+X*2+N     33+X*2+N   34+x*2+N    35 +X*2+N    36+X*2 +N    37+X*2+N
  *          电池状态    是否加热       最高单体H    最高单体L   最低单体H      最低单体L
  * */
-
+//GPS信息
+extern GPS_INFO Gps_Data;
 //状态机定义
 typedef enum
 {
@@ -204,6 +205,7 @@ static void Main_Task(void* arg)
             }
             case PROCESS_STATE_WORK:
             {
+                NetSocDisplay(LED_SOC_0,LED_TURN_ON);
                 osDelay(10/portTICK_PERIOD_MS);
                 Can_index++;
                 Uart_index++;
@@ -213,7 +215,7 @@ static void Main_Task(void* arg)
                     PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_WORK);
                     Uart_index = 0;
                 }
-                if (Can_index >=100)//Can 1s 调用一次
+                if (Can_index >=10)//Can 1s 调用一次
                 {
                     PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_RECV);
                     Can_index = 0;
@@ -230,7 +232,7 @@ static void Main_Task(void* arg)
                 {
                     sleep_index = 0;
                 }
-                if (sleep_index >=6000)
+                if (sleep_index >=60000)
                 {
                     PROC_MAIN_STATE_SWITCH(PROCESS_STATE_SLEEP);
                     sleep_index = 0;
@@ -239,34 +241,39 @@ static void Main_Task(void* arg)
             }
             case PROCESS_STATE_SLEEP:
             {
+                Sleep_Flag = true;
                 while((gProcess_Uart_Task!=PROCESS_UART_STATE_SLEEP)||(gProcess_Can_Task!=PROCESS_CAN_STATE_SLEEP))
                 {
                     PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_SLEEP);
                     PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_SLEEP);
                 }
-                Sleep_Flag = true;
+                osDelay(1000);
                 slpManSlpState_t State;
                 uint8_t cnt;
                 if(slpManCheckVoteState(MainSlpHandler, &State, &cnt)==RET_TRUE)
                 {
                     #ifdef USING_PRINTF
-                        printf("[%d]We Can Check Vote State, state=%d, cnt=%d\r\n",__LINE__,State,cnt);
+                        printf("[%d]We Can Check Vote Main State, state=%d, cnt=%d\r\n",__LINE__,State,cnt);
                     #endif						
                 }
                 slpManPlatVoteEnableSleep(MainSlpHandler, SLP_SLP2_STATE); 
                 if(slpManCheckVoteState(MainSlpHandler, &State, &cnt)==RET_TRUE)
                 {
                     #ifdef USING_PRINTF
-                        printf("[%d]We Can Check Vote State Again, state=%d, cnt=%d\r\n",__LINE__,State,cnt);
+                        printf("[%d]We Can Check Vote Main State Again, state=%d, cnt=%d\r\n",__LINE__,State,cnt);
                     #endif					
                 }
                 #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);
+                #endif
                 #ifdef USING_PRINTF
                     printf("Main_Sleep\n");
                 #endif
-                FaultDisplay(LED_TURN_ON);
                 slpManDeepSlpTimerStart(deepslpTimerID,60000); 
                 while(1)
                 {
@@ -415,14 +422,12 @@ static void Uart_Task(void* arg)
     uint8_t *Uart_Rece_buffer = NULL;
     volatile bool Uart_task = false;
     Batt_Cell_Num_2 = Batt_Cell_Num<<1;
-    gpsReqMsg Gpsmsg;
     while (true)
     {
         switch (gProcess_Uart_Task)
         {
             case PROCESS_UART_STATE_IDLE:
-            {
-                NetSocDisplay(LED_SOC_1,LED_TURN_OFF);     
+            {    
                 Rece_index = 0;
                 break;
             }
@@ -446,25 +451,11 @@ static void Uart_Task(void* arg)
             }
             case PROCESS_UART_STATE_WORK:
             {
-                posGGAServiceStart(GGACallBack);
-                if(gpsMsgQueue == NULL)
-	            {
-		            gpsMsgQueue = osMessageQueueNew(1,sizeof(gpsReqMsg), NULL);
-	            }
-                osMessageQueueGet(gpsMsgQueue, &Gpsmsg, 0, 2000);
-                if(Gpsmsg.dataPtr)
-                {    
-                    #ifdef USING_PRINTF	
-                        printf("GpsProcess Main: %s\r\n",Gpsmsg.dataPtr);
-                    #endif 
-                }    
-                NetSocDisplay(LED_SOC_1,LED_TURN_ON);
                 #ifdef USING_PRINTF
                         printf("Uart work!\n");
                 #endif
                 Uart_task = false;
                 Uart_Rece_buffer = (uint8_t *)malloc(Uart_Rece_LEN);
-                
                 while(!Uart_task)
                 {
                     switch (Rece_index)
@@ -577,7 +568,6 @@ static void Uart_Task(void* arg)
             }
             case PROCESS_UART_STATE_SLEEP:
             {
-                posGGAServiceStop();
                 slpManPlatVoteEnableSleep(UartSlpHandler, SLP_SLP2_STATE);
                 while(true)
                 {
@@ -624,6 +614,9 @@ static void Can_Task(void* arg)
     slpManPlatVoteDisableSleep(CanSlpHandler, SLP_SLP2_STATE);
     volatile bool Can_Flag=false;
     PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_IDLE);
+    GPS_INFO Gps_Data;
+    posGGAServiceStart(GGACallBack);
+
     while(1)
     {
         switch(gProcess_Can_Task)
@@ -636,6 +629,18 @@ static void Can_Task(void* arg)
             }
             case PROCESS_CAN_STATE_RECV:
             {
+
+                //加入GPS启动程序
+                if(gpsMsgQueue == NULL)
+	            {
+		            gpsMsgQueue = osMessageQueueNew(1,sizeof(GPS_INFO), NULL);
+	            }
+                osMessageQueueGet(gpsMsgQueue, &Gps_Data, 0, 1000);
+                #ifdef USING_PRINTF	
+                    printf("Gpsmsgqueue: %d,%d,%d,%d\r\n\n",Gps_Data.latitude,Gps_Data.longitude,Gps_Data.speed,Gps_Data.direction);
+                #endif 
+
+                
                 //can采用先接收后发送的策略
                 HAL_Can_Receive(Can_Rece_buffer);
                 if (Can_Rece_buffer[0]!=0xff)//满足can发送使能
@@ -645,6 +650,7 @@ static void Can_Task(void* arg)
                 }
                 else
                 {
+                    PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_IDLE);
                     Can_Enable = false;
                 }
                 break;
@@ -798,7 +804,22 @@ static void Can_Task(void* arg)
             }
             case PROCESS_CAN_STATE_SLEEP:
             {
+                posGGAServiceStop();
+                slpManSlpState_t State;
+                uint8_t cnt;
+                if(slpManCheckVoteState(CanSlpHandler, &State, &cnt)==RET_TRUE)
+                {
+                    #ifdef USING_PRINTF
+                        printf("[%d]We Can Check Vote Can State, state=%d, cnt=%d\r\n",__LINE__,State,cnt);
+                    #endif						
+                }
                 slpManPlatVoteEnableSleep(CanSlpHandler, SLP_SLP2_STATE); 
+                if(slpManCheckVoteState(CanSlpHandler, &State, &cnt)==RET_TRUE)
+                {
+                    #ifdef USING_PRINTF
+                        printf("[%d]We Can Check Vote can State Again, state=%d, cnt=%d\r\n",__LINE__,State,cnt);
+                    #endif					
+                }
                 while(true)
                 {
                     osDelay(5000/portTICK_PERIOD_MS);
@@ -865,7 +886,7 @@ void Can_Task_Init()
 void appInit(void *arg)
 {
     Main_Task_Init();
-    Uart_Task_Init();
+    //Uart_Task_Init(); 暂时屏蔽Uart读取
     Can_Task_Init();
     GpsTaskInit();
 }

+ 1 - 1
src/bsp_custom.c

@@ -139,7 +139,7 @@ void BSP_CustomInit(void)
     BSP_LoadPlatConfigFromRawFlash();
     rawFlashPlatConfig = BSP_GetRawFlashPlatConfig();
 #ifdef USING_PRINTF
-	SetPrintUart(PORT_USART_0);
+	SetPrintUart(PORT_USART_1);
 #else
     if(rawFlashPlatConfig && (rawFlashPlatConfig->logControl != 0 ))
     {

+ 100 - 14
src/hal_module_adapter.c

@@ -74,7 +74,6 @@ typedef struct
     UINT32 request;
     UINT32 NTCvalue[7];
 }NtcResult_t;
-
 NtcResult_t gNtcDev;
 volatile static UINT32 vbatChannelResult = 0;
 volatile static UINT32 thermalChannelResult = 0;
@@ -1602,8 +1601,31 @@ void posGGAServiceStop( void)
 	GPSPowerCtr(false);
 	gGPSDataCBfunc = NULL;
 }
-
-
+// 字符串删除函数
+void strdel(char * str,char c)
+{
+	char *p = str;
+	while(*str)
+	{
+		if(*str!=c)
+			*p++ = *str;
+		str++;
+	}
+	*p = '\0';
+}
+uint32_t location_handle(char *in1)
+{
+	uint32_t location_temp;
+	uint32_t location_degree;
+	uint32_t location_min;
+	location_temp = atol(in1);
+	location_degree = location_temp/(1e7);
+	location_degree = location_degree*(1e6);
+	location_min = location_temp-location_degree*10;
+	location_min = location_min/6;
+	location_temp = location_degree+location_min;
+	return location_temp;
+} 
 /**
   \fn   void gpsProcess(void* arg)
   \param[in]  
@@ -1613,22 +1635,86 @@ void posGGAServiceStop( void)
 static void GpsProcess(void* arg)
 {
     gpsReqMsg msg;
+	GPS_INFO Gps_buffer;
+	char *p=NULL;
+	const char *delim = "\n";
+	char *databuffer[14];
+	/**
+	 *databuffer内容格式:
+	 *  定位标识,时间,位置有效标识,纬度,纬度指示,经度,经度指示,地面速率,地面航向,日期
+	 **/
+
     #ifdef USING_PRINTF	
     	printf("%s[%d]\r\n",__FUNCTION__, __LINE__);
     #endif
     while(1)
     {
-    	/*
-		
-	*/
-	osMessageQueueGet(gpsMsgHandle, &msg, 0, osWaitForever);
-	#ifdef USING_PRINTF	
-	    printf("GpsProcess Gpstask [%d] %s\r\n",msg.len,msg.dataPtr);
-	#endif 
-	osMessageQueuePut(gpsMsgQueue, &msg, 0, 2000);
-		 if(msg.dataPtr)
-		 	free(msg.dataPtr);
-	  	msg.dataPtr=NULL;
+		//char temp[] = "$GNGGA,082626.00,2939.91801,N,10637.09500,E,1,03,2.34,-20.3,M,,M,,*40";
+		char temp[] = "$GNRMC,082626.000,A,2939.91801,N,10637.09500,E,0.543,30.254,261120,,,A,V*17";
+		osMessageQueueGet(gpsMsgHandle, &msg, 0, 5000);
+		if (msg.dataPtr)
+		{		
+			void  *msgtemp = msg.dataPtr;//取指针
+			#ifdef USING_PRINTF	
+				printf("\nGpsProcess msgptr data:%s\r\n",msg.dataPtr);
+			#endif
+			p = strtok(msg.dataPtr,delim);//将信息进行分割
+			p = strtok(NULL,delim);
+			#ifdef USING_PRINTF	
+				printf("\nP msgptr data:%s\r\n",p);
+			#endif
+			int i=0;
+			p = strtok(temp,",");//只取第1行的信息RMC
+
+			if (strcmp(p,"$GNRMC")==0)
+			{			
+				while (p)
+				{	
+					#ifdef USING_PRINTF	
+						printf("p:%s\r\n",p);
+					#endif
+					databuffer[i]=p;
+					p = strtok(NULL,",");
+					i++;;
+				}
+				if (strcmp(databuffer[1],"V")==0|strcmp(databuffer[2],"V")==0)
+				{
+
+					#ifdef USING_PRINTF	
+						printf("Gpsdata invalide\n");
+					#endif 
+					Gps_buffer.status = 0x00;
+					Gps_buffer.speed = 0xffff;
+					Gps_buffer.direction= 0xffff;
+
+				}
+				else if (strcmp(databuffer[2],"A")==0)
+				{
+					uint32_t speedtemp;
+					#ifdef USING_PRINTF	
+						printf("Gpsdata valide\n");
+					#endif 
+					Gps_buffer.status = 0x01;//有效,东经,北纬写定
+					Gps_buffer.satellite_num = 03;//卫星数目写入1
+					strdel(databuffer[3],'.');
+					strdel(databuffer[5],'.');
+					strdel(databuffer[7],'.');
+					speedtemp = atol(databuffer[7])*1852;//节换算单位,1节=1.852km每小时
+					Gps_buffer.speed = speedtemp/1e5;
+					Gps_buffer.latitude = location_handle(databuffer[3]);
+					Gps_buffer.longitude = location_handle(databuffer[5]);
+					if(Gps_buffer.speed>=100)//大于10km/h才输出方位
+					{
+						Gps_buffer.direction = atol(databuffer[8]);
+					}
+					Gps_buffer.direction = 0xfffe;
+				}
+				osMessageQueuePut(gpsMsgQueue, &Gps_buffer, 0, 1000);
+			}
+			free(msgtemp);
+			msgtemp=NULL;
+		}
+		msg.dataPtr=NULL;
 		if (Sleep_Flag)
 		{
 			osThreadExit();