⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 procsbf.c

📁 GPS导航定位程序
💻 C
📖 第 1 页 / 共 2 页
字号:

		CurrentTIC(&ctic);
		TICToGpsTime(ctic,&refweek,&gsec);
		if(gsec-toa>302400.0)
		    refweek++;
		else if(gsec-toa<-302400.0)
		    refweek--;

		PROTECT++;
		alms[almsv-1].almhlth = almhlth;
		alms[almsv-1].refweek = refweek;
		alms[almsv-1].toa = toa;
		alms[almsv-1].ecc = aecc;
		alms[almsv-1].inclin = ainclin;
		alms[almsv-1].rora = arora;
		alms[almsv-1].sqrta = asqrta;
		alms[almsv-1].ratoa = aratoa;
		alms[almsv-1].argpg = aargpg;
		alms[almsv-1].manom = amanom;
		alms[almsv-1].af0 = aaf0;
		alms[almsv-1].af1 = aaf1;
		alms[almsv-1].vflg = 1;
		PROTECT--;
	    }
	    else if(pageid==55)               /* Special message subframe. */
	    {
		spmsg[0] = (g[2]>>14)&0xFF;
		spmsg[1] = (g[2]>>6)&0xFF;
		for(i=0;i<6;i++)
		{
		    spmsg[2+3*i] = (g[3+i]>>22)&0xFF;
		    spmsg[3+3*i] = (g[3+i]>>14)&0xFF;
		    spmsg[4+3*i] = (g[3+i]>>6)&0xFF;
		}
		spmsg[20] = (g[9]>>22)&0xFF;
		spmsg[21] = (g[9]>>14)&0xFF;
		spmsg[22] = 0;
	    }
	    else if(pageid==56)       /* The iono/UTC correction subframe. */
	    {
		alpha0 = SignExtend(g[2]>>14,7) * ldexp(1.0,-30);
		alpha1 = SignExtend(g[2]>>6,7) * ldexp(1.0,-27);
		alpha2 = SignExtend(g[3]>>22,7) * ldexp(1.0,-24);
		alpha3 = SignExtend(g[3]>>14,7) * ldexp(1.0,-24);
		beta0 = SignExtend(g[3]>>6,7) * ldexp(1.0,11);
		beta1 = SignExtend(g[4]>>22,7) * ldexp(1.0,14);
		beta2 = SignExtend(g[4]>>14,7) * ldexp(1.0,16);
		beta3 = SignExtend(g[4]>>6,7) * ldexp(1.0,16);
		A0 = (long)(((g[6]<<2)&0xFFFFFF00L)+((g[7]>>22)&0xFF))
		     * 9.313225746e-10;
		A1 = SignExtend(g[5]>>6,23) * 8.881784197e-16;
		dtls = (unsigned long)((g[8]>>22)&0xFF);
		tot = (unsigned long)((g[7]>>14)&0xFF) * 4096;
		wnt = (unsigned long)((g[7]>>6)&0xFF);
		wnlsf = (unsigned long)((g[8]>>14)&0xFF);
		dn = (unsigned long)((g[8]>>6)&0xFF);
		dtlsf = SignExtend(g[9]>>22,7);

		PROTECT++;
		NoOldData = (ionoutc.vflg==0);
		NewDataSet = (ionoutc.a0!=alpha0) || (ionoutc.a1!=alpha1)
			     || (ionoutc.a2!=alpha2) || (ionoutc.a3!=alpha3)
			     || (ionoutc.b0!=beta0)  || (ionoutc.b1!=beta1)
			     || (ionoutc.b2!=beta2) || (ionoutc.b3!=beta3)
			     || (ionoutc.A0!=A0) || (ionoutc.A1!=A1)
			     || (ionoutc.dtls!=dtls) || (ionoutc.tot!=tot)
			     || (ionoutc.wnt!=wnt) || (ionoutc.wnlsf!=wnlsf)
			     || (ionoutc.dn!=dn) || (ionoutc.dtlsf!=dtlsf);

		if(NoOldData || NewDataSet)
		{
		    ionoutc.a0 = alpha0;  /* Ionospheric model parameters. */
		    ionoutc.a1 = alpha1;
		    ionoutc.a2 = alpha2;
		    ionoutc.a3 = alpha3;
		    ionoutc.b0 = beta0;
		    ionoutc.b1 = beta1;
		    ionoutc.b2 = beta2;
		    ionoutc.b3 = beta3;

		    ionoutc.A0 = A0;         /* UTC conversion parameters. */
		    ionoutc.A1 = A1;
		    ionoutc.dtls = dtls;
		    ionoutc.tot = tot;
		    ionoutc.wnt = wnt;
		    ionoutc.wnlsf = wnlsf;
		    ionoutc.dn = dn;
		    ionoutc.dtlsf = dtlsf;
		    ionoutc.vflg = 1;
		}
		PROTECT--;
	    }
	    else if(pageid==63)             /* Constellation health words. */
	    {
		chlth[24] = (g[7]>>6)&0x3F;
		chlth[25] = (g[8]>>24)&0x3F;
		chlth[26] = (g[8]>>18)&0x3F;
		chlth[27] = (g[8]>>12)&0x3F;
		chlth[28] = (g[8]>>6)&0x3F;
		chlth[29] = (g[9]>>24)&0x3F;
		chlth[30] = (g[9]>>18)&0x3F;
		chlth[31] = (g[9]>>12)&0x3F;
	    }
	    sprintf(buff,"SV %2d SF 4",sv);
	    TCBComment(buff);
	    break;

	case 5:
	    if(SVDataOK==0)
		break;
	    pageid = (g[2]>>22)&0x3F;
	    if(pageid==0)
	    {
		/* There is no almanac in the designated slot for some SV. */

		almsv = pg2svid5[((tow-5)/5)%25];
		if(almsv>0 && almsv<=32)
		{
		    /* No almanac for almsv (pageid is 0, nonexistent SV). */

		    alms[almsv-1].vflg = 2;
		    LastAlm=almsv;
		}
	    }
	    else if(pageid>0 && pageid<=24)         /* This is an almanac. */
	    {
		almsv = pageid;
		LastAlm=almsv;
		aecc = (unsigned long)((g[2]>>6)&0xFFFF)*4.768371582e-7;
		toa = (unsigned long)((g[3]>>22)&0xFF)*4096.0;
		ainclin = (0.3 + SignExtend(g[3]>>6,15)*1.907348633e-6)*PI;
		arora = SignExtend(g[4]>>14,15)*3.637978807e-12*PI;
		asqrta = (unsigned long)((g[5]>>6)&0xFFFFFFL)*4.8828125e-4;

		if(asqrta==0.0)
		{
		    WarningMessage("ILLEGAL SUBFRAME: sqrt(A) was zero");
		    Beep(1000,100);
		    return;
		}

		aratoa = SignExtend(g[6]>>6,23)*1.192092896e-7*PI;
		aargpg = SignExtend(g[7]>>6,23)*1.192092896e-7*PI;
		amanom = SignExtend(g[8]>>6,23)*1.192092896e-7*PI;
		aaf0 = SignExtend(((g[9]>>19)&0x7F8) + ((g[9]>>8)&3),10)
		       *9.536743164e-7;
		aaf1 = SignExtend((g[9]>>11)&0x7FF,10)*3.637978807e-12;
		almhlth = (g[4]>>6)&0xFF;

		/* Derive the reference week. */

		CurrentTIC(&ctic);
		TICToGpsTime(ctic,&refweek,&gsec);
		if(gsec-toa>302400.0)
		    refweek++;
		else if(gsec-toa<-302400.0)
		    refweek--;

		PROTECT++;
		alms[almsv-1].almhlth = almhlth;
		alms[almsv-1].refweek = refweek;
		alms[almsv-1].toa = toa;
		alms[almsv-1].ecc = aecc;
		alms[almsv-1].inclin = ainclin;
		alms[almsv-1].rora = arora;
		alms[almsv-1].sqrta = asqrta;
		alms[almsv-1].ratoa = aratoa;
		alms[almsv-1].argpg = aargpg;
		alms[almsv-1].manom = amanom;
		alms[almsv-1].af0 = aaf0;
		alms[almsv-1].af1 = aaf1;
		alms[almsv-1].vflg = 1;
		PROTECT--;
	    }
	    else if(pageid==51)             /* Constellation health words. */
	    {
		for(i=0;i<6;i++)
		{
		    chlth[4*i+0] = (g[i+3]>>24)&0x3F;
		    chlth[4*i+1] = (g[i+3]>>18)&0x3F;
		    chlth[4*i+2] = (g[i+3]>>12)&0x3F;
		    chlth[4*i+3] = (g[i+3]>>6)&0x3F;
		}
	    }
	    sprintf(buff,"SV %2d SF 5",sv);
	    TCBComment(buff);
	    break;
    }                                                        /* Of switch. */

    /* Update ephemeris and clock correction data only when all three
       subframes (1,2,3) are from the same data set. */

    PROTECT++;
    HaveEph123 = newsf123[sv-1].vflg1 && newsf123[sv-1].vflg2
		 && newsf123[sv-1].vflg3
		 && (newsf123[sv-1].iode2==newsf123[sv-1].iode3)
		 && ((newsf123[sv-1].iodc&0xFF)==newsf123[sv-1].iode2);
    NoOldData = (ephs[sv-1].vflg==0);
    NewDataSet = (ephs[sv-1].iode!=newsf123[sv-1].iode2)
		 || (ephs[sv-1].iodc!=newsf123[sv-1].iodc);
    PROTECT--;

    if(HaveEph123 && (NoOldData || NewDataSet) )
    {
	PROTECT++;
	e = &ephs[sv-1];
	u = &newsf123[sv-1].SF1words[0];
	e->TofXmission = (((u[1]>>13)&0x1FFFFL)-1)*6;  /* TOW of the SF 1. */
	e->iodc = newsf123[sv-1].iodc;
	e->codeL2 = (u[2]>>8)&0x3;
	e->wkn = (u[2]>>20)&0x3FF;
	e->L2Pdata = (u[3]>>29)&0x1;
	e->ura = (u[2]>>14)&0xF;
	e->s1hlth = (u[2]>>8)&0x3F;
	e->tgd = SignExtend( (u[6]>>6)&0xFF, 7)*4.656612873e-10;
	e->toc = (unsigned long)((u[7]>>6)&0xFFFFul)*16.0;
	e->tocwk = e->wkn;
	dtemp = e->toc - tow*6;
	if(dtemp>302400.0)
	    e->tocwk--;
	if(dtemp<-302400.0)
	    e->tocwk++;
	e->af2 = SignExtend(u[8]>>22,7)*2.775557562e-17;
	e->af1 = SignExtend(u[8]>>6,15)*1.136868377e-13;
	e->af0 = SignExtend(u[9]>>8,21)*4.656612873e-10;

	u = &newsf123[sv-1].SF2words[0];
	e->iode = newsf123[sv-1].iode2;
	e->crs = SignExtend(u[2]>>6,15)*0.03125;
	e->deltan = SignExtend(u[3]>>14,15)*1.136868377e-13*PI;
	e->m0 = (long)( ((u[3]<<18)&0xFF000000L)+((u[4]>>6)&0xFFFFFFL) )
		 *4.656612873e-10*PI;
	e->cuc = SignExtend(u[5]>>14,15)*1.862645149e-9;
	e->ecc = (unsigned long)(((u[5]<<18)&0xFF000000L)
		 + ((u[6]>>6)&0xFFFFFFL))*1.164153218e-10;
	e->cus = SignExtend(u[7]>>14,15)*1.862645149e-9;
	e->sqrta = (unsigned long)(((u[7]<<18)&0xFF000000L)
		   + ((u[8]>>6)&0xFFFFFFL))*1.907348633e-6;
	if(e->sqrta==0.0)
	{
	    WarningMessage("ILLEGAL SUBFRAME: sqrt(A) was zero.");
	    Beep(1000,100);
	    PROTECT--;
	    return;
	}
	e->toe = (unsigned long)((u[9]>>14)&0xFFFFul)*16.0;
	e->toewk = e->wkn;
	dtemp = e->toe - tow*6;
	if(dtemp>302400.0)
	    e->toewk--;
	if(dtemp<-302400.0)
	    e->toewk++;
	e->fti = (u[9]>>13)&1;
    
	u = &newsf123[sv-1].SF3words[0];
	e->cic = SignExtend(u[2]>>14,15)*1.862645149e-9;
	e->om0 = (long)(((u[2]<<18)&0xFF000000L)+((u[3]>>6)&0xFFFFFFL))
		 *4.656612873e-10*PI;
	e->cis = SignExtend(u[4]>>14,15)*1.862645149e-9;
	e->in0 = (long)(((u[4]<<18)&0xFF000000L)+((u[5]>>6)&0xFFFFFFL))
		 *4.656612873e-10*PI;
	e->crc = SignExtend(u[6]>>14,15)*0.03125;
	e->olc = (long)(((u[6]<<18)&0xFF000000L)+((u[7]>>6)&0xFFFFFFL))
		 *4.656612873e-10*PI;
	e->omd = SignExtend(u[8]>>6,23)*1.136868377e-13*PI;
	e->idot = SignExtend(u[9]>>8,13)*1.136868377e-13*PI;

	/* Compute a derived quantity: semimajor axis (m). */

	e->a = a = DSquare(e->sqrta);

	/* Compute a derived quantity: mean motion (rad/sec). */

	e->n0 = sqrt(GravConstant/(a*a*a));
    
	e->vflg = 1;
	newsf123[sv-1].vflg1 = newsf123[sv-1].vflg2 
			     = newsf123[sv-1].vflg3
			     = 0;
	Rx2EPH(sv);                 /* Record the new broadcast ephemeris. */
	PROTECT--;
    }
    Checkpoint("ProcessSubframe",2);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -