Delivered-To: igs-rtwg@igscb.jpl.nasa.gov Message-ID: <5ACEEE96F4F9D41190790002A528B51E05E46BB5@S0-OTT-X11.NRCan.gc.ca> From: "MacLeod, Ken" To: "'igs-rtwg@igscb.jpl.nasa.gov'" Subject: [IGS-RTWG-7] Real-Time Message Format Version 1.0 Date: Thu, 12 Feb 2004 17:06:11 -0500 Sender: owner-igs-rtwg Precedence: bulk ****************************************************************************** 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