Changeset 268 in ntrip
- Timestamp:
- Nov 2, 2006, 2:34:00 PM (18 years ago)
- Location:
- trunk/rtcm3torinex
- Files:
-
- 1 added
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/rtcm3torinex/rtcm3torinex.c
r81 r268 1 1 /* 2 2 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. 5 10 6 11 This program is free software; you can redistribute it and/or modify … … 22 27 #include <ctype.h> 23 28 #include <errno.h> 24 #include <getopt.h>25 29 #include <math.h> 26 #include <netdb.h>27 #include <netinet/in.h>28 30 #include <signal.h> 29 #include <stdint.h>30 31 #include <stdio.h> 31 32 #include <stdlib.h> 32 33 #include <string.h> 33 #include <sys/socket.h>34 34 #include <sys/types.h> 35 35 #include <time.h> 36 36 #include <unistd.h> 37 37 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" 42 46 43 47 /* 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 } 48 static char revisionstr[] = "$Revision: 1.5 $"; 49 static char datestr[] = "$Date: 2006/08/29 15:42:36 $"; 244 50 245 51 static const char encodingTable [64] = { … … 385 191 #define SKIPBITS(b) { LOADBITS(b) numbits -= (b); } 386 192 387 staticint RTCM3Parser(struct RTCM3ParserData *handle)193 int RTCM3Parser(struct RTCM3ParserData *handle) 388 194 { 389 195 int ret=0; … … 560 366 } 561 367 562 staticvoid converttime(struct converttimeinfo *c, int week, int tow)368 void converttime(struct converttimeinfo *c, int week, int tow) 563 369 { 564 370 /* static variables */ … … 610 416 }; 611 417 612 staticvoid HandleHeader(struct RTCM3ParserData *Parser)418 void HandleHeader(struct RTCM3ParserData *Parser) 613 419 { 614 420 struct HeaderData hdata; … … 722 528 struct converttimeinfo cti; 723 529 converttime(&cti, Parser->Data.week, 724 floor(Parser->Data.timeofweek/1000.0));530 (int)floor(Parser->Data.timeofweek/1000.0)); 725 531 hdata.data.named.timeoffirstobs = buffer; 726 532 i = 1+snprintf(buffer, buffersize, … … 825 631 } 826 632 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) 633 void HandleByte(struct RTCM3ParserData *Parser, unsigned int byte) 852 634 { 853 635 Parser->Message[Parser->MessageSize++] = byte; … … 944 726 } 945 727 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 734 static int stop = 0; 735 736 struct 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 751 static 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 763 static 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 */ 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 946 851 int main(int argc, char **argv) 947 852 { … … 1085 990 return 0; 1086 991 } 992 #endif /* NO_RTCM3_MAIN */
Note:
See TracChangeset
for help on using the changeset viewer.