Changeset 5595 in ntrip for trunk/rtcm3torinex/lib


Ignore:
Timestamp:
Dec 3, 2013, 2:33:25 PM (10 years ago)
Author:
stoecker
Message:

add QZSS (type 1044)

Location:
trunk/rtcm3torinex/lib
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/rtcm3torinex/lib/rtcm3torinex.c

    r5553 r5595  
    446446        ge->TOW = 0.9999E9;
    447447        ret = 1019;
     448      }
     449      break;
     450    case 1044:
     451      {
     452        struct gpsephemeris *ge;
     453        int sv, i;
     454
     455        ge = &handle->ephemerisGPS;
     456        memset(ge, 0, sizeof(*ge));
     457
     458        GETBITS(sv, 4)
     459        ge->satellite = PRN_QZSS_START+sv-1;
     460        GETBITS(ge->TOC, 16)
     461        ge->TOC <<= 4;
     462        GETFLOATSIGN(ge->clock_driftrate, 8, 1.0/(double)(1<<30)/(double)(1<<25))
     463        GETFLOATSIGN(ge->clock_drift, 16, 1.0/(double)(1<<30)/(double)(1<<13))
     464        GETFLOATSIGN(ge->clock_bias, 22, 1.0/(double)(1<<30)/(double)(1<<1))
     465        GETBITS(ge->IODE, 8)
     466        GETFLOATSIGN(ge->Crs, 16, 1.0/(double)(1<<5))
     467        GETFLOATSIGN(ge->Delta_n, 16, R2R_PI/(double)(1<<30)/(double)(1<<13))
     468        GETFLOATSIGN(ge->M0, 32, R2R_PI/(double)(1<<30)/(double)(1<<1))
     469        GETFLOATSIGN(ge->Cuc, 16, 1.0/(double)(1<<29))
     470        GETFLOAT(ge->e, 32, 1.0/(double)(1<<30)/(double)(1<<3))
     471        GETFLOATSIGN(ge->Cus, 16, 1.0/(double)(1<<29))
     472        GETFLOAT(ge->sqrt_A, 32, 1.0/(double)(1<<19))
     473        GETBITS(ge->TOE, 16)
     474        ge->TOE <<= 4;
     475        GETFLOATSIGN(ge->Cic, 16, 1.0/(double)(1<<29))
     476        GETFLOATSIGN(ge->OMEGA0, 32, R2R_PI/(double)(1<<30)/(double)(1<<1))
     477        GETFLOATSIGN(ge->Cis, 16, 1.0/(double)(1<<29))
     478        GETFLOATSIGN(ge->i0, 32, R2R_PI/(double)(1<<30)/(double)(1<<1))
     479        GETFLOATSIGN(ge->Crc, 16, 1.0/(double)(1<<5))
     480        GETFLOATSIGN(ge->omega, 32, R2R_PI/(double)(1<<30)/(double)(1<<1))
     481        GETFLOATSIGN(ge->OMEGADOT, 24, R2R_PI/(double)(1<<30)/(double)(1<<13))
     482        GETFLOATSIGN(ge->IDOT, 14, R2R_PI/(double)(1<<30)/(double)(1<<13))
     483        GETBITS(sv, 2)
     484        if(sv & 1)
     485          ge->flags |= GPSEPHF_L2PCODE;
     486        if(sv & 2)
     487          ge->flags |= GPSEPHF_L2CACODE;
     488        GETBITS(ge->GPSweek, 10)
     489        ge->GPSweek += 1024;
     490        GETBITS(ge->URAindex, 4)
     491        GETBITS(ge->SVhealth, 6)
     492        GETFLOATSIGN(ge->TGD, 8, 1.0/(double)(1<<30)/(double)(1<<1))
     493        GETBITS(ge->IODC, 10)
     494        GETBITS(sv, 1)
     495        if(sv)
     496          ge->flags |= GPSEPHF_6HOURSFIT;
     497
     498        i = ((int)ge->GPSweek - (int)handle->GPSWeek)*7*24*60*60
     499        + ((int)ge->TOE - (int)handle->GPSTOW) - 2*60*60;
     500        if(i > 5*60*60 && i < 8*60*60)
     501        {
     502          handle->GPSTOW = ge->TOE;
     503          handle->GPSWeek = ge->GPSweek;
     504        }
     505        ge->TOW = 0.9999E9;
     506        ret = 1044;
    448507      }
    449508      break;
     
    24402499    while((r = RTCM3Parser(Parser)))
    24412500    {
    2442       if(r == 1020 || r == 1019)
     2501      if(r == 1020 || r == 1019 || r == 1044)
    24432502      {
    24442503        FILE *file = 0;
     
    24462505        if(Parser->rinex3 && !(file = Parser->gpsfile))
    24472506        {
    2448           const char *n = Parser->gpsephemeris ? Parser->gpsephemeris : Parser->glonassephemeris;
     2507          const char *n = Parser->gpsephemeris ? Parser->gpsephemeris
     2508          : Parser->qzssephemeris ? Parser->qzssephemeris : Parser->glonassephemeris;
    24492509          if(n)
    24502510          {
     
    24612521              fprintf(Parser->gpsfile, "%s\n%60sEND OF HEADER\n", buffer, "");
    24622522            }
     2523            Parser->qzssephemeris = 0;
    24632524            Parser->gpsephemeris = 0;
    24642525            Parser->glonassephemeris = 0;
     
    25072568            }
    25082569            file = Parser->gpsfile;
     2570          }
     2571          else if(r == 1044)
     2572          {
     2573            if(Parser->qzssephemeris)
     2574            {
     2575              if(!(Parser->qzssfile = fopen(Parser->qzssephemeris, "w")))
     2576              {
     2577                RTCM3Error("Could not open QZSS ephemeris output file.\n");
     2578              }
     2579              else
     2580              {
     2581                char buffer[100];
     2582                fprintf(Parser->qzssfile,
     2583                "%9.2f%11sN: QZSS NAV DATA%24sRINEX VERSION / TYPE\n", 2.1, "", "");
     2584                HandleRunBy(buffer, sizeof(buffer), 0, Parser->rinex3);
     2585                fprintf(Parser->qzssfile, "%s\n%60sEND OF HEADER\n", buffer, "");
     2586              }
     2587              Parser->qzssephemeris = 0;
     2588            }
     2589            file = Parser->qzssfile;
    25092590          }
    25102591        }
     
    25372618            e->z_velocity, e->z_acceleration, (double) e->E);
    25382619          }
    2539           else /* if(r == 1019) */
     2620          else /* if(r == 1019 || r == 1044) */
    25402621          {
    25412622            struct gpsephemeris *e = &Parser->ephemerisGPS;
     
    25442625            struct converttimeinfo cti;
    25452626            converttime(&cti, e->GPSweek, e->TOC);
    2546 
     2627            const char *sep = "   ";
     2628            int qzss = 0;
     2629            int num = e->satellite;
     2630
     2631            if(num >= PRN_QZSS_START)
     2632            {
     2633              qzss = 1;
     2634              num -= PRN_QZSS_START-1;
     2635            }
    25472636            if(Parser->rinex3)
    2548               ConvLine(file, "G%02d %04d %02d %02d %02d %02d %02d%19.12e%19.12e%19.12e\n",
    2549               e->satellite, cti.year, cti.month, cti.day, cti.hour,
     2637            {
     2638              ConvLine(file,
     2639              "%s%02d %04d %02d %02d %02d %02d %02d%19.12e%19.12e%19.12e\n",
     2640              qzss ? "J" : "G", num, cti.year, cti.month, cti.day, cti.hour,
    25502641              cti.minute, cti.second, e->clock_bias, e->clock_drift,
    25512642              e->clock_driftrate);
     2643              sep = "    ";
     2644            }
    25522645            else
    2553               ConvLine(file, "%02d %02d %02d %02d %02d %02d%05.1f%19.12e%19.12e%19.12e\n",
    2554               e->satellite, cti.year%100, cti.month, cti.day, cti.hour,
     2646            {
     2647              ConvLine(file,
     2648              "%02d %02d %02d %02d %02d %02d%05.1f%19.12e%19.12e%19.12e\n",
     2649              num, cti.year%100, cti.month, cti.day, cti.hour,
    25552650              cti.minute, (double) cti.second, e->clock_bias, e->clock_drift,
    25562651              e->clock_driftrate);
    2557             ConvLine(file, "   %19.12e%19.12e%19.12e%19.12e\n", (double)e->IODE,
    2558             e->Crs, e->Delta_n, e->M0);
    2559             ConvLine(file, "   %19.12e%19.12e%19.12e%19.12e\n", e->Cuc,
     2652            }
     2653            ConvLine(file, "%s%19.12e%19.12e%19.12e%19.12e\n", sep,
     2654            (double)e->IODE, e->Crs, e->Delta_n, e->M0);
     2655            ConvLine(file, "%s%19.12e%19.12e%19.12e%19.12e\n", sep, e->Cuc,
    25602656            e->e, e->Cus, e->sqrt_A);
    2561             ConvLine(file, "   %19.12e%19.12e%19.12e%19.12e\n",
     2657            ConvLine(file, "%s%19.12e%19.12e%19.12e%19.12e\n", sep,
    25622658            (double) e->TOE, e->Cic, e->OMEGA0, e->Cis);
    2563             ConvLine(file, "   %19.12e%19.12e%19.12e%19.12e\n", e->i0,
     2659            ConvLine(file, "%s%19.12e%19.12e%19.12e%19.12e\n", sep, e->i0,
    25642660            e->Crc, e->omega, e->OMEGADOT);
    25652661            d = 0;
     
    25692665            if(i & GPSEPHF_L2PCODE)
    25702666              d += 1.0;
    2571             ConvLine(file, "   %19.12e%19.12e%19.12e%19.12e\n", e->IDOT, d,
     2667            ConvLine(file, "%s%19.12e%19.12e%19.12e%19.12e\n", sep, e->IDOT, d,
    25722668            (double) e->GPSweek, i & GPSEPHF_L2PCODEDATA ? 1.0 : 0.0);
    25732669            if(e->URAindex <= 6) /* URA index */
     
    25772673            /* 15 indicates not to use satellite. We can't handle this special
    25782674               case, so we create a high "non"-accuracy value. */
    2579             ConvLine(file, "   %19.12e%19.12e%19.12e%19.12e\n", d,
     2675            ConvLine(file, "%s%19.12e%19.12e%19.12e%19.12e\n", sep, d,
    25802676            ((double) e->SVhealth), e->TGD, ((double) e->IODC));
    25812677
    2582             ConvLine(file, "   %19.12e%19.12e\n", ((double)e->TOW),
    2583             i & GPSEPHF_6HOURSFIT ? 6.0 : 4.0);
     2678            ConvLine(file, "%s%19.12e%19.12e\n", sep, ((double)e->TOW),
     2679            (i & GPSEPHF_6HOURSFIT) ? (Parser->rinex3 ? 1 : qzss ? 4.0 : 6.0)
     2680            : (Parser->rinex3 ? 0 : qzss ? 2.0 : 4.0));
    25842681            /* TOW */
    25852682          }
     
    31733270  const char *headerfile;
    31743271  const char *gpsephemeris;
     3272  const char *qzssephemeris;
    31753273  const char *glonassephemeris;
    31763274};
     
    31903288{ "user",             required_argument, 0, 'u'},
    31913289{ "gpsephemeris",     required_argument, 0, 'E'},
     3290{ "qzssephemeris",    required_argument, 0, 'Q'},
    31923291{ "glonassephemeris", required_argument, 0, 'G'},
    31933292{ "rinex3",           no_argument,       0, '3'},
     
    32003299{0,0,0,0}};
    32013300#endif
    3202 #define ARGOPT "-d:s:p:r:t:f:u:E:G:M:S:R:n:h3O"
     3301#define ARGOPT "-d:s:p:r:t:f:u:E:G:Q:M:S:R:n:h3O"
    32033302
    32043303enum MODE { HTTP = 1, RTSP = 2, NTRIP1 = 3, AUTO = 4, END };
     
    33303429  args->headerfile = 0;
    33313430  args->gpsephemeris = 0;
     3431  args->qzssephemeris = 0;
    33323432  args->glonassephemeris = 0;
    33333433  args->rinex3 = 0;
     
    33553455    case 'E': args->gpsephemeris = optarg; break;
    33563456    case 'G': args->glonassephemeris = optarg; break;
     3457    case 'Q': args->qzssephemeris = optarg; break;
    33573458    case 'r': args->port = optarg; break;
    33583459    case '3': args->rinex3 = 1; break;
     
    34293530    " -E " LONG_OPT("--gpsephemeris     ") "output file for GPS ephemeris data\n"
    34303531    " -G " LONG_OPT("--glonassephemeris ") "output file for GLONASS ephemeris data\n"
     3532    " -Q " LONG_OPT("--qzssephemeris    ") "output file for QZSS ephemeris data\n"
    34313533    " -3 " LONG_OPT("--rinex3           ") "output RINEX type 3 data\n"
    34323534    " -S " LONG_OPT("--proxyhost        ") "proxy name or address\n"
     
    35333635    Parser.glonassephemeris = args.glonassephemeris;
    35343636    Parser.gpsephemeris = args.gpsephemeris;
     3637    Parser.qzssephemeris = args.qzssephemeris;
    35353638    Parser.rinex3 = args.rinex3;
    35363639    Parser.changeobs = args.changeobs;
  • trunk/rtcm3torinex/lib/rtcm3torinex.h

    r5533 r5595  
    492492  const char * glonassephemeris;
    493493  const char * gpsephemeris;
     494  const char * qzssephemeris;
    494495  FILE *       glonassfile;
    495496  FILE *       gpsfile;
     497  FILE *       qzssfile;
    496498};
    497499
Note: See TracChangeset for help on using the changeset viewer.