[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