Garmin 16" x Manuale Utente

Pagina di 36
190-00228-08 
GPS 16x Technical Specifications  
Rev. A 
Page 28 
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 */