/* Usage: TBtool file.trb or cat file.trb | TBtool for help type TBtool -h root: TBlite of L. Romans, JPL modify by D. Dong to perform multiple tasks and bad byte checking 10/09/1999 v1.0 01/22/2001 first release to public */ #include #include #include #include #include #include "TBtool.h" #define pik(A,N) pick((byte*)&A, N, (int)sizeof(A)) #define DEFAULT_CONFIG_FLAG configNone char buf[512]; double chip, chip1, chip2, Lcut, acoef1, acoef2; long ttag; struct tm T; int p2g[32]; void get_p2g(long epoch, FILE *fp); char version[] = "TBtool v1.0"; static int headflg = 1, normalread = 1, add_head = 1, get_P1hirate = 0, get_CAhirate=0; double minrange = 1.0e7; double maxrange = 4.0e7; double maxCAfaz = 4.0e8; double rmin = 7000.0; double rmax = 8000.0; double vmin = 7.0; double vmax = 8.0; prn_t P[32], *pP, P_temp[50]; unsigned short snr_temp[MAX_PRN][6],sat_count[MAX_PRN][6]; long ttag_last = -1; long ttagH_last = -1; time_t tt; struct tm *pT; int snr2n(unsigned short s); main(int argc, char** argv) { FILE *infile,*outfile,*ftemp,*fttp,*headfile,*p2gfile; cmdLineData cmdLine, *cmdL; runConfigData runConfig; dataStatusList dataList; int i, j, ix_pos, lli; byte typ, len, samp, obstyp, Seg1Flags, Seg1Pad, chanum, satnum, faztyp, sampnum, ba, bb, extra_rec = 0; char prn, chan, nsamp, antnum, sampint, prevPrn[50]; short faz0_flags; long ttag2, Seg1Length, lenread, Seg1Subtype, Seg1ttag; double faz_bias, faz, tau, tau1, dt, t, faz_CA, tau_CA, faz_sav; double xx[4], vv[4], xr, vr, lamda1,faz_L1,tau_L1; float faz_dot, faz_res, faz_res2, faz_P[2], tau_P[2], fazdot_P[2], fazddot_P[2]; unsigned short snr[6]; size_t numread; char *cline = "wc -c ", *catline = "cat temprinexfile >> ", *addheadline = "cat ", *gzcatline = "gzcat ", *newinfile; byte cleaning = 1, bad_lrate = 0, bad_hrate = 0, bad_50hz = 0, repair = 0, repair_fail = 0, misl11 = 0, misl21 = 0; short catchbyte = 0, oldcatch = 0, snr_diff = 5000, snr_d, snr_ref[MAX_PRN], snr_r; short rec_diff = 5000, rec_d, eff_sat=0; long prevTtag[50]; long recd_num = 0, qm_rec_num = 0; float sigma; unsigned long configsav; short hr_samp,hr_samp1,hr_samp2,hr_s=0,hr_s1=1,hr_s2=1; byte zipfil = 0; long ttag1, time1, time2,ttag_prev; char chan1, chan2, prn_1, nobs; float faz1,faz2,faz_prev[4]; double snr_conv_50, obs[50], epoch, brk, faz50hz[MAX_PRN][50],snr50hz[MAX_PRN][50],snr_l2; double p1hirate[MAX_PRN],qm_ttag = 0.0; double Psnr_50hz[52],P2snr_50hz[52]; int epoch_set = 0, mtyp; char *rcv_s, gps_s[6], *dtyp_s, gzcatcmd[160]; char c_dum; short s_dum, s_dum1, recd_50hz[52], shift_50hz[50],Pfaz_50hz[52],P2faz_50hz[52]; long l_dum; float f_dum; double d_dum; int yr; unsigned char uc_dum; unsigned short us_dum, us_dum1, snr_50hz[52]; unsigned long ul_dum; configFlag = DEFAULT_CONFIG_FLAG; configsav = configFlag; parseCmdLine (argc, argv, &cmdLine, &runConfig); cmdL = &cmdLine; len = strlen(cmdL->inFileName); if (cmdL->inFileName[len-1] == 'Z' || cmdL->inFileName[len-1] == 'z') { zipfil = 1; sprintf(gzcatcmd,"gzcat %s > tmp_input.trb",cmdL->inFileName); /* printf(" process compressed input file = [%s]\n",cmdL->inFileName); */ gzcatline = gzcatcmd; system(gzcatline); newinfile = "tmp_input.trb"; } else { newinfile = cmdL->inFileName; } if (argc == 1 || !(infile = fopen(newinfile, "rb"))) { if (strlen(newinfile) > 1) printf(" Can not open file : %s\n",cmdL->inFileName); infile = stdin; } if (argc == 1 || !(outfile = fopen(cmdL->outFileName, "w+"))) { outfile = stdout; } if (configFlagTst(prtHeadFile,configFlag) && !(headfile = fopen(cmdL->headFileName, "r"))) { add_head = 0; } if (configFlagTst(prtQmFmt,configFlag) && !(p2gfile = fopen(cmdL->p2gFileName, "r"))) { printf(" Can not open file : %s\n",cmdL->p2gFileName); exit(0); } fttp = fopen("temprinexfile","w+"); chip = (double)299792458 / (double)10230000; /* CA wavelength ~ 30m */ chip1 = chip/(double)154; chip2 = chip/(double)120; acoef1 = 1.0/(1.0-((double)(120*120))/((double)(154*154))); acoef2 = 1.0-acoef1; snr_conv_50 = 50.0 * 4.0 / sqrt(20.456e6 * .75 * .9 * 2.0); lamda1 = (double)299792458/(double)1575420000; /* initialize */ dataList.recordSpan[0] = 0; loop(i,MAX_PRN) { dataList.satSpan[i][0] = 0; dataList.prnChan[i] = 0; snr_ref[i] = 0; sat_count[i][0] = 0; } loop(i,9) { dataList.recordCounter[i][0] = 0; dataList.recordCounter[i][1] = 0; } ttag_prev = 0; faz_prev[0] = 0.0; faz_prev[1] = 0.0; faz_prev[2] = 0.0; faz_prev[3] = 0.0; /* format variables for QM format output */ rcv_s = "MET"; dtyp_s = "L1"; brk = 0.0; sigma = 0.0; nobs = 2; rcv_s = cmdL->refSatName; mtyp = runConfig.mtype; cleaning = configFlagTst(cleanByte,configFlag); typ = 0x0; while (normalread) { /* while (fread(&len, sizeof(byte), 1, infile) == 1) { */ if ((numread = fread(&len, sizeof(byte), 1, infile)) != 1) { normalread = 0; break; } /* read until first recognized index byte */ catchbyte = 0; switch (typ & 0xff) { /* 16 bytes */ /* case TBheader: if (len != 0x10) break; if (fread ((void*)&buf[2], sizeof(byte), len-2, infile) != len-2) { normalread = 0; break; } dataList.readByte += len; dataList.recordCounter[6][0] ++; break; */ /* 36 bytes for occultation schedule record */ case logdata_type: if (len != 0x24) break; /* only occultation schedule record is interested */ if (fread ((void*)&buf[2], sizeof(byte), len-2, infile) != len-2) { normalread = 0; break; } dataList.readByte += len; dataList.recordCounter[8][0] ++; if (configFlagTst(occulSchedule,configFlag)) { us_dum1 = 0; pik(uc_dum, 2); pik(uc_dum, 3); pik(ul_dum, 4); pik(ul_dum, 8); if (ul_dum != 4096) break; /* subType should be 4096 */ pik(ttag1, 12); pik(ttag, 16); pik(uc_dum, 20); pik(chan, 21); pik(ba, 22); pik(bb, 23); pik(faz_dot, 24); pik(faz_P[0], 28); pik(faz_P[1], 32); /* identify bad record */ if (fabs(faz_dot) > 100.0 || fabs(faz_P[0]) > 400.0 || fabs(faz_P[1]) > 1.0e5) { us_dum1 = 1; } if ((int)chan > 50 || (int)ba == 0 || (int)bb == 0) { us_dum1 = 1; } if (us_dum1 == 1) dataList.recordCounter[8][1] ++; if (cleaning && us_dum1 == 1) { break; } fprintf (outfile,"SCHEDULE %ld prn%02d %d %d %d %f %f %f \n", ttag - ttag_shift, (int)chan, (int)uc_dum,(int)ba,(int)bb, faz_dot, faz_P[0], faz_P[1]); } break; /* 216 bytes or 76 bytes ? case userdata: printf (" userdata len = [%d]\n",len); if (len != 0xd8) break; if (len != 0x4c) break; if (fread ((void*)&buf[2], sizeof(byte), len-2, infile) != len-2) { normalread = 0; break; } dataList.readByte += len; dataList.recordCounter[6][0] ++; break; */ /* 84 bytes */ case l_ephem: if (len != 0x54) break; if (fread ((void*)&buf[2], sizeof(byte), len-2, infile) != len-2) { normalread = 0; break; } dataList.readByte += len; dataList.recordCounter[5][0] ++; /* For the time being do not output the ephemeris record if (configFlagTst(prtL_ephem,configFlag)) { */ break; /* 112 bytes for antenna state record */ case nav_type: if (len != 0x70) break; if (fread ((void*)&buf[2], sizeof(byte), len-2, infile) != len-2) { normalread = 0; break; } dataList.readByte += len; dataList.recordCounter[4][0] ++; pik(prn, 2); pik(chan, 3); pik(ttag, 4); if (ttag > 0) ttag2 = ttag; loop (i,4) pik(xx[i], 16 + i*8), xx[i] /= 1000.0; loop (i,4) pik(vv[i], 64 + i*8), vv[i] /= 1000.0; xr = sqrt(xx[0]*xx[0] + xx[1]*xx[1] + xx[2]*xx[2]); vr = sqrt(vv[0]*vv[0] + vv[1]*vv[1] + vv[2]*vv[2]); if (xr > rmin && xr < rmax && vr > vmin && vr < vmax) { tt = (time_t) (ttag + 315964800); pT = gmtime(&tt); yr = pT->tm_year + 1900; /* Y2K fixing */ if (yr < 1970) yr += 100; if (configFlagTst(prtAnt_state,configFlag)) { fprintf(outfile, "%2d%13.5f%13.5f%13.5f%12.8f%12.8f%12.8f%5d%3d%3d%3d%3d%6.2f\n", 91, xx[0], xx[1], xx[2], vv[0], vv[1], vv[2], yr, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, (double)pT->tm_sec); } } else { dataList.recordCounter[4][1] ++; } if (fread(&len, sizeof(byte), 1, infile) != 1) { normalread = 0; break; } break; /* low rate record */ case l_obs_type: if (len != 0x30) break; if (fread ((void*)&buf[2], sizeof(byte), len-2, infile) != len-2) { normalread = 0; break; } dataList.readByte += len; pik(prn, 2); pik(chan, 3+catchbyte); if (cleaning && prn > 0 && (chan < 1 || chan > RECEIVER_CHANNELS)) { /* case of extra byte */ if ((int)buf[4+catchbyte] == dataList.prnChan[prn-1]) { fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); catchbyte ++; pik(chan, 3+catchbyte); } else { /* case of missing byte */ chan = dataList.prnChan[prn-1]; catchbyte --; } } pik(ttag, 4+catchbyte); if (ttag > 0) ttag2 = ttag; if (cleaning && ttag-ttag_last < 0) { /* missing 2 bytes */ if (buf[len+catchbyte-2] == 0x68) { ttag = ttag_last; catchbyte -= 2; } } pik(samp, 8+catchbyte); if (cleaning && (samp != 10 && samp != 30)) { /* case of extra byte */ if ((int)buf[9+catchbyte] == 10 || (int)buf[9+catchbyte] == 30) { fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); catchbyte ++; pik(samp, 8+catchbyte); } else { /* case of missing byte */ samp = 10; catchbyte --; } } pik(obstyp, 9+catchbyte); loop (i,3) { pik(snr[i], 10+2*i+catchbyte); if (snr[i] > 60000) snr[i] = 0; } if (cleaning && (snr[1] > 1000 || snr[2] > 1000 || snr[0] <= 0)) { /* missing 2 bytes */ if (snr[0] <= 0) { if (buf[len+catchbyte-2] == 0x68) { snr[0] = buf[9+catchbyte]; catchbyte -= 2; loop1(i,3) {pik(snr[i], 10+2*i+catchbyte); if (snr[i] > 60000) snr[i] = 0; } } } /* extra byte */ if (snr[1] > 1000) { fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); catchbyte ++; loop1(i,3) {pik(snr[i], 10+2*i+catchbyte); if (snr[i] > 60000) snr[i] = 0; } } /* if (snr[2] > 1000) { fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); catchbyte ++; pik(snr[2], 14+catchbyte); if (snr[2] > 60000) snr[2] = 0; } */ } pik(faz_CA, 16+catchbyte); if (cleaning) { loop(j,3) { if (fabs(faz_CA) > maxCAfaz) { fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); catchbyte ++; pik(faz_CA, 16+catchbyte); } } } pik(tau_CA, 24+catchbyte); if (cleaning) { loop(j,3) { tau = tau_CA*chip*(double)10; if (tau < minrange || tau > maxrange) { /* if (buf[len] == 48 && buf[len-1] == 104) { printf(" tau_CA = [%f] [%ld] [%d]\n",tau_CA,ttag-ttag_shift,prn); catchbyte = -2; j = 3; break; } */ fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); catchbyte ++; pik(tau_CA, 24+catchbyte); } } } loop(i,2) pik(faz_P[i], 32+8*i+catchbyte), pik(tau_P[i], 36+8*i+catchbyte); if (cleaning) { loop(j,3) { if (faz_P[0] > 1000.0 || faz_P[0] < -1000.0 || (buf[32+catchbyte]!=0x00 && buf[36+catchbyte]==0x00 && buf[34+catchbyte]==0x00 && buf[35+catchbyte]==0x00)) { fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); catchbyte ++; loop(i,2) pik(faz_P[i], 32+8*i+catchbyte), pik(tau_P[i], 36+8*i+catchbyte); } } loop(j,3) { if (faz_P[1] > 1000.0 || faz_P[1] < -1000.0) { fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); catchbyte ++; loop1(i,2) pik(faz_P[i], 32+8*i+catchbyte), pik(tau_P[i], 36+8*i+catchbyte); } } loop(j,3) if (tau_P[1] > 1000.0 || tau_P[1] < -1000.0) { if (buf[len+catchbyte-2] == 0x68) { catchbyte = -2; pik(tau_P[1], 44+catchbyte); j = 3; break; } if (buf[len+catchbyte-1] == 0x68) { catchbyte = -1; pik(tau_P[1], 44+catchbyte); j = 3; break; } fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); catchbyte ++; pik(tau_P[1], 44+catchbyte); } } /* In the cleaning work, we read extra bytes. It might eat the header of the next record. If this is the case, backwards the pointer */ if (catchbyte > 0) { for (i = 0; i < catchbyte; i++) { if (buf[len+i] == HR_type || buf[len+i] == l_obs_type) fseek(infile,-1,0); } } if (catchbyte < 0) { fseek(infile,catchbyte,0); } /* cleaning finished, archive the record now */ if (prn > 0 && prn <= MAX_PRN) { dataList.recordCounter[0][0] ++; dataList.satCounter[prn-1] ++; if(dataList.recordSpan[0] == 0) dataList.recordSpan[0] = (int)ttag; dataList.recordSpan[1] = (int)ttag; if(dataList.satSpan[prn-1][0] == 0) dataList.satSpan[prn-1][0] = (int)ttag; dataList.satSpan[prn-1][1] = (int)ttag; dataList.prnChan[prn-1] = (int)chan; } /* time tag and PRN filtering */ if (configFlagTst(filterTBTag,configFlag)) { if (runConfig.startTimeFilter > ttag && runConfig.startTimeFilter != 0) { break; } if (runConfig.endTimeFilter < ttag && runConfig.endTimeFilter != 0) { break; } if (runConfig.PRNfilter != 0 && runConfig.PRNfilter != (int)prn) { break; } } /* low rate qm format output */ if (configFlagTst(prtTrbObs,configFlag) && configFlagTst(prtQmFmt,configFlag)) { qm_rec_num ++; if (qm_rec_num == 1) { qm_ttag = (double)ttag-0.5; if (!configFlagTst(prtHighRtP12,configFlag) && !configFlagTst(prt50HzRate,configFlag)) qm_ttag = (double)ttag; } if (configFlagTst(prtQmFmt,configFlag) && qm_rec_num == 1) { get_p2g(qm_ttag,p2gfile); sprintf(gps_s,"GPS%02d",p2g[(int)prn]); qm_title(outfile,rcv_s,gps_s,qm_ttag-(double)ttag_shift,runConfig.mtype); qm_rec_num ++; } sprintf(gps_s,"GPS%02d",p2g[(int)prn]); } if (configsav == DEFAULT_CONFIG_FLAG) configsav = configFlag; if (configFlag != configsav) configFlag = configsav; /* output binary record */ if (configFlagTst(prtBinaryData,configFlag)) { loop (i,len) { if (i%20 == 0) fprintf(outfile,"\n"); fprintf(outfile," %02x",buf[i]); } /* fread ((void*)&buf[0], sizeof(byte), 1, infile); fprintf(outfile," -- %02x",buf[0]); fseek(infile,-1,0); */ fprintf(outfile,"\n"); } if (configFlagTst(prtTrbObs,configFlag)) { if (configFlagTst(prtQmFmt,configFlag)) { if (runConfig.prtType[0] == 1) { dtyp_s = "L1"; nobs = 2; obs[0] = (double)(faz_CA*chip1)*1.0e-3; fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)ttag-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); fprintf(outfile," %.15g %d", obs[0],snr[0]); fprintf(outfile,"\n"); } if (runConfig.prtType[1] == 1) { dtyp_s = "P1"; nobs = 1; obs[0] = (tau_CA*chip)*1.0e-2; fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)ttag-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); fprintf(outfile," %.15g", obs[0]); fprintf(outfile,"\n"); } if (runConfig.prtType[2] == 1) { dtyp_s = "L1"; nobs = 2; obs[0] = ((faz_CA-(double)faz_P[0])*chip1)*1.0e-3; fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)ttag-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); fprintf(outfile," %.15g %d", obs[0],snr[1]); fprintf(outfile,"\n"); } if (runConfig.prtType[3] == 1) { dtyp_s = "P1"; nobs = 1; obs[0] = ((tau_CA*(double)10-(double)tau_P[0])*chip)*1.0e-3; fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)ttag-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); fprintf(outfile," %.15g", obs[0]); fprintf(outfile,"\n"); } } else { fprintf (outfile,"OBS %hds prn%02d %d %ld %hd %hd %hd %lf %lf", samp, (int)prn, (int)chan, ttag - ttag_shift, snr[0], snr[1], snr[2], faz_CA, tau_CA*chip*(double)10); loop(i,2) { faz = faz_CA - (double)faz_P[i]; if (i) faz *= (double)120 / (double)154; tau = ((double)10 * tau_CA - (double)tau_P[i])*chip; fprintf(outfile," %lf %lf", faz, tau); } fprintf(outfile," %f [%d]\n",faz_P[1],catchbyte); } } bad_lrate = 0; tau = tau_CA*chip*(double)10; tau1 = tau-chip*(double)tau_P[1]; i = 0; if (ttag_last != -1) i = (ttag-ttag_last)%10; if (ttag_last == -1) i = ttag%10; if (tau < minrange || tau > maxrange || prn <= 0 || tau1 < minrange || tau1 > maxrange || i != 0) { dataList.recordCounter[0][1] ++; bad_lrate = 1; /* if (!configFlagTst(prtL_obs,configFlag)) { fprintf(outfile," ttag = [%lf] prn = [%d] tau = [%f]\n",ttag-ttag_shift,(int)prn,tau); } */ } /* Sometimes, some records were transmitted with mixed time tag */ if (ttag-ttag_last >= 8000 && ttag_last != -1 && !bad_lrate && extra_rec < 50) { extra_rec ++; P_temp[extra_rec].flg = 1; loop(i,3) P_temp[extra_rec].ss[i] = snr2n(snr[i]); P_temp[extra_rec].fz[0] = faz_CA; P_temp[extra_rec].fz[1] = (faz_CA - (double)faz_P[1])*(double)120.0/(double)154.0; P_temp[extra_rec].tu[0] = tau = tau_CA*chip*(double)10; if (tau < minrange || tau > maxrange) P_temp[extra_rec].flg = 0; tau -= chip*(double)tau_P[1]; P_temp[extra_rec].tu[1] = tau; if (tau < minrange || tau > maxrange) P_temp[extra_rec].flg = 0; /* if (snr[1] && configFlagTst(ASonstate,configFlag)) P_temp[extra_rec].flg = 0; */ /* AS apparantly off (???) */ prevTtag[extra_rec] = ttag; prevPrn[extra_rec] = prn; bad_lrate = 1; } if (prn > 0 && prn < 32 && !bad_lrate) { /* if ( configFlagTst(ASonstate,configFlag) && snr[1] == 0) { break; } */ if (ttag != ttag_last && configFlagTst(prtL_obs,configFlag)) { if (extra_rec > 0) { if (ttag_last > prevTtag[extra_rec]) { for (i = 1; i <= extra_rec; i++) { prevTtag[i] = 0; P_temp[i].flg = 0; prevPrn[i] = 0; extra_rec = 0; } } else { for (i = 1; i <= extra_rec; i++) { if (ttag_last == prevTtag[i]) { if (P[prevPrn[i]].flg == 1) { prevTtag[i] = 0; P_temp[i].flg = 0; prevPrn[i] = 0; } else { P[prevPrn[i]].flg = P_temp[i].flg; loop(j,3) P[prevPrn[i]].ss[j] = P_temp[i].ss[j]; P[prevPrn[i]].fz[0] = P_temp[i].fz[0]; P[prevPrn[i]].fz[1] = P_temp[i].fz[1]; P[prevPrn[i]].tu[0] = P_temp[i].tu[0]; P[prevPrn[i]].tu[1] = P_temp[i].tu[1]; prevTtag[i] = 0; P_temp[i].flg = 0; prevPrn[i] = 0; } } } bb = extra_rec; extra_rec = 0; for (i = 1; i <= bb; i++) { if (P_temp[i].flg == 1) { extra_rec ++; if (extra_rec < i) { P_temp[extra_rec] = P_temp[i]; prevPrn[extra_rec] = prevPrn[i]; prevTtag[extra_rec] = prevTtag[i]; } } } } } purge_P(outfile,fttp); } pP = P + prn; pP->flg = 1; loop(i,3) pP->ss[i] = snr2n(snr[i]); loop(i,3) snr_temp[prn][i] = snr[i]; pP->fz[0] = faz_CA; pP->fz[1] = (faz_CA - (double)faz_P[1])*(double)120.0/(double)154.0; pP->tu[0] = tau = tau_CA*chip*(double)10; if (tau < minrange || tau > maxrange) pP->flg = 0; tau -= chip*(double)tau_P[1]; pP->tu[1] = tau; if (tau < minrange || tau > maxrange) pP->flg = 0; /* if (snr[1] && configFlagTst(ASonstate,configFlag)) pP->flg = 0; */ /* AS apparantly off (???) */ if (pP->flg) ttag_last = ttag; } if (fread(&len, sizeof(byte), 1, infile) != 1) { normalread = 0; break; } break; /* CA and C1. there are two modes: 50 Hz and 10 Hz hirate data */ case HR_type: get_CAhirate = 0; hr_samp = 50; if (len == 0x58 || len == 0x5a) hr_samp = 10; if (len == 0x30 || len == 0x32) hr_samp = 0; if ((len != 0xf8 && len != 0xfa) && (len != 0x58 && len!= 0x5a) && (len != 0x30 && len != 0x32)) { break; } if (fread ((void*)&buf[2], sizeof(byte), len-2, infile) != len-2) { /* printf(" HR_type error!\n"); */ normalread = 0; break; } if (hr_samp > hr_s) hr_s = hr_samp; recd_num ++; bad_hrate = 0; repair_fail = 0; repair = 0; bb = 0; dataList.readByte += len; pik(prn, 2+catchbyte); pik(chan, 3+catchbyte); if (cleaning && (prn < 1 || prn > MAX_PRN || chan < 1 || chan > RECEIVER_CHANNELS)) { loop (i,2) { catchbyte ++; pik(prn, 2+catchbyte); pik(chan, 3+catchbyte); if (prn > 0 && prn <= MAX_PRN && chan > 0 && chan <= RECEIVER_CHANNELS) {break;} } } pik(ttag, 4+catchbyte); if (ttag > 0) ttag2 = ttag; /* satellite ID wrong, no way to repair the record */ if (cleaning && (prn < 1 || prn > MAX_PRN || chan < 1 || chan > RECEIVER_CHANNELS)) { dataList.recordCounter[1][0] ++; dataList.recordCounter[1][1] ++; bad_hrate = 1; j = -(len-10-catchbyte); fseek(infile,j,0); dataList.readByte += j; break; } chan1 = chan; time1 = ttag & 0x7ff; ttag1 = ttag; prn_1 = prn; /* check the index position */ ix_pos = 2; loop (i,5) { if (buf[6+i+catchbyte] == 0x02 && buf[7+i+catchbyte] == 0x15) ix_pos = i; } /* extra byte -- easy case */ if (cleaning && ix_pos == 3) catchbyte = 1; /* missing byte -- difficult case */ if (cleaning && ix_pos == 1) { catchbyte = -1; if (fabs(ttag - ttagH_last) > 100 && ttagH_last != -1) { pik(ttag, 4+catchbyte); if (ttag > 0) ttag2 = ttag; } } if (cleaning && ix_pos == 0) { catchbyte = -2; if (fabs(ttag - ttagH_last) > 100 && ttagH_last != -1) { pik(ttag, 4+catchbyte); if (ttag > 0) ttag2 = ttag; if (fabs(ttag - ttagH_last) > 100) { ttag = ttagH_last; } } } loop (i,3) { pik(snr[i], 10+2*i+catchbyte); if (snr[i] > 60000) snr[i] = 0; } pik(faz_L1, 16+catchbyte); pik(tau_L1, 24+catchbyte); if (cleaning ) { /* check if there is an extra byte in the snr part */ tau = tau_L1*chip*(double)10; if (tau < minrange || tau > maxrange) { pik(tau_L1, 25+catchbyte); tau = tau_L1*chip*(double)10; if (tau > minrange && tau < maxrange) { /* find the case */ catchbyte ++; loop1 (i,3) { pik(snr[i], 10+2*i+catchbyte); if (snr[i] > 60000) snr[i] = 0; } pik(faz_L1, 16+catchbyte); } else { pik(tau_L1, 22+catchbyte); tau = tau_L1*chip*(double)10; if (tau > minrange && tau < maxrange) { /* find the case : missing two bytes */ catchbyte -= 2; snr[2] = snr[1]; pik(faz_L1, 16+catchbyte); } } } } if (cleaning) { loop(j,3) { tau = tau_L1*chip*(double)10; if (tau < minrange || tau > maxrange) { /* missing byte */ if (fabs(faz_L1) < 10.0) { pik(tau_L1, 23); tau = tau_L1*chip*(double)10; if (tau > minrange && tau < maxrange) { catchbyte --; pik(faz_L1, 16+catchbyte); snr[2] = 0x00ff & (snr[2] >> 8); j = 3; break; } } /* extra byte */ if (catchbyte >= 0) fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); catchbyte ++; pik(tau_L1, 24+catchbyte); } } } loop(i,2) pik(fazdot_P[i], 32+4*i+catchbyte), pik(fazddot_P[i], 40+4*i+catchbyte); if (cleaning) { loop(j,3) { if (fazdot_P[0] > 50000.0 || fazdot_P[0] < -50000.0) { if (catchbyte >= 0) fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); catchbyte ++; loop(i,2) pik(fazdot_P[i], 32+4*i+catchbyte), pik(fazddot_P[i], 40+4*i+catchbyte); } } loop(j,3) { if (fazdot_P[1] > 50000.0 || fazdot_P[1] < -50000.0) { if (catchbyte >= 0) fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); catchbyte ++; pik(fazdot_P[1], 36+catchbyte); pik(fazddot_P[0], 40+catchbyte); pik(fazddot_P[1], 44+catchbyte); } } loop(j,3) if (fazddot_P[0] > 1000.0 || fazddot_P[0] < -1000.0) { if (buf[len+catchbyte-2] == 0xf8) { catchbyte = -2; pik(fazddot_P[1], 44+catchbyte); j = 3; break; } if (buf[len+catchbyte-1] == 0xf8) { catchbyte = -1; pik(fazddot_P[1], 44+catchbyte); j = 3; break; } if (catchbyte >= 0) fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); catchbyte ++; pik(fazddot_P[0], 40+catchbyte); pik(fazddot_P[1], 44+catchbyte); } loop(j,3) if (fazddot_P[1] > 1000.0 || fazddot_P[1] < -1000.0) { if (buf[len+catchbyte-2] == 0xf8) { catchbyte = -2; pik(fazddot_P[1], 44+catchbyte); j = 3; break; } if (buf[len+catchbyte-1] == 0xf8) { catchbyte = -1; pik(fazddot_P[1], 44+catchbyte); j = 3; break; } if (catchbyte >= 0) fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); catchbyte ++; pik(fazddot_P[1], 44+catchbyte); } if (fabs(fazddot_P[1]) <= 0.001) { pik(faz_dot, 44+catchbyte+1); pik(us_dum, 48+catchbyte+1); pik(s_dum, 50+catchbyte+1); if (fabs(faz_dot) > 0.0 && fabs(faz_dot) < 1000.0 && us_dum < 15000 && fabs(s_dum) < 1500) { fazddot_P[1] = faz_dot; catchbyte ++; } } } dataList.recordCounter[1][0] ++; tau = tau_L1*chip*(double)10; tau1 = fabs(fazdot_P[0]); if (tau < minrange || tau > maxrange || prn <= 0 || snr[0] > 2000 || snr[1] > 2000 || tau1 > 50000.0 || fabs(fazdot_P[1]) > 50000.0 || fabs(fazddot_P[0]) > 1000.0 || fabs(fazddot_P[1]) > 1000.0) { dataList.recordCounter[1][1] ++; bad_hrate = 1; } get_CAhirate = 1; /* time tag and PRN filtering */ if (configFlagTst(filterTBTag,configFlag)) { if (runConfig.startTimeFilter > ttag && runConfig.startTimeFilter != 0) { break; } if (runConfig.endTimeFilter < ttag && runConfig.endTimeFilter != 0) { break; } if (runConfig.PRNfilter != 0 && runConfig.PRNfilter != (int)prn) { break; } } /**** 1-Hz CA mode high rate data ****/ if (!bad_hrate) {qm_rec_num ++;} if (qm_rec_num == 1) { qm_ttag = (double)ttag-0.5; if (!configFlagTst(prtHighRtP12,configFlag) && !configFlagTst(prt50HzRate,configFlag)) qm_ttag = (double)ttag; } faz_sav = faz_L1; p1hirate[prn] = tau_L1*chip*(double)10; if (configFlagTst(prtQmFmt,configFlag) && qm_rec_num == 1 && !bad_hrate) { get_p2g(qm_ttag,p2gfile); sprintf(gps_s,"GPS%02d",p2g[(int)prn]); qm_title(outfile,rcv_s,gps_s,qm_ttag-(double)ttag_shift,runConfig.mtype); qm_rec_num ++; } sprintf(gps_s,"GPS%02d",p2g[(int)prn]); if ((configFlagTst(prtHighRate,configFlag) || configFlagTst(prtQmFmt,configFlag)) && !bad_hrate) { if (configFlagTst(prtQmFmt,configFlag)) { if ((!configFlagTst(prt50HzRate,configFlag) && !configFlagTst(prtHighRtP12,configFlag)) || (hr_samp == 0 && !configFlagTst(prtHighRat2,configFlag))) { if (runConfig.prtType[0] == 1) { dtyp_s = "L1"; nobs = 2; obs[0] = (double)chip1*faz_L1*1.0e-3; obs[1] = ((double)snr[0]); /* obs[1] = snr_conv_50 * ((double)snr[0]); */ fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)ttag-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); loop(j,nobs) fprintf(outfile," %.15g", obs[j]); fprintf(outfile," \n"); } if (runConfig.prtType[1] == 1) { dtyp_s = "P1"; nobs = 1; obs[0] = p1hirate[prn]*1.0e-3; fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)ttag-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); loop(j,nobs) fprintf(outfile," %.15g", obs[j]); fprintf(outfile," \n"); } } } else if (configFlagTst(prtHighRate,configFlag)) { fprintf (outfile,"HR prn%02d %d %ld %hd %hd %hd %lf %lf", (int)prn, (int)chan, ttag - ttag_shift, snr[0], snr[1], snr[2], faz_L1, tau_L1*chip*(double)10); fprintf(outfile," %f %f", fazdot_P[0], fazdot_P[1]); fprintf(outfile," %f %f", fazddot_P[0], fazddot_P[1]); fprintf(outfile," [%d]\n",catchbyte); } tau = tau_L1*chip*(double)10; tau1 = fabs(fazdot_P[0]); if (bad_hrate) { if (!configFlagTst(prtQmFmt,configFlag)) { /* loop (i,hr_samp) { if (i%20 == 0) fprintf(outfile,"\n"); fprintf(outfile," %02x",buf[i]); } fprintf(outfile," -- %02x %02x",buf[len-1],buf[len]); fprintf(outfile,"\n"); */ } } else { ttagH_last = ttag; } /* only 1-second data, no 10-hz or 50-hz data */ if (hr_samp == 0) break; /* 10-Hz or 50-Hz CA data */ snr_r = 15000; /* if (snr_ref[prn-1] > 0) snr_r = snr_ref[prn-1]+5000; */ if (configFlagTst(prt50HzRate,configFlag) || configFlagTst(prtQmFmt,configFlag)) { loop(i,hr_samp) { pik(us_dum, 48 + 4*i+catchbyte); pik(s_dum, 50 + 4*i+catchbyte); snr_50hz[i] = us_dum; recd_50hz[i] = s_dum; } /* loop (i,hr_samp) { if (i%20 == 0) fprintf(outfile,"\n"); fprintf(outfile," %02x",buf[48+catchbyte+i]); } fprintf(outfile," -- %02x %02x",buf[len-1],buf[len]); fprintf(outfile,"\n"); */ oldcatch = catchbyte; /* ==== clean the 50 hz high rate data. Do not clean when bad_hrate occurs. ==== */ if (cleaning && !bad_hrate) { repair = 0; repair_fail = 0; bb = 0; loop(i,hr_samp) { snr_d = 0; rec_d = 0; if (i > 0 && snr_50hz[i-1] < snr_r) snr_d = snr_50hz[i]-snr_50hz[i-1]; if (i > 0 && fabs(recd_50hz[i-1]) < rec_diff) rec_d = recd_50hz[i]-recd_50hz[i-1]; /* case 2: snr ok, residual record has trouble */ if (i == 0 && snr_50hz[i] < snr_r && fabs(recd_50hz[0]) > rec_diff) { /* check if there is an extra byte */ pik(s_dum, 50 + 4*i+catchbyte+1); pik(us_dum, 52 + 4*i+catchbyte+1); /* snr also possibly has byte problem because the snr_r is too loose */ pik(us_dum1, 48 + 4*i+catchbyte+1); if (us_dum1 < snr_r && us_dum < snr_r && fabs(us_dum-snr_50hz[i]) > snr_diff && fabs(us_dum-us_dum1) < snr_diff) { snr_50hz[i] = us_dum1; } if (fabs(s_dum) < rec_diff && fabs(us_dum-snr_50hz[i]) < snr_diff) { recd_50hz[i] = s_dum; rec_d = s_dum; if (catchbyte >= oldcatch) fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); catchbyte ++; for (j = i+1; j < hr_samp; j++) { pik(us_dum, 48 + 4*j+catchbyte); pik(s_dum, 50 + 4*j+catchbyte); snr_50hz[j] = us_dum; recd_50hz[j] = s_dum; } } else { recd_50hz[i] = -9999; rec_d = 0; } } /* special case: one byte offset for the last variable with medium difference */ if (i == hr_samp-1 && snr_50hz[i] < snr_r && fabs(snr_d) < snr_diff && fabs(rec_d) < rec_diff && fabs(rec_d) > 1000 && fabs(recd_50hz[i-1]-recd_50hz[i-2]) < 1000) { if (catchbyte >= oldcatch) fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); pik(s_dum, 50 + 4*i+catchbyte+1); if (fabs(s_dum-recd_50hz[i-1]) < 1000) { recd_50hz[i] = s_dum; rec_d = recd_50hz[i]-recd_50hz[i-1]; catchbyte ++; } else { fseek(infile,-1,0); s_dum = 0xffff & (s_dum >> 8); if (fabs(s_dum-recd_50hz[i-1]) < 1000) { recd_50hz[i] = s_dum; continue; } } } if (i > 0 && snr_50hz[i] < snr_r && fabs(snr_d) < snr_diff && fabs(rec_d) > rec_diff) { if (catchbyte >= oldcatch) fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); fseek(infile,-1,0); pik(s_dum, 50 + 4*i+catchbyte+1); /* check if there is an extra byte */ if (catchbyte >= oldcatch) fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); fseek(infile,-1,0); pik(s_dum, 50 + 4*i+catchbyte+1); if (i < hr_samp-1) pik(us_dum, 52 + 4*i+catchbyte+1); if (i == hr_samp-1) us_dum = snr_50hz[i]; /* empirical rule: the last valuable missed a 0xff byte */ if (i == hr_samp-1 && fabs(s_dum-recd_50hz[i-1]) > rec_diff) { s_dum = 0xffff & (s_dum >> 8); if (fabs(s_dum-recd_50hz[i-1]) < rec_diff) { recd_50hz[i] = s_dum; continue; } } if (fabs(s_dum-recd_50hz[i-1]) < rec_diff && fabs(us_dum-snr_50hz[i]) < snr_diff) { /* using more delicate criterion */ if (i > 2 && i < hr_samp-1 && fabs(s_dum-recd_50hz[i-1]) > 1000 && fabs(recd_50hz[i-1]-recd_50hz[i-2]) < 1000 && fabs(recd_50hz[i-2]-recd_50hz[i-3]) < 1000) { s_dum1 = snr_50hz[i+1]; us_dum1 = recd_50hz[i]; if (fabs(s_dum1-recd_50hz[i-1]) < 1000 && fabs(us_dum1-snr_50hz[i-1]) < 1000) { snr_50hz[i] = us_dum1; recd_50hz[i] = s_dum1; if (catchbyte >= oldcatch) fread ((void*)&buf[len+catchbyte], sizeof(byte), 2, infile); catchbyte += 2; for (j = i+1; j < hr_samp; j++) { pik(us_dum, 48 + 4*j+catchbyte); pik(s_dum, 50 + 4*j+catchbyte); snr_50hz[j] = us_dum; recd_50hz[j] = s_dum; } } continue; } recd_50hz[i] = s_dum; rec_d = recd_50hz[i]-recd_50hz[i-1]; if (catchbyte >= oldcatch) fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); catchbyte ++; for (j = i+1; j < hr_samp; j++) { pik(us_dum, 48 + 4*j+catchbyte); pik(s_dum, 50 + 4*j+catchbyte); snr_50hz[j] = us_dum; recd_50hz[j] = s_dum; } } else { /* check if there are missing bytes */ pik(us_dum, 52 + 4*i+catchbyte-1); if (fabs(us_dum-snr_50hz[i]) < snr_diff) { catchbyte --; recd_50hz[i] = -9999; rec_d = 0; for (j = i+1; j < hr_samp; j++) { pik(us_dum, 48 + 4*j+catchbyte); pik(s_dum, 50 + 4*j+catchbyte); snr_50hz[j] = us_dum; recd_50hz[j] = s_dum; } } else { pik(us_dum, 52 + 4*i+catchbyte-2); if (fabs(us_dum-snr_50hz[i]) < snr_diff) { catchbyte -= 2; recd_50hz[i] = -9999; rec_d = 0; for (j = i+1; j < hr_samp; j++) { pik(us_dum, 48 + 4*j+catchbyte); pik(s_dum, 50 + 4*j+catchbyte); snr_50hz[j] = us_dum; recd_50hz[j] = s_dum; } bb = 1; } else { /* recd_50hz[i] = -9999; */ rec_d = 0; } } } } /* case 3: snr ok has trouble */ if (snr_50hz[i] > snr_r || fabs(snr_d) > snr_diff || rec_d > rec_diff) { repair ++; bb = 0; /* check if there is an extra byte */ if (snr_50hz[i] > snr_r || fabs(snr_d) > snr_diff) pik(us_dum, 48 + 4*i+catchbyte+1); if (i > 0 && snr_50hz[i-1] < snr_r) snr_d = us_dum-snr_50hz[i-1]; if (us_dum < snr_r && fabs(snr_d) < snr_diff) { /* using more delicate criterion */ if (i > 2 && i < hr_samp-1) { pik(s_dum, 50 + 4*i+catchbyte+1); } if (i > 2 && i < 49 && fabs(s_dum-recd_50hz[i-1]) > 1000 && fabs(recd_50hz[i-1]-recd_50hz[i-2]) < 1000 && fabs(recd_50hz[i-2]-recd_50hz[i-3]) < 1000) { s_dum1 = us_dum; us_dum1 = s_dum; if (fabs(s_dum1-recd_50hz[i-1]) < 1000 && fabs(us_dum1-snr_50hz[i-1]) < 1000 && fabs(snr_50hz[i-1]-snr_50hz[i-2]) < 1000) { snr_50hz[i] = snr_50hz[i-1]*2-snr_50hz[i-2]; recd_50hz[i] = s_dum1; catchbyte --; for (j = i+1; j < hr_samp; j++) { pik(us_dum, 48 + 4*j+catchbyte); pik(s_dum, 50 + 4*j+catchbyte); snr_50hz[j] = us_dum; recd_50hz[j] = s_dum; } continue; } } if (catchbyte >= oldcatch) fread ((void*)&buf[len+catchbyte], sizeof(byte), 1, infile); catchbyte ++; for (j = i; j < hr_samp; j++) { pik(us_dum, 48 + 4*j+catchbyte); pik(s_dum, 50 + 4*j+catchbyte); snr_50hz[j] = us_dum; recd_50hz[j] = s_dum; } } else bb = 1; /* check if there are two extra bytes */ if (bb) { if (catchbyte >= oldcatch) { fread ((void*)&buf[len+catchbyte], sizeof(byte), 2, infile); fseek (infile, -2, 0); } bb = 0; pik(us_dum1, len+catchbyte); /* test shift 3 bytes */ if (us_dum1 > snr_r) pik(us_dum1, len+catchbyte-1); pik(us_dum, 48 + 4*i+catchbyte+2); if (i > 0) snr_d = us_dum-snr_50hz[i-1]; if (i > 0 && snr_50hz[i-1] > snr_r) snr_d = 0; if (us_dum1 < snr_r && us_dum < snr_r && fabs(snr_d) < snr_diff) { if (catchbyte >= oldcatch) fread ((void*)&buf[len+catchbyte], sizeof(byte), 2, infile); catchbyte += 2; for (j = i; j < hr_samp; j++) { pik(us_dum, 48 + 4*j+catchbyte); pik(s_dum, 50 + 4*j+catchbyte); snr_50hz[j] = us_dum; recd_50hz[j] = s_dum; } } else { bb = 1; } } /* check if one or two bytes are missing */ if (bb) { if (i > 0) pik(us_dum, 48 + 4*i+catchbyte-1); if (i > 0) snr_d = us_dum-snr_50hz[i-1]; if (i > 0 && snr_50hz[i-1] > snr_r) snr_d = 0; if (us_dum < snr_r && fabs(snr_d) < snr_diff) { catchbyte --; if (i > 0 && fabs(recd_50hz[i-1]) > 2000) recd_50hz[i-1] = -9999; for (j = i; j < hr_samp; j++) { pik(us_dum, 48 + 4*j+catchbyte); pik(s_dum, 50 + 4*j+catchbyte); snr_50hz[j] = us_dum; recd_50hz[j] = s_dum; } } else { if (i > 0) pik(us_dum, 48 + 4*i+catchbyte-2); if (i > 0) snr_d = us_dum-snr_50hz[i-1]; if (i > 0 && snr_50hz[i-1] > snr_r) snr_d = 0; if (us_dum < snr_r && fabs(snr_d) < snr_diff) { catchbyte -= 2; if (i > 0 && fabs(recd_50hz[i-1]) > 2000) recd_50hz[i-1] = -9999; for (j = i; j < hr_samp; j++) { pik(us_dum, 48 + 4*j+catchbyte); pik(s_dum, 50 + 4*j+catchbyte); snr_50hz[j] = us_dum; recd_50hz[j] = s_dum; } } else { repair_fail = 1; } } } } shift_50hz[i] = catchbyte; } if (repair == 0) snr_ref[prn-1] = snr_50hz[49]; } dataList.recordCounter[2][0] += hr_samp; if (!configFlagTst(prt50HzRate,configFlag)) { break; } if (bad_hrate) { if (!configFlagTst(prtQmFmt,configFlag)) { loop(i,hr_samp) { t = ttag - ttag_shift + 0.02*(i-25); if (hr_samp == 10) t = ttag - ttag_shift + 0.1*(i-5); fprintf (outfile,"Qr prn%02d %d %.2f %d %d\n", (int)prn, (int)prn, t, snr_50hz[i],recd_50hz[i]); } } } else { loop(i,hr_samp) { bad_50hz = 0; t = ttag - ttag_shift + 0.02*(i-25); if (hr_samp == 10) t = ttag - ttag_shift + 0.1*(i-5); if (snr_50hz[i] > snr_r || fabs(recd_50hz[i]) > 10000) bad_50hz = 1; if (bad_50hz || recd_50hz[i] == -9999) { if (configFlagTst(prtQmFmt,configFlag)) { } else { fprintf (outfile,"Qr prn%02d %d %.2f %d %d %d \n", (int)prn, (int)prn, t,snr_50hz[i],recd_50hz[i], shift_50hz[i]); } dataList.recordCounter[2][1] ++; } else { if (hr_samp == 50) { dt = 0.02*(i-25); } else { dt = 0.1*(i-5); } if (!epoch_set) epoch_set = 1, epoch = t; /* The reason to use minus sign is because the fazdot_P and fazddot_P are negatively defined */ faz = chip1 * (faz_sav - ((double)fazdot_P[0] + (double)fazddot_P[0]*dt/2.0)*dt + recd_50hz[i]/(double)CA_HR_SCALE); faz50hz[prn][i] = faz; snr50hz[prn][i] = snr_conv_50 * ((double)snr_50hz[i]); if (configFlagTst(prtQmFmt,configFlag)) { s_dum = hr_samp/2; if (!configFlagTst(prtHighRtP12,configFlag) && !configFlagTst(prtHighRat2,configFlag)) { if (i == s_dum) { /* dtyp_s = "CA"; nobs = 2; obs[0] = (double)chip1*faz_CA*1.0e-3; obs[1] = snr_conv_50 * ((double)snr[0]); fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", t-qm_ttag+ttag_shift, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); loop(j,nobs) fprintf(outfile," %.15g", obs[j]); fprintf(outfile,"\n"); */ if (runConfig.prtType[1] == 1) { dtyp_s = "P1"; nobs = 1; obs[0] = p1hirate[prn]*1.0e-3; fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", t-qm_ttag+ttag_shift, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); loop(j,nobs) fprintf(outfile," %.15g", obs[j]); fprintf(outfile,"\n"); } } if (runConfig.prtType[0] == 1) { dtyp_s = "L1"; nobs = 2; obs[0] = faz*1.0e-3; obs[1] = snr_conv_50 * ((double)snr_50hz[i]); fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", t-qm_ttag+ttag_shift, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); loop(j,nobs) fprintf(outfile," %.15g", obs[j]); fprintf(outfile,"\n"); } } } else { fprintf (outfile,"QR prn%02d %d %.2f %lf %d %d %d\n", (int)prn, (int)prn, t,faz/chip1,snr_50hz[i],recd_50hz[i], shift_50hz[i]); } } } } if (!configFlagTst(prtQmFmt,configFlag)) { /* if ( bad_hrate || repair_fail ) loop(i,hr_samp*4) { if (i%20 == 0) fprintf(outfile,"\n"); fprintf(outfile," %02x",buf[i+48+oldcatch]); } fprintf(outfile," -- %02x %02x %02x\n",buf[len+oldcatch],buf[len+1+oldcatch],buf[len+2+oldcatch]); */ } } } if (fread(&len, sizeof(byte), 1, infile) != 1) { normalread = 0; break; } break; /* this part is not finished yet */ case HRP1_type: get_P1hirate = 0; hr_samp1 = 50; if (len == 0x34 || len == 0x36) hr_samp1 = 10; if ((len != 0xd4 && len != 0xd6) && (len != 0x34 && len != 0x36)) { break; } if (fread ((void*)&buf[2], sizeof(byte), len-2, infile) != len-2) break; pik(us_dum, 2); chan2 = us_dum & 0x1f; time2 = (us_dum & 0xffe0)>>5; recd_num ++; dataList.recordCounter[7][0] ++; if (chan2 == chan1 && time2 == time1) { pik(faz1,4); pik(faz_res,8); for (j = 0; j < hr_samp1; j++) { pik(us_dum, 12 + 4*j); pik(s_dum, 14 + 4*j); if (us_dum > 60000) us_dum = 0; Psnr_50hz[j] = snr_conv_50 * ((double)us_dum); Pfaz_50hz[j] = s_dum; } get_P1hirate = 1; dataList.readByte += len; } else { misl11 ++; } if (hr_samp1 > hr_s1 && !misl11) hr_s1 = hr_samp1; /* time tag and PRN filtering */ if (configFlagTst(filterTBTag,configFlag)) { if (runConfig.startTimeFilter > ttag1 && runConfig.startTimeFilter != 0) { break; } if (runConfig.endTimeFilter < ttag1 && runConfig.endTimeFilter != 0) { break; } if (runConfig.PRNfilter != 0 && runConfig.PRNfilter != (int)prn) { break; } } if (!bad_hrate) {qm_rec_num ++;} if (qm_rec_num == 1) { qm_ttag = (double)ttag1-0.5; if (!configFlagTst(prtHighRtP12,configFlag) && !configFlagTst(prt50HzRate,configFlag)) qm_ttag = (double)ttag1; } if (configFlagTst(prtQmFmt,configFlag) && qm_rec_num == 1 && !bad_hrate) { get_p2g(qm_ttag,p2gfile); sprintf(gps_s,"GPS%02d",p2g[(int)prn]); qm_title(outfile,rcv_s,gps_s,qm_ttag-(double)ttag_shift,runConfig.mtype); qm_rec_num ++; } sprintf(gps_s,"GPS%02d",p2g[(int)prn]); if (configFlagTst(prtHighRat2,configFlag) && !bad_hrate) { if (chan2 == chan1 && time2 == time1) { if (configFlagTst(prtQmFmt,configFlag)) { } else { snr_l2 = Psnr_50hz[0]; fprintf(outfile,"%d prn%02d CA-L1 %f %d PCA-P1 %.15g\n", ttag1-ttag_shift,prn_1,faz1*chip1,snr[1],(double)(faz_res*chip)); } } } if (configFlagTst(prtHighRtP12,configFlag) && !bad_hrate) { if (chan2 == chan1 && time2 == time1) { if (configFlagTst(prtQmFmt,configFlag)) { } else { for (i = 0; i < hr_samp1; i++) { if (hr_samp1 == 50) { dt = 0.02*(i-25); } else { dt = 0.1*(i-5); } obs[0] = -(fazdot_P[0] + fazddot_P[0]*dt/2.0)*dt + (double)recd_50hz[i]/(double)CA_HR_SCALE; obs[0] = faz_sav + obs[0] -(double)Pfaz_50hz[i]/(double)P1_HR_SCALE + 0.25; if (hr_samp1 == 50) { fprintf(outfile,"L1 50Hz %14.3f %02d %lf %d %.6g\n",(double)(ttag1-ttag_shift)+dt, (int)prn_1,obs[0],Pfaz_50hz[i],Psnr_50hz[i]); } else { fprintf(outfile,"L1 10Hz %14.3f %02d %lf %d %.6g\n",(double)(ttag1-ttag_shift)+dt, (int)prn_1,obs[0],Pfaz_50hz[i],Psnr_50hz[i]); } } } } } break; case HRP2_type: pik(us_dum, 8); hr_samp2 = 50; if (len == 0x34 || len == 0x36) hr_samp2 = 10; if (len == 0x0c || len == 0x0e) hr_samp2 = 0; if ((len != 0xd4 && len != 0xd6) && (len != 0x34 && len != 0x36) && (len != 0x0c && len != 0x0e)) { break; } if (fread ((void*)&buf[2], sizeof(byte), len-2, infile) != len-2) break; pik(us_dum, 2); chan2 = us_dum & 0x1f; time2 = (us_dum & 0xffe0)>>5; recd_num ++; dataList.recordCounter[3][0] ++; bad_hrate = 0; if (chan2 == chan1 && time2 == time1) { pik(faz2,4); pik(faz_res2,8); for (j = 0; j < hr_samp2; j++) { pik(us_dum, 12 + 4*j); pik(s_dum, 14 + 4*j); if (us_dum > 60000) us_dum = 0; P2snr_50hz[j] = snr_conv_50 * ((double)us_dum); P2faz_50hz[j] = s_dum; } dataList.readByte += len; } else { misl21 ++; } if (hr_samp2 > hr_s2 && !misl21 ) hr_s2 = hr_samp2; /* if (tau < minrange || tau > maxrange || prn <= 0 || snr[0] > 2000 || snr[1] > 2000 || tau1 > 50000.0 || fabs(fazdot_P[0]) > 50000.0 || fabs(faz_P[0]) > 1000.0 || fabs(fazdot_P[1]) > 1000.0) { */ if ( prn_1 <= 0 || ttag1 <= 0 || chan2 != chan1 || time2 != time1 ) { dataList.recordCounter[3][1] ++; bad_hrate = 1; } /* time tag and PRN filtering */ if (configFlagTst(filterTBTag,configFlag)) { if (runConfig.startTimeFilter > ttag1 && runConfig.startTimeFilter != 0) { break; } if (runConfig.endTimeFilter < ttag1 && runConfig.endTimeFilter != 0) { break; } if (runConfig.PRNfilter != 0 && runConfig.PRNfilter != (int)prn) { break; } } if (!bad_hrate) {qm_rec_num ++;} if (qm_rec_num == 1) { qm_ttag = (double)ttag1-0.5; if (!configFlagTst(prtHighRtP12,configFlag) && !configFlagTst(prt50HzRate,configFlag)) qm_ttag = (double)ttag1; } if (configFlagTst(prtQmFmt,configFlag) && qm_rec_num == 1 && !bad_hrate) { get_p2g(qm_ttag,p2gfile); sprintf(gps_s,"GPS%02d",p2g[(int)prn]); qm_title(outfile,rcv_s,gps_s,qm_ttag-(double)ttag_shift,runConfig.mtype); qm_rec_num ++; } sprintf(gps_s,"GPS%02d",p2g[(int)prn]); if (configFlagTst(prtHighRat2,configFlag) && !bad_hrate) { if (chan2 == chan1 && time2 == time1) { snr_l2 = P2snr_50hz[0]; if (configFlagTst(prtQmFmt,configFlag)) { s_dum = hr_samp/2; f_dum = (hr_samp == 0)? 0.0 : 1.0/hr_samp; loop(i,s_dum) { if (hr_samp == 50) { dt = 0.02*(i-25); } else { dt = 0.1*(i-5); } if (configFlagTst(prt50HzRate,configFlag) && (runConfig.prtType[0] == 1)) { dtyp_s = "L1"; nobs = 2; obs[0] = (double)faz50hz[prn_1][i]*1.0e-3; obs[1] = (double)snr50hz[prn_1][i]; fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)(ttag1)+(i-s_dum)*f_dum-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); loop(j,nobs) fprintf(outfile," %.15g", obs[j]); fprintf(outfile,"\n"); } if (configFlagTst(prtHighRtP12,configFlag)) { /* there is an option of unusing P1 hi-rate data to save space */ if (get_P1hirate && (runConfig.prtType[2] == 1)) { dtyp_s = "L1"; nobs = 2; obs[0] = -(fazdot_P[0] + fazddot_P[0]*dt/2.0)*dt + (double)recd_50hz[i]/(double)CA_HR_SCALE; obs[0] = chip1 * (faz_sav + obs[0] -(double)Pfaz_50hz[i]/(double)P1_HR_SCALE + 0.25)*1.0e-3; obs[1] = Psnr_50hz[i]; fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)(ttag1)+(i-s_dum)*f_dum-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); loop(j,nobs) fprintf(outfile," %.15g", obs[j]); fprintf(outfile,"\n"); } if (runConfig.prtType[4] == 1) { dtyp_s = "L2"; nobs = 2; obs[0] = -(fazdot_P[1] + fazddot_P[1]*dt/2.0)*dt + (double)P2faz_50hz[i]/(double)P2_HR_SCALE; obs[0] = chip1 * (faz_sav - faz2 + obs[0]/L1toL2)*1.0e-3; obs[1] = P2snr_50hz[i]; fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)(ttag1)+(i-s_dum)*f_dum-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); loop(j,nobs) fprintf(outfile," %.15g", obs[j]); fprintf(outfile,"\n"); } if (get_P1hirate && (runConfig.prtType[6] == 1)) { dtyp_s = "LC"; nobs = 3; vr = -(fazdot_P[0] + fazddot_P[0]*dt/2.0)*dt + (double)recd_50hz[i]/(double)CA_HR_SCALE; vr = chip1 * (faz_sav + vr -(double)Pfaz_50hz[i]/(double)P1_HR_SCALE + 0.25)*1.0e-3; xr = -(fazdot_P[1] + fazddot_P[1]*dt/2.0)*dt + (double)P2faz_50hz[i]/(double)P2_HR_SCALE; xr = chip1 * (faz_sav - faz2 + xr/L1toL2)*1.0e-3; obs[0] = acoef1*vr+acoef2*xr; obs[1] = vr - xr; vr = (Psnr_50hz[i] > 0) ? chip1/(double)Psnr_50hz[i] : 0.0; xr = (P2snr_50hz[i] > 0) ? chip2/(double)P2snr_50hz[i] : 0.0; obs[2] = chip1/sqrt(acoef1*acoef1*vr*vr+acoef2*acoef2*xr*xr); fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)(ttag1)+(i-s_dum)*f_dum-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); loop(j,nobs) fprintf(outfile," %.15g", obs[j]); fprintf(outfile,"\n"); } } } /* if (!configFlagTst(prt50HzRate,configFlag)) { if (runConfig.prtType[0] == 1) { dtyp_s = "L1"; nobs = 2; obs[0] = (double)((faz_sav-faz1)*chip1)*1.0e-3; obs[1] = snr_conv_50 * ((double)snr_50hz[s_dum]); fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)ttag1-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); loop(j,nobs) fprintf(outfile," %.15g", obs[j]); fprintf(outfile,"\n"); } } */ if (runConfig.prtType[2] == 1 && get_P1hirate && !configFlagTst(prtHighRtP12,configFlag) && !configFlagTst(prtHighRate,configFlag)) { if (ttag_prev != ttag1 || faz_prev[0] != faz1) { dtyp_s = "L1"; nobs = 2; obs[0] = (double)((faz_sav-faz1)*chip1)*1.0e-3; obs[1] = snr_conv_50 * ((double)snr_50hz[s_dum]); fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)ttag1-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); loop(j,nobs) fprintf(outfile," %.15g", obs[j]); fprintf(outfile,"\n"); } } if (runConfig.prtType[4] == 1 && (hr_samp2 == 0 || !configFlagTst(prtHighRtP12,configFlag))) { if (ttag_prev != ttag1 || faz_prev[1] != faz2) { dtyp_s = "L2"; nobs = 2; obs[0] = (double)((faz_sav-faz2)*chip1*1.0e-3); obs[1] = snr50hz[prn_1][s_dum]; fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)ttag1-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); loop(j,nobs) fprintf(outfile," %.15g", obs[j]); fprintf(outfile,"\n"); } } if (hr_samp > 0 && runConfig.prtType[3] == 1) { if (ttag_prev != ttag1 || faz_prev[2] != faz_res) { dtyp_s = "P1"; nobs = 1; obs[0] = (p1hirate[prn_1]-(double)faz_res*chip)*1.0e-3; fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)ttag1-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); loop(j,nobs) fprintf(outfile," %.15g", obs[j]); fprintf(outfile,"\n"); } } if (runConfig.prtType[5] == 1) { if (ttag_prev != ttag1 || faz_prev[3] != faz_res2) { dtyp_s = "P2"; nobs = 1; obs[0] = (p1hirate[prn_1]-(double)faz_res2*chip)*1.0e-3; fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)ttag1-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); loop(j,nobs) fprintf(outfile," %.15g", obs[j]); fprintf(outfile,"\n"); } } if (runConfig.prtType[7] == 1) { if (ttag_prev != ttag1 || faz_prev[3] != faz_res2) { dtyp_s = "PC"; nobs = 1; obs[0] = (p1hirate[prn_1]*(acoef1+acoef2)-acoef1*(double)faz_res*chip-acoef2*(double)faz_res2*chip)*1.0e-3; fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)ttag1-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); loop(j,nobs) fprintf(outfile," %.15g", obs[j]); fprintf(outfile,"\n"); } } ttag_prev = ttag1; faz_prev[0] = faz1; faz_prev[1] = faz2; faz_prev[2] = faz_res; faz_prev[3] = faz_res2; for (i = s_dum; i < hr_samp; i++) { if (hr_samp == 50) { dt = 0.02*(i-25); } else { dt = 0.1*(i-5); } if (configFlagTst(prt50HzRate,configFlag) && (runConfig.prtType[0] == 1)) { dtyp_s = "L1"; nobs = 2; obs[0] = faz50hz[prn_1][i]*1.0e-3; obs[1] = snr50hz[prn_1][i]; fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)(ttag1)+(i-s_dum)*f_dum-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); loop(j,nobs) fprintf(outfile," %.15g", obs[j]); fprintf(outfile,"\n"); } if (configFlagTst(prtHighRtP12,configFlag)) { if (get_P1hirate && (runConfig.prtType[2] == 1)) { dtyp_s = "L1"; nobs = 2; obs[0] = -(fazdot_P[0] + fazddot_P[0]*dt/2.0)*dt + (double)recd_50hz[i]/(double)CA_HR_SCALE; obs[0] = chip1 * (faz_sav + obs[0] -(double)Pfaz_50hz[i]/(double)P1_HR_SCALE + 0.25)*1.0e-3; obs[1] = (double)Psnr_50hz[i]; fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)(ttag1)+(i-s_dum)*f_dum-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); loop(j,nobs) fprintf(outfile," %.15g", obs[j]); fprintf(outfile,"\n"); } if (runConfig.prtType[4] == 1) { dtyp_s = "L2"; nobs = 2; obs[0] = -(fazdot_P[1] + fazddot_P[1]*dt/2.0)*dt + (double)P2faz_50hz[i]/(double)P2_HR_SCALE; obs[0] = chip1 * (faz_sav - faz2 + obs[0]/L1toL2)*1.0e-3; obs[1] = (double)P2snr_50hz[i]; fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)(ttag1)+(i-s_dum)*f_dum-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); loop(j,nobs) fprintf(outfile," %.15g", obs[j]); fprintf(outfile,"\n"); } if (get_P1hirate && (runConfig.prtType[6] == 1)) { dtyp_s = "LC"; nobs = 3; vr = -(fazdot_P[0] + fazddot_P[0]*dt/2.0)*dt + (double)recd_50hz[i]/(double)CA_HR_SCALE; vr = chip1 * (faz_sav + vr -(double)Pfaz_50hz[i]/(double)P1_HR_SCALE + 0.25)*1.0e-3; xr = -(fazdot_P[1] + fazddot_P[1]*dt/2.0)*dt + (double)P2faz_50hz[i]/(double)P2_HR_SCALE; xr = chip1 * (faz_sav - faz2 + xr/L1toL2)*1.0e-3; obs[0] = acoef1*vr+acoef2*xr; obs[1] = vr - xr; vr = (Psnr_50hz[i] > 0) ? chip1/(double)Psnr_50hz[i] : 0.0; xr = (P2snr_50hz[i] > 0) ? chip2/(double)P2snr_50hz[i] : 0.0; obs[2] = chip1/sqrt(acoef1*acoef1*vr*vr+acoef2*acoef2*xr*xr); fprintf(outfile," %14.6f %-8s %-8s %-2s %3d %15.6f %10.4e%3d", (double)(ttag1)+(i-s_dum)*f_dum-qm_ttag, rcv_s, gps_s, dtyp_s, mtyp, brk, sigma, nobs); loop(j,nobs) fprintf(outfile," %.15g", obs[j]); fprintf(outfile,"\n"); } } } } else { fprintf(outfile,"%d prn%02d CA-L2 %f %d PCA-P2 %.15g\n", ttag1-ttag_shift,prn_1,faz2*chip1,snr[2],(double)(faz_res2*chip)); } } } if (configFlagTst(prtHighRtP12,configFlag) && !bad_hrate && !configFlagTst(prtQmFmt,configFlag)) { if (chan2 == chan1 && time2 == time1) { for (i = 0; i < hr_samp2; i++) { if (hr_samp == 50) { dt = 0.02*(i-25); } else { dt = 0.1*(i-5); } obs[0] = (faz_sav-faz2)*L1toL2; obs[0] = obs[0] - (fazdot_P[1] + fazddot_P[1]*dt/2.0)*dt + (double)P2faz_50hz[i]/(double)P2_HR_SCALE; if (hr_samp2 == 50) { fprintf(outfile,"L2 50Hz %14.3f %02d %lf %d %.6g\n",(double)(ttag1-ttag_shift)+dt, (int)prn_1,obs[0],P2faz_50hz[i],P2snr_50hz[i]); } else { fprintf(outfile,"L2 10Hz %14.3f %02d %lf %d %.6g\n",(double)(ttag1-ttag_shift)+dt, (int)prn_1,obs[0],P2faz_50hz[i],P2snr_50hz[i]); } } } } if (fread(&len, sizeof(byte), 1, infile) != 1) exit(4); break; default: dataList.readByte += 1; dataList.unknownByte += 1; break; } typ = len; } fclose(infile); if (configFlagTst(prtL_obs,configFlag)) { purge_P(outfile,fttp); /* print the satellite information and reorganize the output file */ lli = pT->tm_year; if (lli < 1000) lli += (pT->tm_year > 50) ? 1900 : 2000; fprintf(outfile," %4d %02d %02d %02d %02d %9.6f TIME OF LAST OBS\n", lli, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, (double)pT->tm_sec); loop1(i, NP) if (sat_count[i][0] > 0) eff_sat ++; fprintf(outfile," %2d # OF SATELLITES\n",eff_sat); loop1(i, NP) { if (sat_count[i][0] > 0) fprintf(outfile," %2d %5d %5d %5d %5d PRN / # OF OBS\n", i,sat_count[i][0],sat_count[i][0],sat_count[i][0],sat_count[i][0]); } fclose(outfile); fclose(fttp); if (add_head && configFlagTst(prtHeadFile,configFlag)) { strcat(addheadline,cmdL->headFileName); strcat(addheadline," >> "); strcat(addheadline,cmdL->outFileName); system(addheadline); } strcat(catline,cmdL->outFileName); system(catline); system("rm -f temprinexfile"); } if (configFlagTst(prtDataStatus,configFlag)) { strcat(cline,cmdL->inFileName); strcat(cline," | awk '{print $1}' > tempoutputfile"); system(cline); ftemp = fopen("tempoutputfile","r"); fscanf(ftemp,"%d",&dataList.fileSize); fclose(ftemp); system("rm -f tempoutputfile"); fprintf(outfile," File name = [%s]\n",cmdL->inFileName); fprintf(outfile," File size = [%d] byte read = [%d] unknown byte = [%d]\n", dataList.fileSize,dataList.readByte,dataList.unknownByte); fprintf(outfile," %ds low rate data (records): total = [%d] bad = [%d]\n",samp,dataList.recordCounter[0][0],dataList.recordCounter[0][1]); fprintf(outfile," 1 hz high rate L1 data (records): total = [%d] bad = [%d]\n",dataList.recordCounter[1][0],dataList.recordCounter[1][1]); fprintf(outfile," %d hz high rate CA data (samples): total = [%d] unrepaired = [%d] junk = [%d]\n", hr_s,dataList.recordCounter[2][0],dataList.recordCounter[2][1],dataList.recordCounter[1][1]*hr_samp); fprintf(outfile," %d hz high rate CA-L1 data (records): total = [%d] bad = [%d] mismatch = [%d]\n", hr_s1,dataList.recordCounter[7][0],dataList.recordCounter[7][1],misl11); fprintf(outfile," %d hz high rate CA-L2 data (records): total = [%d] bad = [%d] mismatch = [%d]\n", hr_s2,dataList.recordCounter[3][0],dataList.recordCounter[3][1],misl21); fprintf(outfile," Antenna status data (records): total = [%d] bad = [%d]\n", dataList.recordCounter[4][0],dataList.recordCounter[4][1]); fprintf(outfile," Ephemeris data (records): total = [%d] bad = [%d]\n", dataList.recordCounter[5][0],dataList.recordCounter[5][1]); fprintf(outfile," Occultation Schedule data (records): total = [%d] bad = [%d]\n", dataList.recordCounter[8][0],dataList.recordCounter[8][1]); /* fprintf(outfile," TB header information (records): total = [%d] bad = [%d]\n", dataList.recordCounter[6][0],dataList.recordCounter[6][1]); */ fprintf(outfile," data span: from [%d] to [%d]\n",dataList.recordSpan[0],dataList.recordSpan[1]); loop(i,MAX_PRN) { fprintf(outfile," sat prn = [%d] usage = [%d] span: from [%d] to [%d]\n", i+1,dataList.satCounter[i],dataList.satSpan[i][0],dataList.satSpan[i][1]); } } system("rm -f temprinexfile"); if (zipfil) system("rm -f tmp_input.trb"); } int pick(byte *A, int n, int m) { int i; loop(i,m) A[i] = buf[n++]; } int snr2n(unsigned short s) { if (s > 10) { if (s > 100) { if (s > 60000) return(1); else return( (s > 500) ? 9 : 8 ); } else return( (s > 50) ? 7 : 6 ); } else { if (s > 3) return( (s > 5) ? 5 : 4 ); else return( (s > 1) ? 3 : 2 ); } } purge_P(FILE *outfile, FILE *fttp) { int i, nprns, lli; double l2l1,lamda1; FILE *ftemp; char *cline = "date | awk '{printf \"%s/%02d/%d %s\\n\",$2,$3,$6,$4}' >> tempoutputfile"; char *operator = " ",*opdate = " ", *optime = " "; lamda1 = (double)299792458/(double)1575420000; l2l1 = (double)60/(double)77; nprns = 0; loop1(i, NP) if (P[i].flg) nprns++; if (!nprns) return(0); tt = (time_t) (ttag_last + 315964800); pT = gmtime(&tt); if (headflg) { system("whoami > tempoutputfile"); system(cline); ftemp = fopen("tempoutputfile","r"); fscanf(ftemp,"%s\n",operator); fscanf(ftemp,"%s %s\n",opdate,optime); fclose(ftemp); system("rm -f tempoutputfile"); fprintf(outfile," 2 OBSERVATION DATA GPS RINEX VERSION / TYPE\n"); fprintf(outfile,"TBtool v1.0 %12s %11s %8s PGM / RUN BY / DATE\n",operator,opdate,optime); fprintf(outfile," 10 INTERVAL\n"); fprintf(outfile," 1 1 0 WAVELENGTH FACT L1/2\n"); fprintf(outfile," 4 L1 L2 P1 P2 # / TYPES OF OBSERV\n"); fprintf(outfile,"SNR is mapped to signal strength [0,1,2-9] COMMENT\n"); fprintf(outfile," SNR: >500 >100 >50 >10 >5 >3 >1 >0 bad n/a COMMENT\n"); fprintf(outfile," sig: 9 8 7 6 5 4 3 2 1 0 COMMENT\n"); lli = pT->tm_year; if (lli < 1000) lli += (pT->tm_year > 50) ? 1900 : 2000; fprintf(outfile," %4d %02d %02d %02d %02d %9.6f TIME OF FIRST OBS\n", lli, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, (double)pT->tm_sec); fprintf(fttp,"... rest of header ... COMMENT\n"); fprintf(fttp," END OF HEADER\n"); headflg = 0; } fprintf(fttp," %02d %02d %02d %02d %02d %010.7f 0 %2d", pT->tm_year % 100, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, (double)pT->tm_sec, nprns); loop1(i, NP) { if (P[i].flg) fprintf(fttp," %02d", i); if (P[i].flg) sat_count[i][0] ++; } fprintf(fttp,"\n"); /* loop1(i, NP) if (P[i].flg) printf(" %ld prn%02d %14.3f [%d] %14.3f [%d]\n", ttag_last, i, P[i].tu[0]-P[i].fz[0]*lamda1,snr_temp[i][0],P[i].tu[1]-P[i].fz[1]*lamda1/l2l1,snr_temp[i][2]); */ loop1(i, NP) { pP = P + i; if (pP->flg) { lli = (pP->flg_prev) ? 4 : 5; fprintf(fttp,"%14.3f%1d%1d%14.3f%1d%1d%14.3f%1d%1d%14.3f%1d%1d\n", pP->fz[0], lli, pP->ss[0], pP->fz[1], lli, pP->ss[2], pP->tu[0], lli, pP->ss[0], pP->tu[1], lli, pP->ss[2]); } pP->flg_prev = pP->flg; pP->flg = 0; } } qm_title(FILE *outfile,char *rcv_s, char *gps_s, double ttag, int mtyp) { int i; if (mtyp <= 1) { fprintf(outfile," 0 2\n\n %s %s\n",rcv_s,gps_s); } else if (mtyp == 2) { fprintf(outfile," 1 1\n %s\n %s \n",gps_s,rcv_s); } fprintf(outfile," %13.2f\n 10\n 2\n 1\n 1 3 4 5 2\n",ttag); } void get_p2g(long epoch, FILE *fp) { int pp, gg, y1, y2, m1, m2, d1, d2, n; long ep1, ep2; char buf[512]; loop(pp,32) p2g[pp] = 0; fgets(buf, 512, fp); n = 1; while (fgets(buf, 512, fp)) { n++; if ((sscanf(buf + 32, "%d", &gg) != 1) || (sscanf(buf + 39, "%d", &pp) != 1) || (sscanf(buf + 2, "%4d-%2d-%2d", &y1, &m1, &d1) != 3) || (sscanf(buf + 18, "%4d-", &y2) != 1) ) { fprintf(stderr, "Problem parsing line %d of prn2gps file \n", n); exit(1); } T.tm_sec = T.tm_min = T.tm_hour = T.tm_isdst = 0; T.tm_mday = d1; T.tm_mon = m1 - 1; T.tm_year = y1 - 1900; ep1 = (long)mktime(&T) - ttag_shift; ep2 = 0; if (y2) { if (sscanf(buf + 23, "%2d-%2d", &m2, &d2) != 2) { fprintf(stderr, "Problem parsing line %d of prn2gps file \n", n); exit(1); } T.tm_sec = T.tm_min = T.tm_hour = T.tm_isdst = 0; T.tm_mday = d2; T.tm_mon = m2 - 1; T.tm_year = y2 - 1900; ep2 = (long)mktime(&T) - ttag_shift; } if (pp > 0 && pp < 32 && epoch >= ep1) { if (y2 == 0 || epoch <= ep2) p2g[pp] = gg; } } }