add beidou almanac processing, exposing some problem with ephAge

pull/1/head^2
bert hubert 2019-09-02 18:11:45 +02:00
parent 686ce706fe
commit 96ea0b9231
2 changed files with 99 additions and 4 deletions

View File

@ -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;
}

View File

@ -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) {