#pragma once #include "minivec.hh" #include // lat, lon, height (rad, rad, meters) std::tuple ecefToWGS84(double x, double y, double z); double ephAge(double tow, int t0e); template double getCoordinates(double tow, const T& iod, Point* p, bool quiet=true) { using namespace std; // here goes const double mu = iod.getMu(); const double omegaE = iod.getOmegaE(); const double sqrtA = iod.getSqrtA(); const double deltan = iod.getDeltan(); const double t0e = iod.getT0e(); const double m0 = iod.getM0(); const double e = iod.getE(); const double omega = iod.getOmega(); const double cuc = iod.getCuc(); const double cus = iod.getCus(); const double crc = iod.getCrc(); const double crs = iod.getCrs(); const double cic = iod.getCic(); const double cis = iod.getCis(); const double idot = iod.getIdot(); const double i0 = iod.getI0(); const double Omegadot = iod.getOmegadot(); const double Omega0 = iod.getOmega0(); // NO IOD BEYOND THIS POINT! if(!quiet) { auto todeg = [](double rad) { return 360 * rad/(2*M_PI); }; cerr << "sqrtA = "<< sqrtA << endl; cerr << "deltan = "<< deltan << endl; cerr << "t0e = "<< t0e << endl; cerr << "m0 = "<< m0 << " ("<x = xprime * cos(Omega) - yprime * cos(i) * sin(Omega); p->y = xprime * sin(Omega) + yprime * cos(i) * cos(Omega); p->z = yprime * sin(i); if(!quiet) { Point core(0.0, .0, .0); Vector radius(core, *p); cerr << radius.length() << " calculated r "< void getSpeed(double tow, const T& eph, Vector* v) { Point a, b; getCoordinates(tow-0.5, eph, &a); getCoordinates(tow+0.5, eph, &b); *v = Vector(a, b); } template DopplerData doDoppler(double tow, const Point& us, const T& eph, double freq) { DopplerData ret; // be careful with time here - we need to evaluate at the timestamp of this RFDataType update // which might be newer than .tow in g_svstats getCoordinates(tow, eph, &ret.sat); Point core; Vector us2sat(us, ret.sat); getSpeed(tow, eph, &ret.speed); Vector core2us(core, us); Vector dx(us, ret.sat); // = x-ourx, dy = y-oury, dz = z-ourz; us2sat.norm(); ret.radvel=us2sat.inner(ret.speed); double c=299792458; ret.preddop = -freq * ret.radvel/c; // be careful with time here - ret.ephage = ephAge(tow, eph.getT0e()); // cout<<"Radial velocity: "<< radvel<<", predicted doppler: "<< preddop << ", measured doppler: "< getLongLat(double x, double y, double z); double getElevationDeg(const Point& sat, const Point& our); double getAzimuthDeg(const Point& sat, const Point& our);