add beidou almanac processing, exposing some problem with ephAge
parent
686ce706fe
commit
96ea0b9231
70
beidou.hh
70
beidou.hh
|
@ -159,9 +159,63 @@ struct BeidouMessage
|
|||
omega = bbits(252, 32);
|
||||
}
|
||||
|
||||
struct Almanac
|
||||
{
|
||||
bool geo{false};
|
||||
uint32_t sqrtA;
|
||||
int a0, a1;
|
||||
int Omega0;
|
||||
uint32_t e;
|
||||
int deltai;
|
||||
uint8_t t0a;
|
||||
int Omegadot;
|
||||
int omega;
|
||||
int M0;
|
||||
int AmEpID;
|
||||
|
||||
double getMu() const { return 3.986004418 * pow(10.0, 14.0); } // m^3/s^2
|
||||
double getOmegaE() const { return 7.2921150 * pow(10, -5); } // rad/s
|
||||
|
||||
uint32_t getT0e() const { return ldexp((int)t0a, 12); }
|
||||
double getSqrtA() const { return ldexp(sqrtA, -11); }
|
||||
double getE() const { return ldexp(e, -21); }
|
||||
double getOmega() const { return ldexp(omega * M_PI, -23); } // radians
|
||||
double getM0() const { return ldexp(M0 * M_PI, -23); } // radians
|
||||
double getOmega0() const { return ldexp(Omega0 * M_PI, -23); } // radians
|
||||
double getOmegadot() const { return ldexp(Omegadot * M_PI, -38); } // radians/s
|
||||
// XXX for GEO, i0 = 0!!
|
||||
double getI0() const {
|
||||
if(geo)
|
||||
return ldexp(M_PI*deltai, -19);
|
||||
return M_PI*0.3 + ldexp(M_PI*deltai, -19);
|
||||
} // radians
|
||||
|
||||
double getIdot() const { return 0; } // radians/s
|
||||
double getCic() const { return 0; } // radians
|
||||
double getCis() const { return 0; } // radians
|
||||
double getCuc() const { return 0; } // radians
|
||||
double getCus() const { return 0; } // radians
|
||||
double getCrc() const { return 0; } // meters
|
||||
double getCrs() const { return 0; } // meters
|
||||
double getDeltan()const { return 0; } //radians/s
|
||||
} alma;
|
||||
|
||||
// 4 is all almanac
|
||||
int parse4(std::basic_string_view<uint8_t> cond)
|
||||
{
|
||||
alma.sqrtA = bbitu(51, 24);
|
||||
alma.a1 = bbits(91, 11);
|
||||
alma.a0 = bbits(102, 11);
|
||||
alma.Omega0 = bbits(121, 24);
|
||||
|
||||
alma.e = bbitu(153, 17);
|
||||
alma.deltai = bbits(170, 16);
|
||||
alma.t0a = bbitu(194, 8);
|
||||
alma.Omegadot = bbits(202, 17);
|
||||
|
||||
alma.omega = bbits(227, 24);
|
||||
alma.M0 = bbits(259, 24);
|
||||
alma.AmEpID = bbitu(291, 2);
|
||||
return bbitu(44, 7);
|
||||
}
|
||||
|
||||
|
@ -184,6 +238,22 @@ struct BeidouMessage
|
|||
a1utc = bbits(131, 24);
|
||||
deltaTLS = bbits(31+12+1+7, 8);
|
||||
}
|
||||
else {
|
||||
alma.sqrtA = bbitu(51, 24);
|
||||
alma.a1 = bbits(91, 11);
|
||||
alma.a0 = bbits(102, 11);
|
||||
alma.Omega0 = bbits(121, 24);
|
||||
|
||||
alma.e = bbitu(153, 17);
|
||||
alma.deltai = bbits(170, 16);
|
||||
alma.t0a = bbitu(194, 8);
|
||||
alma.Omegadot = bbits(202, 17);
|
||||
|
||||
alma.omega = bbits(227, 24);
|
||||
alma.M0 = bbits(259, 24);
|
||||
alma.AmEpID = bbitu(291, 2);
|
||||
}
|
||||
|
||||
return pageno;
|
||||
|
||||
}
|
||||
|
|
33
navdump.cc
33
navdump.cc
|
@ -222,11 +222,36 @@ try
|
|||
|
||||
|
||||
}
|
||||
else if(fraid == 4 && 1<= pageno && pageno <= 24) {
|
||||
else if((fraid == 4 && 1<= pageno && pageno <= 24) ||
|
||||
(fraid == 5 && 1<= pageno && pageno <= 6) ||
|
||||
(fraid == 5 && 11<= pageno && pageno <= 23) ) {
|
||||
cout <<" pageno "<< (int) pageno<<" AmEpID "<< getbitu(&cond[0], beidouBitconv(291), 2);
|
||||
}
|
||||
else if(fraid == 5 && 1<= pageno && pageno <= 6) {
|
||||
cout <<" pageno "<<(int)pageno<<" AmEpID "<< getbitu(&cond[0], beidouBitconv(291), 2);
|
||||
Point sat;
|
||||
if(fraid ==4 && pageno <= 5)
|
||||
bm.alma.geo=true;
|
||||
else
|
||||
bm.alma.geo=false;
|
||||
getCoordinates(0, bm.sow, bm.alma, &sat);
|
||||
TLERepo::Match second;
|
||||
auto match = tles.getBestMatch(nmm.localutcseconds(), sat.x, sat.y, sat.z, &second);
|
||||
cout<<" alma best-tle-match "<<match.name <<" dist "<<match.distance /1000<<" km";
|
||||
cout<<" norad " <<match.norad <<" int-desig " << match.internat;
|
||||
cout<<" 2nd-match "<<second.name << " dist "<<second.distance/1000<<" km";
|
||||
Point core{0,0,0};
|
||||
cout<<" rad "<<Vector(core,sat).length() << " t0a " << bm.alma.getT0e() << " eph-age " <<ephAge(bm.sow, bm.alma.getT0e())<<endl;
|
||||
int offset = 0;
|
||||
if(fraid == 4)
|
||||
offset = 0;
|
||||
else if(fraid == 5 && pageno <=6)
|
||||
offset = 24;
|
||||
else if(fraid == 5 && bm.alma.AmEpID ==1)
|
||||
offset = 20;
|
||||
else if(fraid == 5 && bm.alma.AmEpID ==2)
|
||||
offset = 34;
|
||||
else if(fraid == 5 && bm.alma.AmEpID ==3)
|
||||
offset = 46;
|
||||
|
||||
almanac << (int)pageno+offset <<" " << match.norad <<" " <<match.name<<" " << (int)(match.distance/1000)<<" " << (int)(Vector(core,sat).length()/1000000)<<" " << (int) fraid<<" " << (int) pageno <<" " <<(int)bm.alma.AmEpID<<" " <<(int)offset<<"\n";
|
||||
}
|
||||
|
||||
else if(fraid == 5 && pageno==7) {
|
||||
|
|
Loading…
Reference in New Issue