From 56d6a907e12484053abb432e664d6a8466133161 Mon Sep 17 00:00:00 2001
From: zhyinch <zhyinch@gmail.com>
Date: 星期三, 02 三月 2022 18:15:44 +0800
Subject: [PATCH] 1

---
 源码/核心板/Src/application/dw_app.c |  197 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 187 insertions(+), 10 deletions(-)

diff --git "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c" "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c"
index 6c4193c..24b6c1a 100644
--- "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c"
+++ "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c"
@@ -808,12 +808,13 @@
 		dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);
 	}
 }
-u8 frame_len;
+u8 frame_len,jumptime;
 u8 rec_gpsdata[1000];
 extern u8 RTCMdata[2000];
 u16 recgpsdata_i,recdata_len;
 void UWBSendOnePackData(u8* data_addr,u8 len)
 {
+	delay_ms(jumptime);
 	g_Resttimer = 0;
 	LED0_BLINK;
 	g_start_sync_flag=1;
@@ -861,13 +862,167 @@
 				USART_puts(rec_gpsdata,recgpsdata_i);
 				break;
 			}
+		}else{
+			jumptime=time32_incr%20;
 		}
+	}else{
+		jumptime=time32_incr%20;
 	}
 }
 }
+
+char *HIDO_UtilStrnchr(const char *_pcStr, char _cChr, HIDO_UINT32 u32N)
+{
+    int32_t i = 0;
+    for (i = 0; i < u32N; i++)
+    {
+        if (_pcStr[i] == _cChr)
+        {
+            return (char *) (_pcStr + i);
+        }
+    }
+
+    return NULL;
+}
+
+HIDO_UINT8 HIDO_UtilCharToHex(HIDO_CHAR _cCh)
+{
+    return (_cCh >= '0' && _cCh <= '9') ?
+            (_cCh - '0') :
+            (_cCh >= 'A' && _cCh <= 'F' ?
+                    (_cCh - 'A' + 0x0A) :
+                    (_cCh >= 'a' && _cCh <= 'f' ? _cCh - 'a' + 0x0A : 0));
+}
+
+HIDO_UINT32 HIDO_UtilStrBufToInt(HIDO_CHAR *_pcStringBuf, HIDO_UINT32 _u32BufLen)
+ {
+    HIDO_UINT32 u32Temp = 0;
+
+    while (_u32BufLen != 0)
+    {
+        u32Temp = u32Temp * 10 + HIDO_UtilCharToHex(*_pcStringBuf);
+        _pcStringBuf++;
+        _u32BufLen--;
+    }
+
+    return u32Temp;
+}
+
+/******************************************************************************
+ Description    : Get gps latitude from gps data
+ parameter      : data: gps data pointer, len: gps data length, gps: ST_GPS pointer
+ Return         : TRUE on success, FALSE on fail
+ author         : DuJian
+ history        : 2012-7-27 new
+ ******************************************************************************/
+static int32_t GPS_ParseLat(HIDO_DataStruct *_pstLatData, double *lat)
+{
+    uint32_t u32Len = _pstLatData->m_u32Len;
+    char *pcStart = (char *) _pstLatData->m_pData;
+    char *pcDot = NULL;
+    uint32_t u32TempLen = 0;
+    double dd;
+    double mmmm;
+    double mm;
+
+    if (u32Len < 9)
+    {
+        return HIDO_ERR;
+    }
+
+    pcDot = HIDO_UtilStrnchr(pcStart, '.', u32Len);
+    if (NULL == pcDot || (pcDot - pcStart) != 4)
+    {
+        return HIDO_ERR;
+    }
+
+    dd = HIDO_UtilStrBufToInt(pcStart, 2);
+    mm = HIDO_UtilStrBufToInt(pcStart + 2, 2);
+    u32TempLen = u32Len - (pcDot + 1 - pcStart);
+    mmmm = HIDO_UtilStrBufToInt(pcDot + 1, u32TempLen);
+    while(u32TempLen != 0)
+    {
+        mmmm /= 10.0;
+        u32TempLen--;
+    }
+
+    mm = mm + mmmm;
+    *lat = dd + (mm / 60.0);
+
+    return HIDO_OK;
+}
+static int32_t GPS_ParseHeight(HIDO_DataStruct *_pstLatData, double *height)
+{
+		uint32_t u32Len = _pstLatData->m_u32Len;
+    char *pcStart = (char *) _pstLatData->m_pData;
+    char *pcDot = NULL;
+		uint32_t u32TempLen = 0;
+		double dd;
+    double mmmm;
+    double mm;
+	
+		pcDot = HIDO_UtilStrnchr(pcStart, '.', u32Len);
+		u32TempLen = pcDot - pcStart;
+		mm = HIDO_UtilStrBufToInt(pcStart, u32TempLen);
+	  u32TempLen = u32Len - (pcDot + 1 - pcStart);
+    mmmm = HIDO_UtilStrBufToInt(pcDot + 1, u32TempLen);
+    while(u32TempLen != 0)
+    {
+        mmmm /= 10.0;
+        u32TempLen--;
+    }
+		*height = mm + mmmm;
+		return HIDO_OK;
+}
+/******************************************************************************
+ Description    : Get gps longitude from gps data
+ parameter      : data: gps data pointer, len: gps data length, gps: ST_GPS pointer
+ Return         : TRUE on success, FALSE on fail
+ author         : DuJian
+ history        : 2012-7-27 new
+ ******************************************************************************/
+static int32_t GPS_ParseLon(HIDO_DataStruct *_pstLonData, double *lon)
+{
+    uint32_t u32Len = _pstLonData->m_u32Len;
+    char *pcStart = (char *) _pstLonData->m_pData;
+    char *pcDot = NULL;
+    uint32_t u32TempLen = 0;
+    double ddd;
+    double mmmm;
+    double mm;
+
+    if (u32Len < 10)
+    {
+        return HIDO_ERR;
+    }
+
+    pcDot = HIDO_UtilStrnchr(pcStart, '.', u32Len);
+    if (NULL == pcDot || (pcDot - pcStart) != 5)
+    {
+        return HIDO_ERR;
+    }
+
+    ddd = HIDO_UtilStrBufToInt(pcStart, 3);
+    mm = HIDO_UtilStrBufToInt(pcStart + 3, 2);
+    u32TempLen = u32Len - (pcDot + 1 - pcStart);
+    mmmm = HIDO_UtilStrBufToInt(pcDot + 1, u32TempLen);
+    while(u32TempLen != 0)
+    {
+        mmmm /= 10.0;
+        u32TempLen--;
+    }
+
+    mm = mm + mmmm;
+    *lon = ddd + (mm / 60.0);
+
+    return HIDO_OK;
+}
+
 extern u8 gpsdataready_flag;
 extern u16 gps_packlen;
 u8 totalpack_num,currentpack_num;
+u16 sendtimes;
+u32 rec_urtid;
 void RecOnePackData(void)
 {
 	dwt_setrxtimeout(0);//设定接收超时时间,0位没有超时时间
@@ -895,7 +1050,7 @@
 		{
 			recdata_len = frame_len-14;	
 			memcpy(rec_gpsdata,&rx_buffer[DATA_IDX],recdata_len);
-			if(gpsdataready_flag)
+		//	if(gpsdataready_flag)
 			{
 				gpsdataready_flag = 0;
 				tx_sync_msg[MESSAGE_TYPE_IDX]=DATA_RESPONSE;
@@ -907,25 +1062,47 @@
 					if(remain_i>=110)
 					{
 						tx_sync_msg[CURENTPACKNUM_IDX] = 0;
-					memcpy(&tx_sync_msg[DATA_IDX],&RTCMdata[send_i],110);
-					send_i+=110;
-					remain_i-=110;
-					dwt_writetxdata(110+14, tx_sync_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去
-					dwt_writetxfctrl(110+14, 0);//设置超宽带发送数据长度
-					dwt_starttx(DWT_START_TX_IMMEDIATE);
+						memcpy(&tx_sync_msg[DATA_IDX],&RTCMdata[send_i],110);
+						send_i+=110;
+						remain_i-=110;
+						dwt_writetxdata(110+14, tx_sync_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去
+						dwt_writetxfctrl(110+14, 0);//设置超宽带发送数据长度
+						dwt_starttx(DWT_START_TX_IMMEDIATE);
+						sendtimes++;
 					}else{
 						tx_sync_msg[CURENTPACKNUM_IDX] = 1;
 						memcpy(&tx_sync_msg[DATA_IDX],&RTCMdata[send_i],remain_i);
 						dwt_writetxdata(remain_i+14, tx_sync_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去
 						dwt_writetxfctrl(remain_i+14, 0);//设置超宽带发送数据长度
 						dwt_starttx(DWT_START_TX_IMMEDIATE);
-						remain_i = 0;					
+						remain_i = 0;
+						sendtimes++;						
 					}
 					delay_us(1000);
 				}
 			}
 			LED0_BLINK;
-	USART_puts(rec_gpsdata,recdata_len);
+			
+			extern HIDO_DataStruct stPosState[4];
+			
+			GPS_ParseGGA(rec_gpsdata,recdata_len);
+			
+			const char *fmt = "{\"battery\":4.2,\"dev_type\":\"11\",\"device_sn\":\"%d\",\"gps_type\":%d,\"high\":%.8lf,\"lat\":%.8lf,\"lng\":%.8lf}";
+			
+			double lat = 0;
+			double lon = 0;
+			double high = 0;
+			uint8_t gps_type;
+			gps_type = HIDO_UtilStrBufToInt(stPosState[2].m_pData,1);
+			if(gps_type!=0)
+			{
+			GPS_ParseLon(&stPosState[1], &lon);
+			GPS_ParseLat(&stPosState[0], &lat);
+			GPS_ParseHeight(&stPosState[3], &high);
+			}
+			memcpy(&rec_urtid,&rx_buffer[ANCHOR_ID_IDX],4);
+			printf(fmt,rec_urtid,gps_type, high, lat, lon);
+	//USART_puts(rec_gpsdata,recdata_len);
 		}
 	}else{
 		dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);

--
Gitblit v1.9.3