From cd2b42b1ce9039860ee439566498020618e51cc6 Mon Sep 17 00:00:00 2001
From: Tim Everett <tim.everett3@gmail.com>
Date: Wed, 18 Dec 2019 11:44:22 -0700
Subject: [PATCH] - Add option to create CSV file of raw measurements in
 RTKCONV (set trace level to 1) - Move RTKCONV trace file to output file
 location and change name to match output file name - Minor fixes,
 improvements, and cleanup

---
 app/convbin/convbin.c    |   2 +-
 app/rtkconv/convmain.cpp |   7 ++++---
 app/rtkconv/convmain.dfm | Bin 19082 -> 36939 bytes
 src/pntpos.c             |   2 +-
 src/rinex.c              |  11 +++++++++++
 src/rtkcmn.c             |   4 ++++
 src/rtklib.h             |  11 ++++++-----
 src/rtkpos.c             |  16 ++++++++++++++--
 8 files changed, 41 insertions(+), 12 deletions(-)

diff --git a/app/convbin/convbin.c b/app/convbin/convbin.c
index d3c7e70..3ae7410 100644
--- a/app/convbin/convbin.c
+++ b/app/convbin/convbin.c
@@ -561,7 +561,7 @@ int main(int argc, char **argv)
         fprintf(stderr,"input format can not be recognized\n");
         return -1;
     }
-    sprintf(opt.prog,"%s %s",PRGNAME,VER_RTKLIB);
+    sprintf(opt.prog,"%s %s %s",PRGNAME,VER_RTKLIB,PATCH_LEVEL);
     sprintf(opt.comment[0],"log: %-55.55s",ifile);
     sprintf(opt.comment[1],"format: %s",formatstrs[format]);
     if (*opt.rcvopt) {
diff --git a/app/rtkconv/convmain.cpp b/app/rtkconv/convmain.cpp
index eede251..369f9af 100644
--- a/app/rtkconv/convmain.cpp
+++ b/app/rtkconv/convmain.cpp
@@ -38,7 +38,6 @@ TMainWindow *MainWindow;
 #define PRGNAME		"RTKCONV"  // program name
 #define MAXHIST		20		   // max number of histories
 #define TSTARTMARGIN 60.0	   // time margin for file name replacement
-#define TRACEFILE	"rtkconv.trace" // trace file
 
 static int abortf=0;
 
@@ -788,7 +787,7 @@ void __fastcall TMainWindow::ConvertFile(void)
 	AnsiString OutFile9_Text=OutFile9->Text;
 	int i,format,sat;
 	char file[1024]="",*ofile[9],ofile_[9][1024]={""},msg[256],*p;
-	char buff[256],tstr[32];
+	char buff[256],tstr[32],tracefile[1024];
 	double RNXVER[]={2.10,2.11,2.12,3.00,3.01,3.02,3.03};
 	FILE *fp;
 	
@@ -927,7 +926,9 @@ void __fastcall TMainWindow::ConvertFile(void)
 	Message		->Caption="";
 	
 	if (TraceLevel>0) {
-		traceopen(TRACEFILE);
+		strcpy(tracefile,ofile[0]);
+		strcat(tracefile,".trace");
+		traceopen(tracefile);
 		tracelevel(TraceLevel);
 	}
 	// convert to rinex
diff --git a/app/rtkconv/convmain.dfm b/app/rtkconv/convmain.dfm
index 2014eaa50577a7d5dec2f5e9cc538cb58c4e6fd6..96a5f160616c083279e88cc59837221722d1d602 100644
GIT binary patch
literal 36939
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

literal 19082
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
BU*-S+

diff --git a/src/pntpos.c b/src/pntpos.c
index 630cee0..274e4bc 100644
--- a/src/pntpos.c
+++ b/src/pntpos.c
@@ -309,7 +309,7 @@ static int valsol(const double *azel, const int *vsat, int n,
     /* chi-square validation of residuals */
     vv=dot(v,v,nv);
     if (nv>nx&&vv>chisqr[nv-nx-1]) {
-        sprintf(msg,"chi-square error nv=%d vv=%.1f cs=%.1f",nv,vv,chisqr[nv-nx-1]);
+        sprintf(msg,"Warning: large chi-square error nv=%d vv=%.1f cs=%.1f",nv,vv,chisqr[nv-nx-1]);
         /* return 0; */ /* threshold too strict for all use cases, report error but continue on */
     }
     /* large gdop check */
diff --git a/src/rinex.c b/src/rinex.c
index a55abc5..9761b3b 100644
--- a/src/rinex.c
+++ b/src/rinex.c
@@ -2200,6 +2200,17 @@ extern int outrnxobsb(FILE *fp, const rnxopt_t *opt, const obsd_t *obs, int n,
                 case 'S': outrnxobsf(fp,obs[ind[i]].SNR[k]*0.25,-1,-1); break;
             }
         }
+
+        /* set trace level to 1 generate CSV file of raw observations   */
+        if (gettracelevel()==1) {
+            trace(1,",%16.2f,%3d,%13.2f,%13.2f,%9.2f,%2.0f,%1d,%1d,%13.2f,%13.2f,%9.2f,%2.0f,%1d,%1d\n",
+                obs[0].time.time + obs[0].time.sec, obs[ind[i]].sat,
+                obs[ind[i]].P[0], obs[ind[i]].L[0], obs[ind[i]].D[0],
+                obs[ind[i]].SNR[0]*0.25, obs[ind[i]].LLI[0], obs[ind[i]].qualL[0],
+                obs[ind[i]].P[1], obs[ind[i]].L[1], obs[ind[i]].D[1],
+                obs[ind[i]].SNR[1]*0.25, obs[ind[i]].LLI[1], obs[ind[i]].qualL[1]);
+        }
+
         if (opt->rnxver>2.99&&fprintf(fp,"\n")==EOF) return 0;
     }
 
diff --git a/src/rtkcmn.c b/src/rtkcmn.c
index c94ef3b..da621ba 100644
--- a/src/rtkcmn.c
+++ b/src/rtkcmn.c
@@ -2946,6 +2946,10 @@ extern void tracelevel(int level)
 {
     level_trace=level;
 }
+extern int gettracelevel(void)
+{
+    return level_trace;
+}
 extern void trace(int level, const char *format, ...)
 {
     va_list ap;
diff --git a/src/rtklib.h b/src/rtklib.h
index f6c39a4..2c6a4a0 100644
--- a/src/rtklib.h
+++ b/src/rtklib.h
@@ -80,21 +80,21 @@ extern "C" {
 
 #define MAXFREQ     6                   /* max NFREQ */
 
-#define FREQL1      1.57542E9           /* L1/E1/B1  frequency (Hz) */
+#define FREQL1      1.57542E9           /* L1/E1  frequency (Hz) */
 #define FREQL2      1.22760E9           /* L2     frequency (Hz) */
 #define FREQE5b     1.20714E9           /* E5b    frequency (Hz) */
 #define FREQL5      1.17645E9           /* L5/E5a frequency (Hz) */
 #define FREQE6      1.27875E9           /* E6/LEX frequency (Hz) */
-#define FREQE5ab    1.191795E9          /* E5a+b/B2  frequency (Hz) */
+#define FREQE5ab    1.191795E9          /* E5a+b  frequency (Hz) */
 #define FREQs       2.492028E9           /* S      frequency (Hz) */
+#define FREQ1_CMP   1.561098E9          /* BeiDou B1 frequency (Hz) */
+#define FREQ2_CMP   1.20714E9           /* BeiDou B2 frequency (Hz) */
+#define FREQ3_CMP   1.26852E9           /* BeiDou B3 frequency (Hz) */
 #define FREQ1_GLO   1.60200E9           /* GLONASS G1 base frequency (Hz) */
 #define DFRQ1_GLO   0.56250E6           /* GLONASS G1 bias frequency (Hz/n) */
 #define FREQ2_GLO   1.24600E9           /* GLONASS G2 base frequency (Hz) */
 #define DFRQ2_GLO   0.43750E6           /* GLONASS G2 bias frequency (Hz/n) */
 #define FREQ3_GLO   1.202025E9          /* GLONASS G3 frequency (Hz) */
-#define FREQ1_CMP   1.561098E9          /* BeiDou B1 frequency (Hz) */
-#define FREQ2_CMP   1.20714E9           /* BeiDou B2 frequency (Hz) */
-#define FREQ3_CMP   1.26852E9           /* BeiDou B3 frequency (Hz) */
 
 #define EFACT_GPS   1.0                 /* error factor: GPS */
 #define EFACT_GLO   1.5                 /* error factor: GLONASS */
@@ -1564,6 +1564,7 @@ EXPORT void tracehnav(int level, const nav_t *nav);
 EXPORT void tracepeph(int level, const nav_t *nav);
 EXPORT void tracepclk(int level, const nav_t *nav);
 EXPORT void traceb   (int level, const unsigned char *p, int n);
+EXPORT int gettracelevel(void);
 
 /* platform dependent functions ----------------------------------------------*/
 EXPORT int execcmd(const char *cmd);
diff --git a/src/rtkpos.c b/src/rtkpos.c
index 9ed662f..f1e8f2c 100644
--- a/src/rtkpos.c
+++ b/src/rtkpos.c
@@ -413,6 +413,7 @@ static double varerr(int sat, int sys, double el, double snr_rover, double snr_b
 
     frq=f%nf;code=f<nf?0:1;
 
+    /* extended error model, not currently used */
     switch (sys) {
         case SYS_GPS: i = 0; break;
         case SYS_GLO: i = 1; break;
@@ -420,7 +421,6 @@ static double varerr(int sat, int sys, double el, double snr_rover, double snr_b
         default:      i = 0; break;
     }
     
-    /* extended error model, not currently used */
     if (code && opt->exterr.ena[0]) { /* code */
         a = opt->exterr.cerr[i][  frq * 2];
         b = opt->exterr.cerr[i][1+frq * 2];
@@ -431,6 +431,7 @@ static double varerr(int sat, int sys, double el, double snr_rover, double snr_b
         b = opt->exterr.perr[i][1+frq * 2];
         if (sys == SYS_SBS) {a *= EFACT_SBS; b *= EFACT_SBS;}
     }
+
     else { /* normal error model */
         if (opt->rcvstds&& obs->qualL[frq]!='\0'&&obs->qualP[frq]!='\0') {
             /* include err ratio and measurement std (P or L) from receiver */
@@ -441,7 +442,11 @@ static double varerr(int sat, int sys, double el, double snr_rover, double snr_b
         switch (sys) {
             case SYS_GPS: fact *= EFACT_GPS; break;
             case SYS_GLO: fact *= EFACT_GLO; break;
+            case SYS_GAL: fact *= EFACT_GAL; break;
             case SYS_SBS: fact *= EFACT_SBS; break;
+            case SYS_QZS: fact *= EFACT_QZS; break;
+            case SYS_CMP: fact *= EFACT_CMP; break;
+            case SYS_IRN: fact *= EFACT_IRN; break;
             default:      fact *= EFACT_GPS; break;
         }
         
@@ -1684,6 +1689,7 @@ static int resamb_LAMBDA(rtk_t *rtk, double *bias, double *xa,int gps,int glo,in
     prcopt_t *opt=&rtk->opt;
     int i,j,ny,nb,info,nx=rtk->nx,na=rtk->na;
     double *D,*DP,*y,*Qy,*b,*db,*Qb,*Qab,*QQ,s[2],var=0;
+    double QQb[MAXSAT];
     
     trace(3,"resamb_LAMBDA : nx=%d\n",nx);
     
@@ -1722,10 +1728,16 @@ static int resamb_LAMBDA(rtk_t *rtk, double *bias, double *xa,int gps,int glo,in
     matmul("NN",ny,ny,nx,1.0,DP,D     ,0.0,Qy);   /* Qy=DP'*D */
     
     /* phase-bias covariance (Qb) and real-parameters to bias covariance (Qab) */
-    for (i=0;i<nb;i++) for (j=0;j<nb;j++) Qb [i+j*nb]=Qy[na+i+(na+j)*ny];
+    for (i=0;i<nb;i++) {
+        QQb[i]= Qy[na+i+(na+i)*ny];
+        for (j=0;j<nb;j++) {
+            Qb [i+j*nb]=Qy[na+i+(na+j)*ny];
+        }
+    }
     for (i=0;i<na;i++) for (j=0;j<nb;j++) Qab[i+j*na]=Qy[   i+(na+j)*ny];
     
     trace(3,"N(0)=     "); tracemat(3,y+na,1,nb,7,2);
+    trace(3,"Qb  =     "); tracemat(3,QQb,1,nb,7,5);
     
     /* lambda/mlambda integer least-square estimation */
     /* return best integer solutions */
-- 
GitLab