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

*/

(

/*

pointer to ephemeris data array

*/

GPM_ephData* pTemp

)

 

 

 

{

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-08

GPS 16x Technical Specifications

Rev. A

 

Page 28