diff --git a/beidou.hh b/beidou.hh index d4b3964..08edef5 100644 --- a/beidou.hh +++ b/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 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; } diff --git a/navdump.cc b/navdump.cc index de1f0a6..fb6171b 100644 --- a/navdump.cc +++ b/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 "<