Ignore:
Timestamp:
Feb 19, 2015, 6:18:47 PM (9 years ago)
Author:
stoecker
Message:

untested BDS support

File:
1 edited

Legend:

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

    r6552 r6599  
    447447        ge->TOW = 0.9999E9;
    448448        ret = 1019;
     449      }
     450      break;
     451    case RTCM3ID_BDS:
     452      {
     453        struct bdsephemeris *be;
     454        int sv, i, week, tow;
     455        be = &handle->ephemerisBDS;
     456        memset(be, 0, sizeof(*be));
     457
     458        GETBITS(sv, 6)
     459        be->satellite += PRN_BDS_START-1;
     460        GETBITS(be->BDSweek, 13)
     461        GETBITS(be->URAI, 4)
     462        GETFLOATSIGN(be->IDOT, 14, 1.0/(double)(1<<30)/(double)(1<<13))
     463        GETBITS(be->AODE, 5)
     464        GETBITS(be->TOC, 17)
     465        be->TOC <<= 3;
     466        GETFLOATSIGN(be->clock_driftrate, 11, 1.0/(double)(1<<30)/(double)(1<<30)/(double)(1<<6))
     467        GETFLOATSIGN(be->clock_drift, 22, 1.0/(double)(1<<30)/(double)(1<<20))
     468        GETFLOATSIGN(be->clock_bias, 24, 1.0/(double)(1<<30)/(double)(1<<3))
     469        GETBITS(be->AODC, 5)
     470        GETFLOATSIGN(be->Crs, 18, 1.0/(double)(1<<6))
     471        GETFLOATSIGN(be->Delta_n, 16, 1.0/(double)(1<<30)/(double)(1<<13))
     472        GETFLOATSIGN(be->M0, 32, 1.0/(double)(1<<30)/(double)(1<<1))
     473        GETFLOATSIGN(be->Cuc, 18, 1.0/(double)(1<<30)/(double)(1<<1))
     474        GETFLOAT(be->e, 32, 1.0/(double)(1<<30)/(double)(1<<3))
     475        GETFLOATSIGN(be->Cus, 18, 1.0/(double)(1<<30)/(double)(1<<1))
     476        GETFLOAT(be->sqrt_A, 32, 1.0/(double)(1<<19))
     477        GETBITS(be->TOE, 17)
     478        be->TOE <<= 3;
     479        GETFLOATSIGN(be->Cic, 18, 1.0/(double)(1<<30)/(double)(1<<1))
     480        GETFLOATSIGN(be->OMEGA0, 32, 1.0/(double)(1<<30)/(double)(1<<1))
     481        GETFLOATSIGN(be->Cis, 18, 1.0/(double)(1<<30)/(double)(1<<1))
     482        GETFLOATSIGN(be->i0, 32, 1.0/(double)(1<<30)/(double)(1<<1))
     483        GETFLOATSIGN(be->Crc, 18, 1.0/(double)(1<<8))
     484        GETFLOATSIGN(be->omega, 32, 1.0/(double)(1<<30)/(double)(1<<1))
     485        GETFLOATSIGN(be->OMEGADOT, 24, 1.0/(double)(1<<30)/(double)(1<<13))
     486        GETFLOATSIGN(be->TGD_B1_B3, 10, 0.000000001)
     487        GETFLOATSIGN(be->TGD_B2_B3, 10, 0.000000001)
     488        GETBITS(sv, 1)
     489        if(sv)
     490          be->flags |= BDSEPHF_SATH1;
     491        week = 1356+be->BDSweek;
     492        tow = 14+be->TOE;
     493        if(tow > 7*24*60*60) /* overflow due to leap */
     494        {
     495          ++week;
     496          tow -=  7*24*60*60;
     497        }
     498        i = (week - (int)handle->GPSWeek)*7*24*60*60
     499        + (tow - (int)handle->GPSTOW) - 2*60*60;
     500        if(i > 5*60*60 && i < 8*60*60)
     501        {
     502          handle->GPSTOW = tow;
     503          handle->GPSWeek = week;
     504        }
     505        ret = RTCM3ID_BDS;
    449506      }
    450507      break;
     
    12931350          GNSSENTRY_S1NDATA,GNSSDF2_LOCKLOSSL1,GPS_WAVELENGTH_L1,"1X"}
    12941351        };
    1295         struct CodeData compass[RTCM3_MSM_NUMSIG] =
     1352        struct CodeData bds[RTCM3_MSM_NUMSIG] =
    12961353        {
    12971354          {0,0,0,0,0,0,0},
    12981355          {GNSSENTRY_CB1DATA,GNSSENTRY_LB1DATA,GNSSENTRY_DB1DATA,
    1299           GNSSENTRY_SB1DATA,GNSSDF2_LOCKLOSSB1,COMPASS_WAVELENGTH_B1,"1I"},
     1356          GNSSENTRY_SB1DATA,GNSSDF2_LOCKLOSSB1,BDS_WAVELENGTH_B1,"1I"},
    13001357          {0,0,0,0,0,0,0},
    13011358          {0,0,0,0,0,0,0},
     
    13041361          {0,0,0,0,0,0,0},
    13051362          {GNSSENTRY_CB3DATA,GNSSENTRY_LB3DATA,GNSSENTRY_DB3DATA,
    1306           GNSSENTRY_SB3DATA,GNSSDF2_LOCKLOSSB3,COMPASS_WAVELENGTH_B3,"6I"},
     1363          GNSSENTRY_SB3DATA,GNSSDF2_LOCKLOSSB3,BDS_WAVELENGTH_B3,"6I"},
    13071364          {0,0,0,0,0,0,0},
    13081365          {0,0,0,0,0,0,0},
     
    13111368          {0,0,0,0,0,0,0},
    13121369          {GNSSENTRY_CB2DATA,GNSSENTRY_LB2DATA,GNSSENTRY_DB2DATA,
    1313           GNSSENTRY_SB2DATA,GNSSDF2_LOCKLOSSB2,COMPASS_WAVELENGTH_B2,"7I"},
     1370          GNSSENTRY_SB2DATA,GNSSDF2_LOCKLOSSB2,BDS_WAVELENGTH_B2,"7I"},
    13141371          {0,0,0,0,0,0,0},
    13151372          {0,0,0,0,0,0,0},
     
    13481405        if(type >= 1121)
    13491406        {
    1350           sys = RTCM3_MSM_COMPASS;
    1351           start = PRN_COMPASS_START;
     1407          sys = RTCM3_MSM_BDS;
     1408          start = PRN_BDS_START;
    13521409        }
    13531410        else if(type >= 1111)
     
    13771434        switch(sys)
    13781435        {
    1379         case RTCM3_MSM_COMPASS:
     1436        case RTCM3_MSM_BDS:
    13801437          GETBITS(i,30)
    13811438          i += 14000;
     
    15871644                wl = cd.wl;
    15881645                break;
    1589               case RTCM3_MSM_COMPASS:
    1590                 cd = compass[RTCM3_MSM_NUMSIG-j-1];
     1646              case RTCM3_MSM_BDS:
     1647                cd = bds[RTCM3_MSM_NUMSIG-j-1];
    15911648                wl = cd.wl;
    15921649                break;
     
    18481905  j = week*(7*24*60*60) + tow + 5*24*60*60;
    18491906  for(i = 1980; j >= (k = (365+longyear(i,0))*24*60*60); ++i)
     1907    j -= k;
     1908  c->year = i;
     1909  doy = 1+ (j / (24*60*60));
     1910  j %= (24*60*60);
     1911  c->hour = j / (60*60);
     1912  j %= (60*60);
     1913  c->minute = j / 60;
     1914  c->second = j % 60;
     1915  j = 0;
     1916  for(i = 1; j + (k = months[i] + longyear(c->year,i)) < doy; ++i)
     1917    j += k;
     1918  c->month = i;
     1919  c->day = doy - j;
     1920}
     1921
     1922void converttimebds(struct converttimeinfo *c, int week, int tow)
     1923{
     1924  int i, k, doy, j; /* temporary variables */
     1925  j = week*(7*24*60*60) + tow;
     1926  for(i = 2006; j >= (k = (365+longyear(i,0))*24*60*60); ++i)
    18501927    j -= k;
    18511928  c->year = i;
     
    21182195    }
    21192196
    2120     INITFLAGS(COMPASS)
    2121     CHECKFLAGSNEW(COMPASS, CB1,  C2I)
    2122     CHECKFLAGSNEW(COMPASS, LB1,  L2I)
    2123     CHECKFLAGSNEW(COMPASS, DB1,  D2I)
    2124     CHECKFLAGSNEW(COMPASS, SB1,  S2I)
    2125     CHECKFLAGSNEW(COMPASS, CB2,  C7I)
    2126     CHECKFLAGSNEW(COMPASS, LB2,  L7I)
    2127     CHECKFLAGSNEW(COMPASS, DB2,  D7I)
    2128     CHECKFLAGSNEW(COMPASS, SB2,  S7I)
    2129     CHECKFLAGSNEW(COMPASS, CB3,  C6I)
    2130     CHECKFLAGSNEW(COMPASS, LB3,  L6I)
    2131     CHECKFLAGSNEW(COMPASS, DB3,  D6I)
    2132     CHECKFLAGSNEW(COMPASS, SB3,  S6I)
     2197    INITFLAGS(BDS)
     2198    CHECKFLAGSNEW(BDS, CB1,  C2I)
     2199    CHECKFLAGSNEW(BDS, LB1,  L2I)
     2200    CHECKFLAGSNEW(BDS, DB1,  D2I)
     2201    CHECKFLAGSNEW(BDS, SB1,  S2I)
     2202    CHECKFLAGSNEW(BDS, CB2,  C7I)
     2203    CHECKFLAGSNEW(BDS, LB2,  L7I)
     2204    CHECKFLAGSNEW(BDS, DB2,  D7I)
     2205    CHECKFLAGSNEW(BDS, SB2,  S7I)
     2206    CHECKFLAGSNEW(BDS, CB3,  C6I)
     2207    CHECKFLAGSNEW(BDS, LB3,  L6I)
     2208    CHECKFLAGSNEW(BDS, DB3,  D6I)
     2209    CHECKFLAGSNEW(BDS, SB3,  S6I)
    21332210
    21342211    if(modified)
     
    21382215      i = 1+snprintf(buffer, buffersize,
    21392216      "C  %3d%-52.52s  SYS / # / OBS TYPES",
    2140       Parser->info[RTCM3_MSM_COMPASS].numtypes, Parser->fieldbufferCOMPASS);
    2141       if(Parser->info[RTCM3_MSM_COMPASS].numtypes>13)
     2217      Parser->info[RTCM3_MSM_BDS].numtypes, Parser->fieldbufferBDS);
     2218      if(Parser->info[RTCM3_MSM_BDS].numtypes>13)
    21422219      {
    21432220        i += snprintf(buffer+i-1, buffersize,
    2144         "\n      %-52.52s  SYS / # / OBS TYPES", Parser->fieldbufferCOMPASS+13*4);
     2221        "\n      %-52.52s  SYS / # / OBS TYPES", Parser->fieldbufferBDS+13*4);
    21452222      }
    21462223      buffer += i; buffersize -= i;
     
    25492626    while((r = RTCM3Parser(Parser)))
    25502627    {
    2551       if(r == 1020 || r == 1019 || r == 1044 || r == 1043)
     2628      if(r == 1020 || r == RTCM3ID_BDS || r == 1019 || r == 1044 || r == 1043)
    25522629      {
    25532630        FILE *file = 0;
     
    26602737            file = Parser->qzssfile;
    26612738          }
     2739          else if(r == RTCM3ID_BDS)
     2740          {
     2741            if(Parser->bdsephemeris)
     2742            {
     2743              if(!(Parser->bdsfile = fopen(Parser->bdsephemeris, "w")))
     2744              {
     2745                RTCM3Error("Could not open BDS ephemeris output file.\n");
     2746              }
     2747              else
     2748              {
     2749                char buffer[100];
     2750                fprintf(Parser->bdsfile,
     2751                "%9.2f%11sN: BDS NAV DATA%25sRINEX VERSION / TYPE\n", 2.1, "", "");
     2752                HandleRunBy(buffer, sizeof(buffer), 0, Parser->rinex3);
     2753                fprintf(Parser->bdsfile, "%s\n%60sEND OF HEADER\n", buffer, "");
     2754              }
     2755              Parser->bdsephemeris = 0;
     2756            }
     2757            file = Parser->bdsfile;
     2758          }
    26622759        }
    26632760        if(file)
     
    27222819            ConvLine(file, "%s%19.12e%19.12e%19.12e%19.12e\n", sep, e->z_pos,
    27232820            e->z_velocity, e->z_acceleration, (double)e->IODN);
     2821          }
     2822          else if(r == RTCM3ID_BDS)
     2823          {
     2824            struct bdsephemeris *e = &Parser->ephemerisBDS;
     2825            double d;                 /* temporary variable */
     2826            struct converttimeinfo cti;
     2827            converttimebds(&cti, e->BDSweek, e->TOC);
     2828            int num = e->satellite-PRN_BDS_START+1;
     2829
     2830            if(Parser->rinex3)
     2831            {
     2832              ConvLine(file,
     2833              "C%02d %04d %02d %02d %02d %02d %02d%19.12e%19.12e%19.12e\n",
     2834              num, cti.year, cti.month, cti.day, cti.hour,
     2835              cti.minute, cti.second, e->clock_bias, e->clock_drift,
     2836              e->clock_driftrate);
     2837              sep = "    ";
     2838            }
     2839            else
     2840            {
     2841              ConvLine(file,
     2842              "%02d %02d %02d %02d %02d %02d%05.1f%19.12e%19.12e%19.12e\n",
     2843              num, cti.year%100, cti.month, cti.day, cti.hour,
     2844              cti.minute, (double) cti.second, e->clock_bias, e->clock_drift,
     2845              e->clock_driftrate);
     2846            }
     2847            ConvLine(file, "%s%19.12e%19.12e%19.12e%19.12e\n", sep,
     2848            (double)e->AODE, e->Crs, e->Delta_n, e->M0);
     2849            ConvLine(file, "%s%19.12e%19.12e%19.12e%19.12e\n", sep, e->Cuc,
     2850            e->e, e->Cus, e->sqrt_A);
     2851            ConvLine(file, "%s%19.12e%19.12e%19.12e%19.12e\n", sep,
     2852            (double) e->TOE, e->Cic, e->OMEGA0, e->Cis);
     2853            ConvLine(file, "%s%19.12e%19.12e%19.12e%19.12e\n", sep, e->i0,
     2854            e->Crc, e->omega, e->OMEGADOT);
     2855            ConvLine(file, "%s%19.12e                   %19.12e\n", sep, e->IDOT,
     2856            (double) e->BDSweek);
     2857            if(e->URAI <= 6) /* URA index */
     2858              d = ceil(10.0*pow(2.0, 1.0+((double)e->URAI)/2.0))/10.0;
     2859            else
     2860              d = ceil(10.0*pow(2.0, ((double)e->URAI)/2.0))/10.0;
     2861            /* 15 indicates not to use satellite. We can't handle this special
     2862               case, so we create a high "non"-accuracy value. */
     2863            ConvLine(file, "%s%19.12e%19.12e%19.12e%19.12e\n", sep, d,
     2864            ((double) (e->flags & BDSEPHF_SATH1)), e->TGD_B1_B3,
     2865            e->TGD_B2_B3);
     2866
     2867            ConvLine(file, "%s%19.12e%19.12e\n", sep, ((double)e->TOW),
     2868            (double) e->AODC);
     2869            /* TOW, AODC */
    27242870          }
    27252871          else /* if(r == 1019 || r == 1044) */
     
    27832929            (i & GPSEPHF_6HOURSFIT) ? (Parser->rinex3 ? 1 : qzss ? 4.0 : 6.0)
    27842930            : (Parser->rinex3 ? 0 : qzss ? 2.0 : 4.0));
    2785             /* TOW */
     2931            /* TOW,Fit */
    27862932          }
    27872933        }
     
    28723018              sys[RTCM3_MSM_QZSS] = 1;
    28733019            }
    2874             else if(Parser->Data.satellites[i] >= PRN_COMPASS_START
    2875             && Parser->Data.satellites[i] <= PRN_COMPASS_END)
    2876             {
    2877               RTCM3Text("C%02d", Parser->Data.satellites[i] - (PRN_COMPASS_START-1));
    2878               sys[RTCM3_MSM_COMPASS] = 1;
     3020            else if(Parser->Data.satellites[i] >= PRN_BDS_START
     3021            && Parser->Data.satellites[i] <= PRN_BDS_END)
     3022            {
     3023              RTCM3Text("C%02d", Parser->Data.satellites[i] - (PRN_BDS_START-1));
     3024              sys[RTCM3_MSM_BDS] = 1;
    28793025            }
    28803026            else if(Parser->Data.satellites[i] >= PRN_SBAS_START
     
    29813127              }
    29823128            }
    2983             else if(sys[RTCM3_MSM_COMPASS])
    2984             {
    2985               for(j = 0; j < Parser->info[RTCM3_MSM_COMPASS].numtypes; ++j)
     3129            else if(sys[RTCM3_MSM_BDS])
     3130            {
     3131              for(j = 0; j < Parser->info[RTCM3_MSM_BDS].numtypes; ++j)
    29863132              {
    2987                 long long df = Parser->info[RTCM3_MSM_COMPASS].flags[j];
    2988                 int pos = Parser->info[RTCM3_MSM_COMPASS].pos[j];
     3133                long long df = Parser->info[RTCM3_MSM_BDS].flags[j];
     3134                int pos = Parser->info[RTCM3_MSM_BDS].pos[j];
    29893135                if((Parser->Data.dataflags[i] & df)
    29903136                && !isnan(Parser->Data.measdata[i][pos])
    29913137                && !isinf(Parser->Data.measdata[i][pos])
    29923138                && (Parser->Data.codetype[i][pos]
    2993                   && Parser->info[RTCM3_MSM_COMPASS].type[pos]
    2994                   && Parser->info[RTCM3_MSM_COMPASS].type[pos]
     3139                  && Parser->info[RTCM3_MSM_BDS].type[pos]
     3140                  && Parser->info[RTCM3_MSM_BDS].type[pos]
    29953141                  == Parser->Data.codetype[i][pos][1]))
    29963142                {
     
    31773323              RTCM3Text("J%02d", Parser->Data.satellites[i]
    31783324              - (PRN_QZSS_START-1));
    3179             else if(Parser->Data.satellites[i] >= PRN_COMPASS_START
    3180             && Parser->Data.satellites[i] <= PRN_COMPASS_END)
     3325            else if(Parser->Data.satellites[i] >= PRN_BDS_START
     3326            && Parser->Data.satellites[i] <= PRN_BDS_END)
    31813327              RTCM3Text("C%02d", Parser->Data.satellites[i]
    3182               - (PRN_COMPASS_START-1));
     3328              - (PRN_BDS_START-1));
    31833329            else
    31843330              RTCM3Text("%3d", Parser->Data.satellites[i]);
     
    32143360                RTCM3Text("J%02d", Parser->Data.satellites[i]
    32153361                - (PRN_QZSS_START-1));
    3216               else if(Parser->Data.satellites[i] >= PRN_COMPASS_START
    3217               && Parser->Data.satellites[i] <= PRN_COMPASS_END)
     3362              else if(Parser->Data.satellites[i] >= PRN_BDS_START
     3363              && Parser->Data.satellites[i] <= PRN_BDS_END)
    32183364                RTCM3Text("C%02d", Parser->Data.satellites[i]
    3219                 - (PRN_COMPASS_START-1));
     3365                - (PRN_BDS_START-1));
    32203366              else
    32213367                RTCM3Text("%3d", Parser->Data.satellites[i]);
     
    33773523  const char *qzssephemeris;
    33783524  const char *glonassephemeris;
     3525  const char *bdsephemeris;
    33793526};
    33803527
     
    33923539{ "header",           required_argument, 0, 'f'},
    33933540{ "user",             required_argument, 0, 'u'},
     3541{ "bdsephemeris",     required_argument, 0, 'C'},
    33943542{ "gpsephemeris",     required_argument, 0, 'E'},
    33953543{ "qzssephemeris",    required_argument, 0, 'Q'},
     
    34053553{0,0,0,0}};
    34063554#endif
    3407 #define ARGOPT "-d:s:p:r:t:f:u:E:G:B:Q:M:S:R:n:h3O"
     3555#define ARGOPT "-d:s:p:r:t:f:u:E:C:G:B:Q:M:S:R:n:h3O"
    34083556
    34093557enum MODE { HTTP = 1, RTSP = 2, NTRIP1 = 3, AUTO = 4, END };
     
    35383686  args->sbasephemeris = 0;
    35393687  args->glonassephemeris = 0;
     3688  args->bdsephemeris = 0;
    35403689  args->rinex3 = 0;
    35413690  args->nmea = 0;
     
    35603709    case 'd': args->data = optarg; break;
    35613710    case 'f': args->headerfile = optarg; break;
     3711    case 'C': args->bdsephemeris = optarg; break;
    35623712    case 'E': args->gpsephemeris = optarg; break;
    35633713    case 'B': args->sbasephemeris = optarg; break;
     
    36363786    " -t " LONG_OPT("--timeout          ") "timeout in seconds (default 60)\n"
    36373787    " -u " LONG_OPT("--user             ") "the user name\n"
     3788    " -C " LONG_OPT("--bdsephemeris     ") "output file for BDS ephemeris data\n"
    36383789    " -E " LONG_OPT("--gpsephemeris     ") "output file for GPS ephemeris data\n"
    36393790    " -G " LONG_OPT("--glonassephemeris ") "output file for GLONASS ephemeris data\n"
     
    37443895    Parser.glonassephemeris = args.glonassephemeris;
    37453896    Parser.gpsephemeris = args.gpsephemeris;
     3897    Parser.bdsephemeris = args.bdsephemeris;
    37463898    Parser.qzssephemeris = args.qzssephemeris;
    37473899    Parser.sbasephemeris = args.sbasephemeris;
Note: See TracChangeset for help on using the changeset viewer.