Garmin GPS 17HVS Technical Specifications - Page 33

GPS 16/17 Technical Specifications

Page 33 highlights

An example function to do the parsing is shown below. Note that the double data types are converted by the function cnvt_ieee_double(). This function merely swaps the upper and lower words of the double. This is necessary on GPS 15, 16, 17 series sensors due to a compatibility issue with the IEEE floating point standard): In this example, the array m_TempArray contains the data portion of the ephemeris packet (with DLE stuffing removed). * * PROCEDURE NAME: * copyData - ephemeris data unpacker * * DESCRIPTION: * unpacks data from ephemeris packet DATA field after extraneous DLEs * have been removed. Note that sint16 refers to a signed 16-bit * integer type. * void GPM_ephList::copyData /* ephemeris data unpacker */ ( GPM_ephData* pTemp /* pointer to ephemeris data array */ ) { pTemp->EphStruct.wn = *(sint16*)&m_TempArray[IDX_EPH_WN]; pTemp->EphStruct.toc = *(float*)&m_TempArray[IDX_EPH_TOC]; pTemp->EphStruct.toe = *(float*)&m_TempArray[IDX_EPH_TOE]; pTemp->EphStruct.af0 = *(float*)&m_TempArray[IDX_EPH_AF0]; pTemp->EphStruct.af1 = *(float*)&m_TempArray[IDX_EPH_AF1]; pTemp->EphStruct.af2 = *(float*)&m_TempArray[IDX_EPH_AF2]; pTemp->EphStruct.ura = *(float*)&m_TempArray[IDX_EPH_URA]; cnvt_ieee_double((long *)&m_TempArray[IDX_EPH_E]); pTemp->EphStruct.e = *(double*)&m_TempArray[IDX_EPH_E]; cnvt_ieee_double((long *)&m_TempArray[IDX_EPH_SQRTA]); pTemp->EphStruct.sqrta = *(double*)&m_TempArray[IDX_EPH_SQRTA]; cnvt_ieee_double((long *)&m_TempArray[IDX_EPH_DN]); pTemp->EphStruct.dn = *(double*)&m_TempArray[IDX_EPH_DN]; cnvt_ieee_double((long *)&m_TempArray[IDX_EPH_M0]); pTemp->EphStruct.m0 = *(double*)&m_TempArray[IDX_EPH_M0]; cnvt_ieee_double((long *)&m_TempArray[IDX_EPH_W]); pTemp->EphStruct.w = *(double*)&m_TempArray[IDX_EPH_W]; cnvt_ieee_double((long *)&m_TempArray[IDX_EPH_OMG0]); pTemp->EphStruct.omg0 = *(double*)&m_TempArray[IDX_EPH_OMG0]; cnvt_ieee_double((long *)&m_TempArray[IDX_EPH_I0]); pTemp->EphStruct.i0 = *(double*)&m_TempArray[IDX_EPH_I0]; pTemp->EphStruct.odot = *(float*)&m_TempArray[IDX_EPH_ODOT]; pTemp->EphStruct.idot = *(float*)&m_TempArray[IDX_EPH_IDOT]; pTemp->EphStruct.cus = *(float*)&m_TempArray[IDX_EPH_CUS]; pTemp->EphStruct.cuc = *(float*)&m_TempArray[IDX_EPH_CUC]; pTemp->EphStruct.cis = *(float*)&m_TempArray[IDX_EPH_CIS]; pTemp->EphStruct.cic = *(float*)&m_TempArray[IDX_EPH_CIC]; pTemp->EphStruct.crs = *(float*)&m_TempArray[IDX_EPH_CRS]; pTemp->EphStruct.crc = *(float*)&m_TempArray[IDX_EPH_CRC]; pTemp->EphStruct.iod = *(unsigned char*)&m_TempArray[IDX_EPH_IOD]; return; } /* copyData */ 190-00228-21 GPS 16/17 Technical Specifications Page 29 Rev. A

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

190-00228-21
GPS 16/17 Technical Specifications
Rev. A
Page 29
An example function to do the parsing is shown below. Note that the double data types are converted by the function
cnvt_ieee_double()
. This function merely swaps the upper and lower words of the double. This is necessary
on GPS 15, 16, 17 series sensors due to a compatibility issue with the IEEE floating point standard): In this example,
the array
m_TempArray
contains the data portion of the ephemeris packet (with DLE stuffing removed).
/****************************************************************************
*
*
PROCEDURE NAME:
*
copyData - ephemeris data unpacker
*
*
DESCRIPTION:
*
unpacks data from ephemeris packet DATA field after extraneous DLEs
*
have been removed.
Note that sint16 refers to a signed 16-bit
*
integer type.
*
****************************************************************************/
void GPM_ephList::copyData
/* ephemeris data unpacker
*/
(
GPM_ephData* pTemp
/* pointer to ephemeris data array
*/
)
{
pTemp->EphStruct.wn
= *(sint16*)&m_TempArray[IDX_EPH_WN];
pTemp->EphStruct.toc = *(float*)&m_TempArray[IDX_EPH_TOC];
pTemp->EphStruct.toe = *(float*)&m_TempArray[IDX_EPH_TOE];
pTemp->EphStruct.af0 = *(float*)&m_TempArray[IDX_EPH_AF0];
pTemp->EphStruct.af1 = *(float*)&m_TempArray[IDX_EPH_AF1];
pTemp->EphStruct.af2 = *(float*)&m_TempArray[IDX_EPH_AF2];
pTemp->EphStruct.ura = *(float*)&m_TempArray[IDX_EPH_URA];
cnvt_ieee_double((long *)&m_TempArray[IDX_EPH_E]);
pTemp->EphStruct.e = *(double*)&m_TempArray[IDX_EPH_E];
cnvt_ieee_double((long *)&m_TempArray[IDX_EPH_SQRTA]);
pTemp->EphStruct.sqrta = *(double*)&m_TempArray[IDX_EPH_SQRTA];
cnvt_ieee_double((long *)&m_TempArray[IDX_EPH_DN]);
pTemp->EphStruct.dn = *(double*)&m_TempArray[IDX_EPH_DN];
cnvt_ieee_double((long *)&m_TempArray[IDX_EPH_M0]);
pTemp->EphStruct.m0 = *(double*)&m_TempArray[IDX_EPH_M0];
cnvt_ieee_double((long *)&m_TempArray[IDX_EPH_W]);
pTemp->EphStruct.w = *(double*)&m_TempArray[IDX_EPH_W];
cnvt_ieee_double((long *)&m_TempArray[IDX_EPH_OMG0]);
pTemp->EphStruct.omg0 = *(double*)&m_TempArray[IDX_EPH_OMG0];
cnvt_ieee_double((long *)&m_TempArray[IDX_EPH_I0]);
pTemp->EphStruct.i0 = *(double*)&m_TempArray[IDX_EPH_I0];
pTemp->EphStruct.odot = *(float*)&m_TempArray[IDX_EPH_ODOT];
pTemp->EphStruct.idot = *(float*)&m_TempArray[IDX_EPH_IDOT];
pTemp->EphStruct.cus = *(float*)&m_TempArray[IDX_EPH_CUS];
pTemp->EphStruct.cuc = *(float*)&m_TempArray[IDX_EPH_CUC];
pTemp->EphStruct.cis = *(float*)&m_TempArray[IDX_EPH_CIS];
pTemp->EphStruct.cic = *(float*)&m_TempArray[IDX_EPH_CIC];
pTemp->EphStruct.crs = *(float*)&m_TempArray[IDX_EPH_CRS];
pTemp->EphStruct.crc = *(float*)&m_TempArray[IDX_EPH_CRC];
pTemp->EphStruct.iod = *(unsigned char*)&m_TempArray[IDX_EPH_IOD];
return;
}
/* copyData */