1
zhyinch
2022-03-02 56d6a907e12484053abb432e664d6a8466133161
Ô´Âë/ºËÐİå/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);