Changeset 268 in ntrip for trunk/rtcm3torinex


Ignore:
Timestamp:
Nov 2, 2006, 2:34:00 PM (17 years ago)
Author:
stoecker
Message:

updated to support BNC

Location:
trunk/rtcm3torinex
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/rtcm3torinex/rtcm3torinex.c

    r81 r268  
    11/*
    22  Converter for RTCM3 data to RINEX.
    3   $Id: rtcm3torinex.c,v 1.4 2006/05/08 09:25:11 stoecker Exp $
    4   Copyright (C) 2005-2006 by Dirk Stoecker <stoecker@euronav.de>
     3  $Id: rtcm3torinex.c,v 1.5 2006/08/29 15:42:36 stoecker Exp $
     4  Copyright (C) 2005-2006 by Dirk Stoecker <stoecker@euronik.eu>
     5
     6  This software is a complete NTRIP-RTCM3 to RINEX converter as well as
     7  a module of the BNC tool for multiformat conversion. Contact Dirk
     8  Stöcker for suggestions and bug reports related to the RTCM3 to RINEX
     9  conversion problems and the author of BNC for all the other problems.
    510
    611  This program is free software; you can redistribute it and/or modify
     
    2227#include <ctype.h>
    2328#include <errno.h>
    24 #include <getopt.h>
    2529#include <math.h>
    26 #include <netdb.h>
    27 #include <netinet/in.h>
    2830#include <signal.h>
    29 #include <stdint.h>
    3031#include <stdio.h>
    3132#include <stdlib.h>
    3233#include <string.h>
    33 #include <sys/socket.h>
    3434#include <sys/types.h>
    3535#include <time.h>
    3636#include <unistd.h>
    3737
    38 /* The string, which is send as agent in HTTP request */
    39 #define AGENTSTRING "NTRIP NtripRTCM3ToRINEX"
    40 
    41 #define MAXDATASIZE 1000 /* max number of bytes we can get at once */
     38#ifndef NO_RTCM3_MAIN
     39#include <getopt.h>
     40#include <netdb.h>
     41#include <netinet/in.h>
     42#include <sys/socket.h>
     43#endif
     44
     45#include "rtcm3torinex.h"
    4246
    4347/* CVS revision and version */
    44 static char revisionstr[] = "$Revision: 1.4 $";
    45 static char datestr[]     = "$Date: 2006/05/08 09:25:11 $";
    46 static int stop = 0;
    47 
    48 /* unimportant, only for approx. time needed */
    49 #define LEAPSECONDS 14
    50 
    51 struct converttimeinfo {
    52   int second;    /* seconds of GPS time [0..59] */
    53   int minute;    /* minutes of GPS time [0..59] */
    54   int hour;      /* hour of GPS time [0..24] */
    55   int day;       /* day of GPS time [1..28..30(31)*/
    56   int month;     /* month of GPS time [1..12]*/
    57   int year;      /* year of GPS time [1980..] */
    58 };
    59 
    60 #define PRN_GPS_START             1
    61 #define PRN_GPS_END               32
    62 #define PRN_GLONASS_START         38
    63 #define PRN_GLONASS_END           61
    64 
    65 #define GNSSENTRY_C1DATA     0
    66 #define GNSSENTRY_C2DATA     1
    67 #define GNSSENTRY_P1DATA     2
    68 #define GNSSENTRY_P2DATA     3
    69 #define GNSSENTRY_L1CDATA    4
    70 #define GNSSENTRY_L1PDATA    5
    71 #define GNSSENTRY_L2CDATA    6
    72 #define GNSSENTRY_L2PDATA    7
    73 #define GNSSENTRY_D1CDATA    8
    74 #define GNSSENTRY_D1PDATA    9
    75 #define GNSSENTRY_D2CDATA    10
    76 #define GNSSENTRY_D2PDATA    11
    77 #define GNSSENTRY_S1CDATA    12
    78 #define GNSSENTRY_S1PDATA    13
    79 #define GNSSENTRY_S2CDATA    14
    80 #define GNSSENTRY_S2PDATA    15
    81 #define GNSSENTRY_NUMBER     16 /* number of types!!! */
    82 
    83 /* Data flags. These flags are used in the dataflags field of gpsdata structure
    84    and are used the determine, which data fields are filled with valid data. */
    85 #define GNSSDF_C1DATA         (1<<GNSSENTRY_C1DATA)
    86 #define GNSSDF_C2DATA         (1<<GNSSENTRY_C2DATA)
    87 #define GNSSDF_P1DATA         (1<<GNSSENTRY_P1DATA)
    88 #define GNSSDF_P2DATA         (1<<GNSSENTRY_P2DATA)
    89 #define GNSSDF_L1CDATA        (1<<GNSSENTRY_L1CDATA)
    90 #define GNSSDF_L1PDATA        (1<<GNSSENTRY_L1PDATA)
    91 #define GNSSDF_L2CDATA        (1<<GNSSENTRY_L2CDATA)
    92 #define GNSSDF_L2PDATA        (1<<GNSSENTRY_L2PDATA)
    93 #define GNSSDF_D1CDATA        (1<<GNSSENTRY_D1CDATA)
    94 #define GNSSDF_D1PDATA        (1<<GNSSENTRY_D1PDATA)
    95 #define GNSSDF_D2CDATA        (1<<GNSSENTRY_D2CDATA)
    96 #define GNSSDF_D2PDATA        (1<<GNSSENTRY_D2PDATA)
    97 #define GNSSDF_S1CDATA        (1<<GNSSENTRY_S1CDATA)
    98 #define GNSSDF_S1PDATA        (1<<GNSSENTRY_S1PDATA)
    99 #define GNSSDF_S2CDATA        (1<<GNSSENTRY_S2CDATA)
    100 #define GNSSDF_S2PDATA        (1<<GNSSENTRY_S2PDATA)
    101 
    102 #define RINEXENTRY_C1DATA     0
    103 #define RINEXENTRY_C2DATA     1
    104 #define RINEXENTRY_P1DATA     2
    105 #define RINEXENTRY_P2DATA     3
    106 #define RINEXENTRY_L1DATA     4
    107 #define RINEXENTRY_L2DATA     5
    108 #define RINEXENTRY_D1DATA     6
    109 #define RINEXENTRY_D2DATA     7
    110 #define RINEXENTRY_S1DATA     8
    111 #define RINEXENTRY_S2DATA     9
    112 #define RINEXENTRY_NUMBER     10
    113 
    114 /* Additional flags for the data field, which tell us more. */
    115 #define GNSSDF_LOCKLOSSL1     (1<<29)  /* lost lock on L1 */
    116 #define GNSSDF_LOCKLOSSL2     (1<<30)  /* lost lock on L2 */
    117 #define LIGHTSPEED         2.99792458e8  /* m/sec */
    118 #define GPS_FREQU_L1       1575420000.0  /* Hz */
    119 #define GPS_FREQU_L2       1227600000.0  /* Hz */
    120 #define GPS_WAVELENGTH_L1  (LIGHTSPEED / GPS_FREQU_L1) /* m */
    121 #define GPS_WAVELENGTH_L2  (LIGHTSPEED / GPS_FREQU_L2) /* m */
    122 
    123 struct gnssdata {
    124   int    flags;              /* GPSF_xxx */
    125   int    week;               /* week number of GPS date */
    126   int    numsats;
    127   double timeofweek;         /* milliseconds in GPS week */
    128   double measdata[24][GNSSENTRY_NUMBER];  /* data fields */
    129   int    dataflags[24];      /* GPSDF_xxx */
    130   int    satellites[24];     /* SV - IDs */
    131   int    snrL1[24];          /* Important: all the 5 SV-specific fields must */
    132   int    snrL2[24];          /* have the same SV-order */
    133 };
    134 
    135 struct RTCM3ParserData {
    136   unsigned char Message[2048]; /* input-buffer */
    137   int    MessageSize;   /* current buffer size */
    138   int    NeedBytes;     /* bytes wanted for next run */
    139   int    SkipBytes;     /* bytes to skip in next round */
    140   int    GPSWeek;
    141   int    GPSTOW;        /* in seconds */
    142   struct gnssdata Data;
    143   int    size;
    144   int    lastlockl1[64];
    145   int    lastlockl2[64];
    146   int    datapos[RINEXENTRY_NUMBER];
    147   int    dataflag[RINEXENTRY_NUMBER];
    148   int    numdatatypes;
    149   int    validwarning;
    150   int    init;
    151   const char * headerfile;
    152 };
    153 
    154 struct Args
    155 {
    156   const char *server;
    157   int         port;
    158   const char *user;
    159   const char *password;
    160   const char *data;
    161   const char *headerfile;
    162 };
    163 
    164 /* option parsing */
    165 #ifdef NO_LONG_OPTS
    166 #define LONG_OPT(a)
    167 #else
    168 #define LONG_OPT(a) a
    169 static struct option opts[] = {
    170 { "data",       required_argument, 0, 'd'},
    171 { "server",     required_argument, 0, 's'},
    172 { "password",   required_argument, 0, 'p'},
    173 { "port",       required_argument, 0, 'r'},
    174 { "header",     required_argument, 0, 'f'},
    175 { "user",       required_argument, 0, 'u'},
    176 { "help",       no_argument,       0, 'h'},
    177 {0,0,0,0}};
    178 #endif
    179 #define ARGOPT "d:hp:r:s:u:f:"
    180 
    181 static int getargs(int argc, char **argv, struct Args *args)
    182 {
    183   int res = 1;
    184   int getoptr;
    185   int help = 0;
    186   char *t;
    187 
    188   args->server = "www.euref-ip.net";
    189   args->port = 80;
    190   args->user = "";
    191   args->password = "";
    192   args->data = 0;
    193   args->headerfile = 0;
    194   help = 0;
    195 
    196   do
    197   {
    198 #ifdef NO_LONG_OPTS
    199     switch((getoptr = getopt(argc, argv, ARGOPT)))
    200 #else
    201     switch((getoptr = getopt_long(argc, argv, ARGOPT, opts, 0)))
    202 #endif
    203     {
    204     case 's': args->server = optarg; break;
    205     case 'u': args->user = optarg; break;
    206     case 'p': args->password = optarg; break;
    207     case 'd': args->data = optarg; break;
    208     case 'f': args->headerfile = optarg; break;
    209     case 'h': help=1; break;
    210     case 'r':
    211       args->port = strtoul(optarg, &t, 10);
    212       if((t && *t) || args->port < 1 || args->port > 65535)
    213         res = 0;
    214       break;
    215     case -1: break;
    216     }
    217   } while(getoptr != -1 || !res);
    218 
    219   datestr[0] = datestr[7];
    220   datestr[1] = datestr[8];
    221   datestr[2] = datestr[9];
    222   datestr[3] = datestr[10];
    223   datestr[5] = datestr[12];
    224   datestr[6] = datestr[13];
    225   datestr[8] = datestr[15];
    226   datestr[9] = datestr[16];
    227   datestr[4] = datestr[7] = '-';
    228   datestr[10] = 0;
    229 
    230   if(!res || help)
    231   {
    232     fprintf(stderr, "Version %s (%s) GPL\nUsage: %s -s server -u user ...\n"
    233     " -d " LONG_OPT("--data       ") "the requested data set\n"
    234     " -f " LONG_OPT("--headerfile ") "file for RINEX header information\n"
    235     " -s " LONG_OPT("--server     ") "the server name or address\n"
    236     " -p " LONG_OPT("--password   ") "the login password\n"
    237     " -r " LONG_OPT("--port       ") "the server port number (default 80)\n"
    238     " -u " LONG_OPT("--user       ") "the user name\n"
    239     , revisionstr, datestr, argv[0]);
    240     exit(1);
    241   }
    242   return res;
    243 }
     48static char revisionstr[] = "$Revision: 1.5 $";
     49static char datestr[]     = "$Date: 2006/08/29 15:42:36 $";
    24450
    24551static const char encodingTable [64] = {
     
    385191#define SKIPBITS(b) { LOADBITS(b) numbits -= (b); }
    386192
    387 static int RTCM3Parser(struct RTCM3ParserData *handle)
     193int RTCM3Parser(struct RTCM3ParserData *handle)
    388194{
    389195  int ret=0;
     
    560366}
    561367
    562 static void converttime(struct converttimeinfo *c, int week, int tow)
     368void converttime(struct converttimeinfo *c, int week, int tow)
    563369{
    564370  /* static variables */
     
    610416};
    611417
    612 static void HandleHeader(struct RTCM3ParserData *Parser)
     418void HandleHeader(struct RTCM3ParserData *Parser)
    613419{
    614420  struct HeaderData hdata;
     
    722528    struct converttimeinfo cti;
    723529    converttime(&cti, Parser->Data.week,
    724     floor(Parser->Data.timeofweek/1000.0));
     530    (int)floor(Parser->Data.timeofweek/1000.0));
    725531    hdata.data.named.timeoffirstobs = buffer;
    726532      i = 1+snprintf(buffer, buffersize,
     
    825631}
    826632
    827 /* let the output complete a block if necessary */
    828 static void signalhandler(int sig)
    829 {
    830   if(!stop)
    831   {
    832     fprintf(stderr, "Stop signal number %d received. "
    833     "Trying to terminate gentle.\n", sig);
    834     stop = 1;
    835     alarm(1);
    836   }
    837 }
    838 
    839 /* for some reason we had to abort hard (maybe waiting for data */
    840 #ifdef __GNUC__
    841 static __attribute__ ((noreturn)) void signalhandler_alarm(
    842 int sig __attribute__((__unused__)))
    843 #else /* __GNUC__ */
    844 static void signalhandler_alarm(int sig)
    845 #endif /* __GNUC__ */
    846 {
    847   fprintf(stderr, "Programm forcefully terminated.\n");
    848   exit(1);
    849 }
    850 
    851 static void HandleByte(struct RTCM3ParserData *Parser, unsigned int byte)
     633void HandleByte(struct RTCM3ParserData *Parser, unsigned int byte)
    852634{
    853635  Parser->Message[Parser->MessageSize++] = byte;
     
    944726}
    945727
     728#ifndef NO_RTCM3_MAIN
     729/* The string, which is send as agent in HTTP request */
     730#define AGENTSTRING "NTRIP NtripRTCM3ToRINEX"
     731
     732#define MAXDATASIZE 1000 /* max number of bytes we can get at once */
     733
     734static int stop = 0;
     735
     736struct Args
     737{
     738  const char *server;
     739  int         port;
     740  const char *user;
     741  const char *password;
     742  const char *data;
     743  const char *headerfile;
     744};
     745
     746/* option parsing */
     747#ifdef NO_LONG_OPTS
     748#define LONG_OPT(a)
     749#else
     750#define LONG_OPT(a) a
     751static struct option opts[] = {
     752{ "data",       required_argument, 0, 'd'},
     753{ "server",     required_argument, 0, 's'},
     754{ "password",   required_argument, 0, 'p'},
     755{ "port",       required_argument, 0, 'r'},
     756{ "header",     required_argument, 0, 'f'},
     757{ "user",       required_argument, 0, 'u'},
     758{ "help",       no_argument,       0, 'h'},
     759{0,0,0,0}};
     760#endif
     761#define ARGOPT "d:hp:r:s:u:f:"
     762
     763static int getargs(int argc, char **argv, struct Args *args)
     764{
     765  int res = 1;
     766  int getoptr;
     767  int help = 0;
     768  char *t;
     769
     770  args->server = "www.euref-ip.net";
     771  args->port = 80;
     772  args->user = "";
     773  args->password = "";
     774  args->data = 0;
     775  args->headerfile = 0;
     776  help = 0;
     777
     778  do
     779  {
     780#ifdef NO_LONG_OPTS
     781    switch((getoptr = getopt(argc, argv, ARGOPT)))
     782#else
     783    switch((getoptr = getopt_long(argc, argv, ARGOPT, opts, 0)))
     784#endif
     785    {
     786    case 's': args->server = optarg; break;
     787    case 'u': args->user = optarg; break;
     788    case 'p': args->password = optarg; break;
     789    case 'd': args->data = optarg; break;
     790    case 'f': args->headerfile = optarg; break;
     791    case 'h': help=1; break;
     792    case 'r':
     793      args->port = strtoul(optarg, &t, 10);
     794      if((t && *t) || args->port < 1 || args->port > 65535)
     795        res = 0;
     796      break;
     797    case -1: break;
     798    }
     799  } while(getoptr != -1 || !res);
     800
     801  datestr[0] = datestr[7];
     802  datestr[1] = datestr[8];
     803  datestr[2] = datestr[9];
     804  datestr[3] = datestr[10];
     805  datestr[5] = datestr[12];
     806  datestr[6] = datestr[13];
     807  datestr[8] = datestr[15];
     808  datestr[9] = datestr[16];
     809  datestr[4] = datestr[7] = '-';
     810  datestr[10] = 0;
     811
     812  if(!res || help)
     813  {
     814    fprintf(stderr, "Version %s (%s) GPL\nUsage: %s -s server -u user ...\n"
     815    " -d " LONG_OPT("--data       ") "the requested data set\n"
     816    " -f " LONG_OPT("--headerfile ") "file for RINEX header information\n"
     817    " -s " LONG_OPT("--server     ") "the server name or address\n"
     818    " -p " LONG_OPT("--password   ") "the login password\n"
     819    " -r " LONG_OPT("--port       ") "the server port number (default 80)\n"
     820    " -u " LONG_OPT("--user       ") "the user name\n"
     821    , revisionstr, datestr, argv[0]);
     822    exit(1);
     823  }
     824  return res;
     825}
     826
     827/* let the output complete a block if necessary */
     828static void signalhandler(int sig)
     829{
     830  if(!stop)
     831  {
     832    fprintf(stderr, "Stop signal number %d received. "
     833    "Trying to terminate gentle.\n", sig);
     834    stop = 1;
     835    alarm(1);
     836  }
     837}
     838
     839/* for some reason we had to abort hard (maybe waiting for data */
     840#ifdef __GNUC__
     841static __attribute__ ((noreturn)) void signalhandler_alarm(
     842int sig __attribute__((__unused__)))
     843#else /* __GNUC__ */
     844static void signalhandler_alarm(int sig)
     845#endif /* __GNUC__ */
     846{
     847  fprintf(stderr, "Programm forcefully terminated.\n");
     848  exit(1);
     849}
     850
    946851int main(int argc, char **argv)
    947852{
     
    1085990  return 0;
    1086991}
     992#endif /* NO_RTCM3_MAIN */
Note: See TracChangeset for help on using the changeset viewer.