From ccd91b8fcb7771ec32d4198d77eb577f9a80f061 Mon Sep 17 00:00:00 2001
From: joanvallve <jvallve@iri.upc.edu>
Date: Fri, 24 Jul 2020 13:03:02 +0200
Subject: [PATCH] handling IODP and prn masks in SBAS msgs

---
 src/ephemeris.c |  6 ++--
 src/rcv/ublox.c |  4 +--
 src/sbas.c      | 84 +++++++++++++++++++++++++++++++++++++++----------
 3 files changed, 73 insertions(+), 21 deletions(-)

diff --git a/src/ephemeris.c b/src/ephemeris.c
index 40fe754..19086d7 100644
--- a/src/ephemeris.c
+++ b/src/ephemeris.c
@@ -567,7 +567,7 @@ static int satpos_sbas(gtime_t time, gtime_t teph, int sat, const nav_t *nav,
     }
     if (i>=nav->sbssat.nsat || sbs->lcorr.iode < 0) {
         trace(2,"no sbas correction for orbit: %s sat=%3d\n",time_str(time,0),sat);
-        printf("no sbas correction (i>=nav->sbssat.nsat || sbs->lcorr.iode < 0)\n",sat);
+        printf("no sbas correction (i>=nav->sbssat.nsat || sbs->lcorr.iode < 0)\n");
         if (ephpos(time,teph,sat,nav,-1,rs,dts,var,svh))
             *svh=-2;// JV: error code for detecting available ephemeris without sbas correction
         else
@@ -760,11 +760,11 @@ extern void satposs(gtime_t teph, const obsd_t *obs, int n, const nav_t *nav,
     int i,j;
 
     trace(3,"satposs : teph=%s n=%d ephopt=%d\n",time_str(teph,3),n,ephopt);
-    if (ephopt==2)
+    /*if (ephopt==2)
     {
         printf("====satposs : teph=%s n=%d ephopt=%d\n",time_str(teph,3),n,ephopt);
         print_sbassat(&nav->sbssat);
-    }
+    }*/
     
     for (i=0;i<n&&i<2*MAXOBS;i++) {
         for (j=0;j<6;j++) rs [j+i*6]=0.0;
diff --git a/src/rcv/ublox.c b/src/rcv/ublox.c
index 2b66585..b9d0944 100644
--- a/src/rcv/ublox.c
+++ b/src/rcv/ublox.c
@@ -523,7 +523,7 @@ static int decode_ephem(int sat, raw_t *raw)
     eph.sat=sat;
     raw->nav.eph[sat-1]=eph;
     raw->ephsat=sat;
-    printf("\tdecode_ephem eph.iode = %d\n", eph.iode);
+    printf("\tdecode_ephem sat %3d eph.iode = %d\n", sat, eph.iode);
     return 2;
 }
 /* decode almanac and ion/utc ------------------------------------------------*/
@@ -1022,7 +1022,7 @@ static int decode_enav(raw_t *raw, int sat, int off)
     eph.sat=sat;
     raw->nav.eph[sat-1]=eph;
     raw->ephsat=sat;
-    printf("\tdecode_enav eph.iode = %d\n", eph.iode);
+    printf("\tdecode_enav sat %3d eph.iode = %d\n", sat, eph.iode);
     return 2;
 }
 /* decode beidou navigation data ---------------------------------------------*/
diff --git a/src/sbas.c b/src/sbas.c
index f0aedae..e06504c 100644
--- a/src/sbas.c
+++ b/src/sbas.c
@@ -149,8 +149,11 @@ static void print_sbssatp(const sbssatp_t *sbssatp)
     printf("\tsat: %d\n", sbssatp->sat); /* satellite number */
     printf("\t\tfcorr:\t");
     print_sbsfcorr(&sbssatp->fcorr);/* fast correction */
-    printf("\t\tlcorr:\t");
-    print_sbslcorr(&sbssatp->lcorr);/* long term correction */
+    if (sbssatp->lcorr.iode > 0)
+    {
+        printf("\t\tlcorr:\t");
+        print_sbslcorr(&sbssatp->lcorr);/* long term correction */
+    }
 }
 /* print sbssat_t (JV) -------------------------------------------------------*/
 extern void print_sbassat(const sbssat_t *sbssat)
@@ -158,7 +161,7 @@ extern void print_sbassat(const sbssat_t *sbssat)
     printf("iodp: %d\n", sbssat->iodp); /* IODP (issue of date mask) */
     printf("tlat: %d\n", sbssat->tlat); /* system latency (s) */
     printf("nsat: %d\n", sbssat->nsat); /* number of satellites */
-    printf("sat:\n");
+    printf("sat[]:\n");
     for (int i = 0; i < sbssat->nsat; i++)
         print_sbssatp(&sbssat->sat[i]);
 }
@@ -170,6 +173,21 @@ static int decode_sbstype1(const sbsmsg_t *msg, sbssat_t *sbssat)
     trace(4,"decode_sbstype1:\n");
     //printf("\tdecode_sbstype1: \n");
     
+    // old_sat to store old data (to be used if changing IODP, prn mask)
+    sbssatp_t old_sat[MAXSAT];
+    int old_nsat = sbssat->nsat;
+    // store and remove old sat (if changing IODP)
+    if (sbssat->iodp!=getbitu(msg->msg,224,2))
+    {
+        sbssatp_t sbssat_zero = { 0 };
+        for (int i=0; i<MAXSAT;i++)
+        {
+            old_sat[i] = sbssat->sat[i];
+            sbssat->sat[i] = sbssat_zero;
+            sbssat->sat[i].lcorr.iode = -1;
+        }
+    }
+
     for (i=1,n=0;i<=210&&n<MAXSAT;i++) {
         if (getbitu(msg->msg,13+i,1)) {
            if      (i<= 37) sat=satno(SYS_GPS,i);    /*   0- 37: gps */
@@ -184,11 +202,31 @@ static int decode_sbstype1(const sbsmsg_t *msg, sbssat_t *sbssat)
            //printf("\t\tsat: %d\n",sat);
         }
     }
+
+    // copy from old data (if changing IODP)
+    if (sbssat->iodp!=getbitu(msg->msg,224,2))
+    {
+        printf("IODP CHANGED!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n");
+        sbssat_t sbssat_zero = { 0 };
+        for (int i=0, i_old=0; i<n&&i_old<old_nsat;)
+        {
+            if (old_sat[i_old].sat == sbssat->sat[i].sat)
+            {
+                sbssat->sat[i] = old_sat[i_old];
+                i++;
+                i_old++;
+            }
+            else if (old_sat[i_old].sat > sbssat->sat[i].sat)
+                i++;
+            else
+                i_old++;
+        }
+    }
     sbssat->iodp=getbitu(msg->msg,224,2);
     sbssat->nsat=n;
 
     trace(5,"decode_sbstype1: nprn=%d iodp=%d\n",n,sbssat->iodp);
-    printf("\tdecode_sbstype1: %d sats, iodp=%d\n",n,sbssat->iodp);
+    //printf("\tdecode_sbstype1: %d sats, iodp=%d\n",n,sbssat->iodp);
     return 1;
 }
 /* decode type 2-5,0: fast corrections ---------------------------------------*/
@@ -200,11 +238,14 @@ static int decode_sbstype2(const sbsmsg_t *msg, sbssat_t *sbssat)
     
     trace(4,"decode_sbstype2:\n");
 
-    if (sbssat->iodp!=(int)getbitu(msg->msg,16,2)) return 0;
+    if (sbssat->iodp!=(int)getbitu(msg->msg,16,2)){
+        printf("decode_sbstype24 wrong iodp %3d (current %3d)\n", (int)getbitu(msg->msg,16,2), sbssat->iodp);
+        return 0;
+    }
     
     type=getbitu(msg->msg, 8,6);
     iodf=getbitu(msg->msg,14,2);
-    printf("\tdecode_sbstype2: type=%d iodf=%d\n",type,iodf);
+    //printf("\tdecode_sbstype2: type=%d iodf=%d\n",type,iodf);
     
     for (i=0;i<13;i++) {
         if ((j=13*((type==0?2:type)-2)+i)>=sbssat->nsat) break;
@@ -245,7 +286,7 @@ static int decode_sbstype6(const sbsmsg_t *msg, sbssat_t *sbssat)
         sbssat->sat[i].fcorr.udre=udre+1;
     }
     trace(5,"decode_sbstype6: iodf=%d %d %d %d\n",iodf[0],iodf[1],iodf[2],iodf[3]);
-    printf("\tdecode_sbstype6: iodf=%d %d %d %d\n",iodf[0],iodf[1],iodf[2],iodf[3]);
+    //printf("\tdecode_sbstype6: iodf=%d %d %d %d\n",iodf[0],iodf[1],iodf[2],iodf[3]);
     return 1;
 }
 /* decode type 7: fast correction degradation factor -------------------------*/
@@ -255,8 +296,10 @@ static int decode_sbstype7(const sbsmsg_t *msg, sbssat_t *sbssat)
     
     trace(4,"decode_sbstype7\n");
     
-    if (sbssat->iodp!=(int)getbitu(msg->msg,18,2)) return 0;
-    
+    if (sbssat->iodp!=(int)getbitu(msg->msg,18,2)){
+        printf("decode_sbstype24 wrong iodp %3d (current %3d)\n", (int)getbitu(msg->msg,18,2), sbssat->iodp);
+        return 0;
+    }
     sbssat->tlat=getbitu(msg->msg,14,4);
     
     for (i=0;i<sbssat->nsat&&i<MAXSAT;i++) {
@@ -346,7 +389,7 @@ static int decode_longcorr0(const sbsmsg_t *msg, int p, sbssat_t *sbssat)
     if (n==0||n>MAXSAT) return 0;
     
     sbssat->sat[n-1].lcorr.iode=getbitu(msg->msg,p+6,8);
-    printf("\tdecode_longcorr0: sat=%d iode=%d\n",sbssat->sat[n-1].sat,sbssat->sat[n-1].lcorr.iode);
+    printf("\tdecode_longcorr0: sat=%d n=%d iode=%d\n",sbssat->sat[n-1].sat,n,sbssat->sat[n-1].lcorr.iode);
     
     for (i=0;i<3;i++) {
         sbssat->sat[n-1].lcorr.dpos[i]=getbits(msg->msg,p+14+9*i,9)*0.125;
@@ -369,7 +412,7 @@ static int decode_longcorr1(const sbsmsg_t *msg, int p, sbssat_t *sbssat)
     if (n==0||n>MAXSAT) return 0;
     
     sbssat->sat[n-1].lcorr.iode=getbitu(msg->msg,p+6,8);
-    printf("\tdecode_longcorr1: sat=%d iode=%d\n",sbssat->sat[n-1].sat,sbssat->sat[n-1].lcorr.iode);
+    printf("\tdecode_longcorr1: sat=%d n=%d iode=%d\n",sbssat->sat[n-1].sat,n,sbssat->sat[n-1].lcorr.iode);
     
     for (i=0;i<3;i++) {
         sbssat->sat[n-1].lcorr.dpos[i]=getbits(msg->msg,p+14+i*11,11)*0.125;
@@ -408,7 +451,10 @@ static int decode_sbstype24(const sbsmsg_t *msg, sbssat_t *sbssat)
     
     trace(4,"decode_sbstype24:\n");
     
-    if (sbssat->iodp!=(int)getbitu(msg->msg,110,2)) return 0; /* check IODP */
+    if (sbssat->iodp!=(int)getbitu(msg->msg,110,2)){
+        printf("decode_sbstype24 wrong iodp %3d (current %3d)\n", (int)getbitu(msg->msg,110,2), sbssat->iodp);
+        return 0; /* check IODP */
+    }
     
     blk =getbitu(msg->msg,112,2);
     iodf=getbitu(msg->msg,114,2);
@@ -421,7 +467,7 @@ static int decode_sbstype24(const sbsmsg_t *msg, sbssat_t *sbssat)
         sbssat->sat[j].fcorr.prc =getbits(msg->msg,14+i*12,12)*0.125f;
         sbssat->sat[j].fcorr.udre=udre+1;
         sbssat->sat[j].fcorr.iodf=iodf;
-        printf("\tdecode_sbstype24: sat=%2d fcorr.iodf=%2d\n",sbssat->sat[j].sat,iodf);
+        //printf("\tdecode_sbstype24: sat=%2d fcorr.iodf=%2d\n",sbssat->sat[j].sat,iodf);
     }
     return decode_longcorrh(msg,120,sbssat);
 }
@@ -476,6 +522,9 @@ extern int sbsupdatecorr(const sbsmsg_t *msg, nav_t *nav)
     
     if (msg->week==0) return -1;
     
+    printf("============== sbsupdatecorr: PROCESSING type=%d...\n",type);
+    print_sbassat(&nav->sbssat);
+
     switch (type) {
         case  0: stat=decode_sbstype2 (msg,&nav->sbssat); break;
         case  1: stat=decode_sbstype1 (msg,&nav->sbssat); break;
@@ -494,8 +543,8 @@ extern int sbsupdatecorr(const sbsmsg_t *msg, nav_t *nav)
         
         /*default: trace(2,"unsupported sbas message: type=%d\n",type); break;*/
     }
-    //printf("sbsupdatecorr: type=%d PROCESSED result = %d!\n",type, stat?type:-1);
-
+    printf("============== sbsupdatecorr: type=%d PROCESSED result = %d!\n",type, stat?type:-1);
+    print_sbassat(&nav->sbssat);
     return stat?type:-1;
 }
 /* read sbas log file --------------------------------------------------------*/
@@ -838,6 +887,7 @@ static int sbslongcorr(gtime_t time, int sat, const sbssat_t *sbssat,
         if (fabs(t)>MAXSBSAGEL) {
             trace(2,"sbas long-term correction expired: %s sat=%2d t=%5.0f\n",
                   time_str(time,0),sat,t);
+            printf("sbas long-term corr expired");
             return 0;
         }
         for (i=0;i<3;i++) drs[i]=p->lcorr.dpos[i]+p->lcorr.dvel[i]*t;
@@ -852,6 +902,7 @@ static int sbslongcorr(gtime_t time, int sat, const sbssat_t *sbssat,
     if (satsys(sat,NULL)==SYS_SBS) return 1;
     
     trace(2,"no sbas long-term correction: %s sat=%2d\n",time_str(time,0),sat);
+    printf("no sbas long-term corr");
     return 0;
 }
 /* fast correction -----------------------------------------------------------*/
@@ -869,7 +920,7 @@ static int sbsfastcorr(gtime_t time, int sat, const sbssat_t *sbssat,
         t=timediff(time,p->fcorr.t0)+sbssat->tlat;
         
         /* expire age of correction or UDRE==14 (not monitored) */
-        if (fabs(t)>MAXSBSAGEF||p->fcorr.udre>=15) continue;
+        if (fabs(t)>MAXSBSAGEF||p->fcorr.udre>=14/*JV 15*/) continue;
         *prc=p->fcorr.prc;
 #ifdef RRCENA
         if (p->fcorr.ai>0&&fabs(t)<=8.0*p->fcorr.dt) {
@@ -883,6 +934,7 @@ static int sbsfastcorr(gtime_t time, int sat, const sbssat_t *sbssat,
         return 1;
     }
     trace(2,"no sbas fast correction: %s sat=%2d\n",time_str(time,0),sat);
+    printf("no sbas fast corr");
     return 0;
 }
 /* sbas satellite ephemeris and clock correction -------------------------------
-- 
GitLab