[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[IGS-RTWG-7] Real-Time Message Format Version 1.0



******************************************************************************
IGS-RTWG Mail      12 Feb 14:11:49 PST 2004      Message Number 7
******************************************************************************

Author: Ken MacLeod and Ron Muellerschoen
Dear IGS Colleagues: 

Please, find enclosed the proposed RT-IGS message format.

For, information on the SOC compression format refer to:
http://gipsy.jpl.nasa.gov/igdg/papers/SOC_FORMAT.ppt

C++ source code to encode and decode RT-IGS messages is available
from Ken MacLeod.


Sincerely, 

Ken


/*************************************************************************
                          rtigs_records.h  -  description
                             -------------------
    begin                : Wed Aug 27 2003
    copyright            : (C) 2003 by Ken MacLeod
    email                : ken.macleod @ nrcan.gc.ca.
 *************************************************************************/

/***************************************************************************
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version. 
 *
 *************************************************************************/
#ifndef _RTIGS_T
#define _RTIGS_T

/**************************************************************************
* RT-IGS record structures
*
*	General:
*
*	Every record will have a defined number. We propose the following:
*	
*	1) Station record number 100;
*	2) Observation record number 200;
*	3) Ephemeris record number 300;
*	4) Meteorological record number 400;
*
*	Every station will have a unique number. We propose the following:
*
*	1-99 reserved for JPL
*	100-199 reserved for NRCan
*	200-299 reserved for NGS
*	300-399 reserved for ESOC
*	400-499 reserved for GFZ
*	500-599 reserved for BKG
*	600-699 reserved for GEOSCIENCE AUS.
*	700-799 others
*	etc
*
*	The number of bytes in each real time message will include 
*	the header as well as the data content, but NOT the pointer. 
*
*	For example:
*
*	1) A station message is output once per hour and is 20 bytes
*
*	2) An observation message is output once per second. The header is
*	   12 bytes long and the SOC data is 21 bytes per PRN. So 
*	   a typical RTIGSO_T message will be 390 bytes if 8 sats
*	   are being tracked.
*	3) An ephemeris message is output when the ephemeris is 
*	   decoded by the GPS receiver. The time in the Ephemeris
*	   header is the collected time.
*	   Only one ephemeris can be bundled in a RTIGSE_T message.

*	   A RTIGSE_T message contains one eph. the  message 
*	   consists of 12 header bytes and 72 ephemeris bytes,
*	   for a total of 84 bytes.
*
*	4) The RTIGSM_T  (met) message should be issues once 
*	   every 15 minutes. A basic met message consists 
*	   of a 12 byte header and 3 longs (temp,
*	   press and relative humidity) for a total of 24 bytes.
*				
*	All records will be related to a station configuration 
*	indicated by the Issue of Data Station (IODS). The IODS 
*	will enable the user to identify the equipment and software
*	that was used to derive the observation data.
*
*	Each record header will contain the GPS Time in seconds which is
*	continuous from ((6 Jan-1980)).
*
*	The data payload of each record will consist of observations. The
*	structures shown below indicate a pointer to data but 
*	in fact the broadcast messages will not contain the pointer,
*	only the data. Users will have to manage the data and the 
*	pointer is shown to illustrate where the data is
*	located in the message and one possible data management option.
*		
*
* 	All record data in network byte order (Big Endian), 
*	ie  IA32 users will have to swap bytes ;-)
***************************************************************************
* Developed by Ken MacLeod Aug. 27/2003
* Updated and revised Feb. 10/2004 with comments from R. Muellershoen
**************************************************************************/

#define MAXSTA	256
#define MAXSOC 264	/* 12 + (12 * 21) = 264*/
#define MAXEPH 876	/* 12 + (12 * 72) = 876*/
#define MAXMETS 6


/************************************************************************
* Structure name : RTIGSS_T
*
*	Purpose:
* 		
*	Encapsulate the station information that is required
*	by real-time users 
*
*	Users should use this record to link data to a specific station
*	configuration.
*	The station message should be transmitted by station 
*	operator every hour and upon update.
*	If the IGS stations record Issue of Data Station(IODS) 
*	and the IODS in the observation record do not match 
*	then the data should be used without further investigation
*
*		
*
* 	This record is not intended to replace the IGS Station 
*	log but it is seen as a subset of the IGS log and contains 
*	information that enables real-time users to monitor 
*	station changes.
* 
*Version: 1.0
*
*By Ken MacLeod Aug. 27/2003
*Changes: Revised Feb. 10/2004 updated the message description info.
*************************************************************************/

typedef struct rtigs_station
{
	unsigned short rec_id; 	/*100 indicates station record */
				/*this message to be issued */
				/*once per hour*/
	unsigned short sta_id;	/*unique number assigned to */
				/*each station. */
				/*Uniquely linked to an IGS Station */
				/*log by the the IGS_UniqueID in */
				/*this record*/
	unsigned long GPSTime;		/* GPS time message issued, */
					/* GPS time is seconds from */
					/*the beginning of GPS */
					/*(6 Jan-1980)*/
	unsigned short num_bytes;	/* total number of bytes in */
					/* the message, including */
					/* the header*/
	unsigned char IODS;	/* a flag indicating the current*/
				/* station configuration this will*/
				/*  change every time the station */
				/* hardware changes*/
	unsigned char sta_rec_type;	/* could be various station */
					/* data formats:  0 indicates */
					/* that there is no additional */
					/* station data*/
	char IGS_UniqueID[8];	/* IGS ID eg. NRC1 will use IGS 4*/
				/* character standard but c requires*/
				/* a \0 to terminate the string */
	unsigned char *data;	/* default station headers Does Not */
				/* contain data.  The current message */
				/* does not contain additional station */
				/* information the pointer is  */
				/* shown only to illustrate options*/
}RTIGSS_T;

/**************************************************************************
 * Structure name : RTIGSO_T
 *
 * Purpose :  	GPS Observations
 *		Currently the JPL Soc format is used to compress the
 *		observation data. 
 *		See JPL's website for a description of the SOC
 * 		compression routine
 *Version: 1.0
 *
 *By Ken MacLeod Aug. 27/2003
 *Changes: Revised Feb. 10/2004 Remove station clock and obs time
 * in milliseconds and add to the message description
 **************************************************************************/
typedef struct rtigs_obs
{
	unsigned short rec_id;	/* 200 indicates rt-igs gps observation*/
	unsigned short sta_id;	/* Unique number assigned to each station.
*/
				/* Uniquely linked to an IGS Station log */
				/* by the station record*/
	unsigned long GPSTime;	/* observation time of issue, GPS time is */
				/* seconds from the beginning of GPS */
				/* (6 Jan-1980)*/
	unsigned short num_bytes;   /* total number of bytes in the message,
*/
				    /* including the header, but not the
data */
				    /* pointer*/
	unsigned char IODS;	/* a flag indicating the current station */
				/* configuration that derived  the */
				/* observations this  value will change */
				/* every time the station configuration */
				/* changes*/
	unsigned char num_obs;	/* number of GPS Observations in data
block*/
	unsigned char *data;	/* pointer to soc observation data */
				/* (4 byte pointer), this pointer */
				/* is not in the message the data starts */
				/* here,  the pointer is used to manage the
*/
				/* SOC data once the RTIGS0_T message has */
				/* been decoded */
} RTIGSO_T;
/***************************************************************************
**
 * Structure name : RTIGSE_T
 *
 * Purpose :  SV Ephemeris in Broadcast format parity removed
 *
 *Version: 1.0
 *
 *By Ken MacLeod Aug. 27/2003
 *Changes: Revised Feb. 10/2004 to only contain one eph and 
 *		include the prn in the header.
 
****************************************************************************
*/
typedef struct rtigs_ephemeris
{
	unsigned short	rec_id;	/* 300 indicates rt-igs eph*/
	unsigned short	sta_id;	/* unique number assigned */
				/* to each station*/
	unsigned long	CollectedGPSTime;    /* time ephemeris received at
*/
					     /*station, GPS time is seconds
*/
					     /* from the beginning of GPS */
					     /* (6 Jan-1980)*/
	unsigned short	num_bytes;   /* total number of bytes in the
message, */
				     /* including the header, but not the
size */
				     /*  of the data pointer*/
	unsigned char	IODS;	     /* a flag indicating the current
station */
				     /* configuration that derived the */
				     /* observations this will change every
*/
				     /* time the sta config. changes*/
	unsigned char	prn;	     /* prn for the data in the message*/
	unsigned char	*data;	/* In the RTIGSE_T message the data */
				/* starts here,  the pointer is used to */
				/* manage the eph data once the RTIGSE_T */
				/* message has  been decoded */
				/* The RTIGSE_T eph. format consists of */
				/* the 3 broadcast sub frames  with the */
				/* parity bits removed so 3 */
				/* subframes = 72 bytes per eph*/
} RTIGSE_T;

/***********************************************************************
 * Structure name : RTIGSM_T
 *
 * Purpose :  Station Meteorological observations
 *
 *Version: 1.0
 *
 *By Ken MacLeod Aug. 27/2003
 *Changes: Changed the met array to an long pointer
 ***********************************************************************/
typedef struct rtigs_mets
{
	unsigned short	rec_id; 	/* 400 indicates rt-igs met*/
	unsigned short	sta_id; 	/* unique number assigned to each */
					/* station*/
	unsigned long	GPSTime;	/* time of issue, GPS time is
seconds */
					/* from the beginning of GPS (6
Jan-1980)*/
	unsigned short	num_bytes; 	/* total number of bytes in the
message,*/
					/* including the header but not the
pointer*/
	unsigned char	IODS;		/* a flag indicating the current
station */
					/* config that derived the
observations */
					/* this will change every time the
station */
					/* configuration changes*/
	unsigned char	numobs;		/* if only temp, press, rel hum then
: 3  */
	long *mets;			/* temp(Deg C),   press (mb),  */
					/* rel humid(%),  zenith
Wet(metres), */
					/* Zenith Dry(metres),  Zenith Total
*/
					/* (metres) and  each scaled by 1000
so */
					/* 1000.123 mb = 1000123*/
					/*if the zenith observations are not
*/
					/* present only enter 3 for the num
of obs.*/
} RTIGSM_T;

#endif