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