zhyinch
2021-12-23 85cdaac35f9db30b91f45ead0d78c2c0ee3220cb
Ô´Âë/ºËÐİå/Src/application/dw_app.c
@@ -865,6 +865,154 @@
   }
}
}
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;
@@ -907,12 +1055,12 @@
               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);
               }else{
                  tx_sync_msg[CURENTPACKNUM_IDX] = 1;
                  memcpy(&tx_sync_msg[DATA_IDX],&RTCMdata[send_i],remain_i);
@@ -925,7 +1073,23 @@
            }
         }
         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\":\"15625411\",\"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);
         GPS_ParseLon(&stPosState[1], &lon);
         GPS_ParseLat(&stPosState[0], &lat);
         GPS_ParseHeight(&stPosState[3], &high);
         printf(fmt,gps_type, high, lat, lon);
   //USART_puts(rec_gpsdata,recdata_len);
      }
   }else{
      dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);