Ignore:
Timestamp:
Sep 20, 2019, 2:46:25 PM (5 years ago)
Author:
stuerze
Message:

IRNSS support is added in RTCM3 decoder, RTCM signal mapping IDs for GLONASS and BDS are updated/extended

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/src/RTCM3/RTCM3Decoder.cpp

    r8783 r8801  
    243243        {GPS_WAVELENGTH_L1, "1P"},
    244244        {GPS_WAVELENGTH_L1, "1W"},
    245         {0.0, 0}/*{GPS_WAVELENGTH_L1,"1Y"}*/,
     245        {0.0, 0},
    246246        {0.0, 0},
    247247        {0.0, 0},
     
    249249        {GPS_WAVELENGTH_L2, "2P"},
    250250        {GPS_WAVELENGTH_L2, "2W"},
    251         {0.0, 0}/*{GPS_WAVELENGTH_L2,"2Y"}*/,
     251        {0.0, 0},
    252252        {0.0, 0},
    253253        {0.0, 0},
     
    288288        {1.0, "2C"},
    289289        {1.0, "2P"},
    290         {0.0, 0},
    291         {0.0, 0},
    292         {0.0, 0},
    293         {0.0, 0},
    294         {0.0, 0},
    295         {0.0, 0},
    296         {0.0, 0},
    297         {0.0, 0},
    298         {0.0, 0},
     290        {GLO_WAVELENGTH_L1a, "4A"},
     291        {GLO_WAVELENGTH_L1a, "4B"},
     292        {GLO_WAVELENGTH_L1a, "4X"},
     293        {GLO_WAVELENGTH_L2a, "6A"},
     294        {GLO_WAVELENGTH_L2a, "6B"},
     295        {GLO_WAVELENGTH_L2a, "6X"},
     296        {GLO_WAVELENGTH_L3,  "3I"},
     297        {GLO_WAVELENGTH_L3,  "3Q"},
     298        {GLO_WAVELENGTH_L3,  "3X"},
    299299        {0.0, 0},
    300300        {0.0, 0},
     
    316316static struct CodeData gal[RTCM3_MSM_NUMSIG] = {
    317317        {0.0, 0},
    318         {GAL_WAVELENGTH_E1, "1C"},
    319         {GAL_WAVELENGTH_E1, "1A"},
    320         {GAL_WAVELENGTH_E1, "1B"},
    321         {GAL_WAVELENGTH_E1, "1X"},
    322         {GAL_WAVELENGTH_E1, "1Z"},
    323         {0.0, 0},
    324         {GAL_WAVELENGTH_E6, "6C"},
    325         {GAL_WAVELENGTH_E6, "6A"},
    326         {GAL_WAVELENGTH_E6, "6B"},
    327         {GAL_WAVELENGTH_E6, "6X"},
    328         {GAL_WAVELENGTH_E6, "6Z"},
     318        {GAL_WAVELENGTH_E1,  "1C"},
     319        {GAL_WAVELENGTH_E1,  "1A"},
     320        {GAL_WAVELENGTH_E1,  "1B"},
     321        {GAL_WAVELENGTH_E1,  "1X"},
     322        {GAL_WAVELENGTH_E1,  "1Z"},
     323        {0.0, 0},
     324        {GAL_WAVELENGTH_E6,  "6C"},
     325        {GAL_WAVELENGTH_E6,  "6A"},
     326        {GAL_WAVELENGTH_E6,  "6B"},
     327        {GAL_WAVELENGTH_E6,  "6X"},
     328        {GAL_WAVELENGTH_E6,  "6Z"},
    329329        {0.0, 0},
    330330        {GAL_WAVELENGTH_E5B, "7I"},
     
    332332        {GAL_WAVELENGTH_E5B, "7X"},
    333333        {0.0, 0},
    334         {GAL_WAVELENGTH_E5AB, "8I"},
    335         {GAL_WAVELENGTH_E5AB, "8Q"},
    336         {GAL_WAVELENGTH_E5AB, "8X"},
     334        {GAL_WAVELENGTH_E5AB,"8I"},
     335        {GAL_WAVELENGTH_E5AB,"8Q"},
     336        {GAL_WAVELENGTH_E5AB,"8X"},
    337337        {0.0, 0},
    338338        {GAL_WAVELENGTH_E5A, "5I"},
     
    346346        {0.0, 0},
    347347        {0.0, 0},
    348         {0.0, 0},
     348        {0.0, 0}
    349349    };
    350350
     
    406406        {0.0, 0},
    407407        {0.0, 0},
    408         {0.0, 0},
    409         {0.0, 0},
    410         {0.0, 0},
    411         {0.0, 0},
    412         {0.0, 0},
    413         {0.0, 0},
    414         {0.0, 0},
    415         {0.0, 0},
    416         {0.0, 0},
     408        {BDS_WAVELENGTH_B1C, "1D"},
     409        {BDS_WAVELENGTH_B1C, "1P"},
     410        {BDS_WAVELENGTH_B1C, "1X"},
     411        {0.0, 0},
     412        {0.0, 0},
     413        {0.0, 0},
     414        {BDS_WAVELENGTH_B2a, "5D"},
     415        {BDS_WAVELENGTH_B2a, "5P"},
     416        {BDS_WAVELENGTH_B2a, "5X"},
    417417        {0.0, 0},
    418418        {0.0, 0},
     
    465465//
    466466////////////////////////////////////////////////////////////////////////////
    467 bool RTCM3Decoder::DecodeRTCM3MSM(unsigned char* data, int size)
    468     {
     467bool RTCM3Decoder::DecodeRTCM3MSM(unsigned char* data, int size) {
    469468  bool decoded = false;
    470469  int type, syncf, i;
     
    525524    int sigmask, numsat = 0, numsig = 0;
    526525    uint64_t satmask, cellmask, ui;
    527     double rrmod[RTCM3_MSM_NUMSAT];
    528     int rrint[RTCM3_MSM_NUMSAT], rdop[RTCM3_MSM_NUMSAT],
    529         extsat[RTCM3_MSM_NUMSAT];
    530     int ll[RTCM3_MSM_NUMCELLS]/*, hc[RTCM3_MSM_NUMCELLS]*/;
    531     double cnr[RTCM3_MSM_NUMCELLS];
    532     double cp[RTCM3_MSM_NUMCELLS], psr[RTCM3_MSM_NUMCELLS],
    533         dop[RTCM3_MSM_NUMCELLS];
     526    // satellite data
     527    double rrmod[RTCM3_MSM_NUMSAT]; // GNSS sat rough ranges modulo 1 millisecond
     528    int    rrint[RTCM3_MSM_NUMSAT]; // number of integer msecs in GNSS sat rough ranges
     529    int    rdop[RTCM3_MSM_NUMSAT];  // GNSS sat rough phase range rates
     530    int    extsat[RTCM3_MSM_NUMSAT];// extended sat info
     531    // signal data
     532    int    ll[RTCM3_MSM_NUMCELLS];  // lock time indicator
     533    /*int    hc[RTCM3_MSM_NUMCELLS];*/  // half cycle ambiguity indicator
     534    double cnr[RTCM3_MSM_NUMCELLS]; // signal cnr
     535    double cp[RTCM3_MSM_NUMCELLS];  // fine phase range data
     536    double psr[RTCM3_MSM_NUMCELLS]; // fine psr
     537    double dop[RTCM3_MSM_NUMCELLS]; // fine phase range rates
    534538
    535539    SKIPBITS(3 + 7 + 2 + 2 + 1 + 3)
     
    547551    i = numsat * numsig;
    548552    GETBITS64(cellmask, (unsigned )i)
    549 
     553    // satellite data
    550554    switch (type % 10) {
    551555      case 1:
     
    575579        break;
    576580    }
    577 
     581    // signal data
    578582    int numcells = numsat * numsig;
    579583    /** Drop anything which exceeds our cell limit. Increase limit definition
     
    726730              {
    727731                int k = GLOFreq[RTCM3_MSM_NUMSAT - i - 1];
    728                 if (extsat[numsat] < 14) {
    729                   k = GLOFreq[RTCM3_MSM_NUMSAT - i - 1] = 100 + extsat[numsat]
    730                       - 7;
     732                if (extsat[numsat] < 14) { // channel number is available as extended info for MSM5/7
     733                  k = GLOFreq[RTCM3_MSM_NUMSAT - i - 1] = 100 + extsat[numsat] - 7;
    731734                }
    732                 if (k)
    733                   cd.wl = (
    734                       cd.wl == 0.0 ?
    735                           GLO_WAVELENGTH_L1(k - 100) :
    736                           GLO_WAVELENGTH_L2(k - 100));
    737                 else
     735                if (k) {
     736                  if      (cd.wl == 0.0) {
     737                    cd.wl = GLO_WAVELENGTH_L1(k - 100);
     738                  }
     739                  else if (cd.wl == 1.0) {
     740                    cd.wl = GLO_WAVELENGTH_L2(k - 100);
     741                  }
     742                }
     743                else if (!k && cd.wl <= 1) {
    738744                  cd.code = 0;
     745                }
    739746              }
    740747              break;
     
    754761                if (psr[count] > -1.0 / (1 << 10)) {
    755762                  frqObs->_code = psr[count] * LIGHTSPEED / 1000.0
    756                       + (rrmod[numsat]) * LIGHTSPEED / 1000.0;
     763                                + (rrmod[numsat]) * LIGHTSPEED / 1000.0;
    757764                  frqObs->_codeValid = true;
    758765                }
     
    761768                if (cp[count] > -1.0 / (1 << 8)) {
    762769                  frqObs->_phase = cp[count] * LIGHTSPEED / 1000.0 / cd.wl
    763                       + (rrmod[numsat]) * LIGHTSPEED / 1000.0 / cd.wl;
     770                                 + (rrmod[numsat]) * LIGHTSPEED / 1000.0 / cd.wl;
    764771                  frqObs->_phaseValid = true;
    765772                  frqObs->_lockTime = lti2sec(type,ll[count]);
     
    771778                if (psr[count] > -1.0 / (1 << 10)) {
    772779                  frqObs->_code = psr[count] * LIGHTSPEED / 1000.0
    773                       + (rrmod[numsat]) * LIGHTSPEED / 1000.0;
     780                                + (rrmod[numsat]) * LIGHTSPEED / 1000.0;
    774781                  frqObs->_codeValid = true;
    775782                }
    776 
    777783                if (cp[count] > -1.0 / (1 << 8)) {
    778784                  frqObs->_phase = cp[count] * LIGHTSPEED / 1000.0 / cd.wl
    779                       + rrmod[numsat] * LIGHTSPEED / 1000.0 / cd.wl;
     785                                 + rrmod[numsat] * LIGHTSPEED / 1000.0 / cd.wl;
    780786                  frqObs->_phaseValid = true;
    781787                  frqObs->_lockTime = lti2sec(type,ll[count]);
     
    787793                if (psr[count] > -1.0 / (1 << 10)) {
    788794                  frqObs->_code = psr[count] * LIGHTSPEED / 1000.0
    789                       + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0;
     795                                + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0;
    790796                  frqObs->_codeValid = true;
    791797                }
    792 
    793798                if (cp[count] > -1.0 / (1 << 8)) {
    794799                  frqObs->_phase = cp[count] * LIGHTSPEED / 1000.0 / cd.wl
    795                       + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0
    796                           / cd.wl;
     800                                 + (rrmod[numsat] +  rrint[numsat]) * LIGHTSPEED / 1000.0 / cd.wl;
    797801                  frqObs->_phaseValid = true;
    798802                  frqObs->_lockTime = lti2sec(type,ll[count]);
     
    800804                  frqObs->_slipCounter = ll[count];
    801805                }
    802 
    803806                frqObs->_snr = cnr[count];
    804807                frqObs->_snrValid = true;
     
    807810                if (psr[count] > -1.0 / (1 << 10)) {
    808811                  frqObs->_code = psr[count] * LIGHTSPEED / 1000.0
    809                       + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0;
     812                                + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0;
    810813                  frqObs->_codeValid = true;
    811814                }
    812 
    813815                if (cp[count] > -1.0 / (1 << 8)) {
    814816                  frqObs->_phase = cp[count] * LIGHTSPEED / 1000.0 / cd.wl
    815                       + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0
    816                           / cd.wl;
     817                                 + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0 / cd.wl;
    817818                  frqObs->_phaseValid = true;
    818819                  frqObs->_lockTime = lti2sec(type,ll[count]);
     
    820821                  frqObs->_slipCounter = ll[count];
    821822                }
    822 
    823823                frqObs->_snr = cnr[count];
    824824                frqObs->_snrValid = true;
    825 
    826825                if (dop[count] > -1.6384) {
    827826                  frqObs->_doppler = -(dop[count] + rdop[numsat]) / cd.wl;
     
    832831                if (psr[count] > -1.0 / (1 << 10)) {
    833832                  frqObs->_code = psr[count] * LIGHTSPEED / 1000.0
    834                       + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0;
     833                                + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0;
    835834                  frqObs->_codeValid = true;
    836835                }
    837 
    838836                if (cp[count] > -1.0 / (1 << 8)) {
    839837                  frqObs->_phase = cp[count] * LIGHTSPEED / 1000.0 / cd.wl
    840                       + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0
    841                           / cd.wl;
     838                                 + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0 / cd.wl;
    842839                  frqObs->_phaseValid = true;
    843840                  frqObs->_lockTime = lti2sec(type,ll[count]);
     
    852849                if (psr[count] > -1.0 / (1 << 10)) {
    853850                  frqObs->_code = psr[count] * LIGHTSPEED / 1000.0
    854                       + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0;
     851                                + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0;
    855852                  frqObs->_codeValid = true;
    856853                }
    857 
    858854                if (cp[count] > -1.0 / (1 << 8)) {
    859855                  frqObs->_phase = cp[count] * LIGHTSPEED / 1000.0 / cd.wl
    860                       + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0
    861                           / cd.wl;
     856                                 + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0 / cd.wl;
    862857                  frqObs->_phaseValid = true;
    863858                  frqObs->_lockTime = lti2sec(type,ll[count]);
     
    879874        }
    880875      }
    881       if (CurrentObs._obs.size() > 0)
     876      if (CurrentObs._obs.size() > 0) {
    882877        _CurrentObsList.push_back(CurrentObs);
     878      }
    883879    }
    884880  }
     
    11181114    GETBITS(i, 1)
    11191115    tk += i * 30;
    1120     eph._tki = tk < 3 * 60 * 60 ? tk - 3 * 60 * 60 + 86400 : tk - 3 * 60 * 60;
     1116    eph._tki = tk - 3*60*60;
     1117    if(eph._tki < 0.0) {
     1118      eph._tki += 86400.0;
     1119    }
    11211120    GETBITS(eph._health, 1) /* MSB of Bn*/
    11221121    GETBITS(eph._P2, 1)  /* P2 */
Note: See TracChangeset for help on using the changeset viewer.