From 3c565b815e950f696567ac17ccc470a4fe3eafe0 Mon Sep 17 00:00:00 2001 From: bert hubert Date: Sat, 25 Apr 2020 11:43:25 +0200 Subject: [PATCH] this code is running, so it must be good --- Makefile | 4 ++++ galmonmon.cc | 2 +- html/doalles.js | 20 ++++++++++++++------ navdump.cc | 8 +++++--- navparse.cc | 19 ++++++++++++++++++- navparse.hh | 3 +++ osen.cc | 1 + reporter.cc | 48 ++++++++++++++++++++++++++++++++++++++++++------ rtcm.cc | 1 + rtcm.hh | 1 + 10 files changed, 90 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index 034cd14..62c389e 100644 --- a/Makefile +++ b/Makefile @@ -80,6 +80,10 @@ navparse: navparse.o ext/fmt-6.1.2/src/format.o $(H2OPP) $(SIMPLESOCKETS) minicu reporter: reporter.o ext/fmt-6.1.2/src/format.o $(SIMPLESOCKETS) minicurl.o ubx.o bits.o navmon.pb.o gps.o ephemeris.o beidou.o glonass.o $(patsubst %.cc,%.o,$(wildcard ext/sgp4/libsgp4/*.cc)) tle.o navmon.o coverage.o osen.o githash.o $(CXX) -std=gnu++17 $^ -o $@ -pthread -L/usr/local/lib -lprotobuf -lcurl +tracker: tracker.o ext/fmt-6.1.2/src/format.o $(SIMPLESOCKETS) minicurl.o ubx.o bits.o navmon.pb.o gps.o ephemeris.o beidou.o glonass.o $(patsubst %.cc,%.o,$(wildcard ext/sgp4/libsgp4/*.cc)) tle.o navmon.o coverage.o osen.o githash.o + $(CXX) -std=gnu++17 $^ -o $@ -pthread -L/usr/local/lib -lprotobuf -lcurl + + galmonmon: galmonmon.o ext/fmt-6.1.2/src/format.o $(SIMPLESOCKETS) minicurl.o ubx.o bits.o navmon.pb.o gps.o ephemeris.o beidou.o glonass.o $(patsubst %.cc,%.o,$(wildcard ext/sgp4/libsgp4/*.cc)) tle.o navmon.o coverage.o osen.o githash.o $(CXX) -std=gnu++17 $^ -o $@ -pthread -L/usr/local/lib -lprotobuf -lcurl diff --git a/galmonmon.cc b/galmonmon.cc index 07b20b2..f00a20b 100644 --- a/galmonmon.cc +++ b/galmonmon.cc @@ -311,7 +311,7 @@ int main(int argc, char **argv) auto healthchange = g_sk.reportState(fullName, "health", sv["healthissue"]!=0); std::optional tooOldChange; if(gnssid == 2) - tooOldChange = g_sk.reportState(fullName, "eph-too-old", sv["eph-age-m"] > 180, fmt::sprintf("%.2f", (double)sv["eph-age-m"])); + tooOldChange = g_sk.reportState(fullName, "eph-too-old", sv["eph-age-m"] > 105, fmt::sprintf("%.2f", (double)sv["eph-age-m"])); else tooOldChange = g_sk.reportState(fullName, "eph-too-old", sv["eph-age-m"] > 140, fmt::sprintf("%.2f", (double)sv["eph-age-m"])); diff --git a/html/doalles.js b/html/doalles.js index fb2e440..ff3c1c2 100644 --- a/html/doalles.js +++ b/html/doalles.js @@ -14,7 +14,7 @@ function maketable(str, arr) enter(). append("tr"); - var columns = ["sv", "best-tle", "iod", "eph-age-m", "latest-disco", "time-disco", "sisa", "health", "alma-dist", "delta-utc", "sources", "hqsources", "db", "delta_hz_corr","prres", "elev", "last-seen-s"]; + var columns = ["sv", "best-tle", "iod", "eph-age-m", "latest-disco", "time-disco", "sisa", "health", "alma-dist", "delta-utc", "sources", "hqsources", "db", "rtcm-eph-delta-cm","prres", "elev", "last-seen-s"]; // append the header row thead.append("tr") @@ -25,6 +25,8 @@ function maketable(str, arr) .html(function(column) { if(column == "delta_hz_corr") return "ΔHz"; + if(column == "rtcm-eph-delta-cm") + return "Δrtcm"; if(column == "delta-gps") return "ΔGPS ns"; if(column == "delta-utc") @@ -60,6 +62,12 @@ function maketable(str, arr) // ret.value=""; ret.value += " "+row.sv+""; } + else if(column == "rtcm-eph-delta-cm") { + if(row[column] != null) + ret.value = row[column].toFixed(1)+" cm"; + else + ret.value=""; + } else if(column == "aodc/e") { if(row["aodc"] != null && row["aode"] != null) ret.value = row["aodc"]+"/"+row["aode"]; @@ -306,11 +314,11 @@ function update() d3.json("global.json", function(d) { var str="Galileo-UTC offset: "+d["gst-utc-offset-ns"].toFixed(2)+" ns"; str += ", Galileo-GPS offset: "+d["gst-gps-offset-ns"].toFixed(2)+" ns"; - str += " , GPS-UTC offset: "+d["gps-utc-offset-ns"].toFixed(2)+" ns"; - str += " , BeiDou-UTC offset: "+d["beidou-utc-offset-ns"].toFixed(2)+" ns"; - str += " , GLONASS-UTC offset: "+d["glonass-utc-offset-ns"].toFixed(2)+" ns"; - str += " , GLONASS-GPS offset: "+d["glonass-gps-offset-ns"].toFixed(2)+" ns"; - str += ", GPS-UTC offset: "+d["beidou-utc-offset-ns"].toFixed(2)+" ns, "+d["leap-seconds"]+" leap seconds"; + str += ", GPS-UTC offset: "+d["gps-utc-offset-ns"].toFixed(2)+" ns"; + str += ", BeiDou-UTC offset: "+d["beidou-utc-offset-ns"].toFixed(2)+" ns"; + str += ", GLONASS-UTC offset: "+d["glonass-utc-offset-ns"].toFixed(2)+" ns"; + str += ", GLONASS-GPS offset: "+d["glonass-gps-offset-ns"].toFixed(2)+" ns"; + str += ", "+d["leap-seconds"]+" leap seconds (GPS/Galileo)"; d3.select('#facts').html(str); lastseen = moment(1000*d["last-seen"]); diff --git a/navdump.cc b/navdump.cc index cab4956..3c670ff 100644 --- a/navdump.cc +++ b/navdump.cc @@ -287,7 +287,9 @@ try ofstream iodstream("iodstream.csv"); iodstream << "timestamp gnssid sv iodnav t0e age" << endl; - + ofstream ephcsv("eph.csv"); + ephcsv<<"timestamp gnssid sv old_iod new_iod age insta_age x y z lat lon h"<(latlonh)/M_PI<<" " << 180*get<1>(latlonh)/M_PI <<" " <(latlonh) << "\n"; oldEph[sv]=gm; } } diff --git a/navparse.cc b/navparse.cc index ad629da..a062b12 100644 --- a/navparse.cc +++ b/navparse.cc @@ -1245,6 +1245,19 @@ try // item["t0c"] = s.second.liveIOD().getT0c(); + if(s.second.rtcmEphDelta.id.gnss == s.first.gnss && s.second.rtcmEphDelta.id.sv == s.first.sv && s.second.rtcmEphDelta.iod == s.second.liveIOD().getIOD() + && abs(s.second.rtcmEphDelta.sow - s.second.tow())<60) { + const auto& ed = s.second.rtcmEphDelta; + item["rtcm-eph-delta-cm"] = truncPrec(sqrt(ed.radial*ed.radial + ed.along*ed.along + ed.cross*ed.cross)/10.0, 2); + item["rtcm-eph-radial-cm"] = truncPrec(ed.radial/10.0, 2); + item["rtcm-eph-along-cm"] = truncPrec(ed.along/10.0, 2); + item["rtcm-eph-cross-cm"] = truncPrec(ed.cross/10.0, 2); + item["rtcm-eph-dradial-cm"] = truncPrec(ed.dradial/10.0, 2); + item["rtcm-eph-dalong-cm"] = truncPrec(ed.dalong/10.0, 2); + item["rtcm-eph-dcross-cm"] = truncPrec(ed.dcross/10.0, 2); + + } + Point p; Point core; @@ -2166,6 +2179,10 @@ try rm.parse(nmm.rm().contents()); if(rm.type == 1057 || rm.type == 1240) { for(const auto& ed : rm.d_ephs) { + auto iter = g_svstats.find(ed.id); + if(iter != g_svstats.end() && iter->second.completeIOD() && iter->second.liveIOD().getIOD() == ed.iod) + iter->second.rtcmEphDelta = ed; + idb.addValue(ed.id, "rtcm-eph-correction", { {"iod", ed.iod}, {"radial", ed.radial}, @@ -2328,7 +2345,7 @@ try int strno = gm.parse(std::basic_string((uint8_t*)nmm.gloi().contents().c_str(), nmm.gloi().contents().size())); g_svstats[id].perrecv[nmm.sourceid()].t = nmm.localutcseconds(); if(strno == 1 && gm.n4 != 0 && gm.NT !=0) { - uint32_t glotime = gm.getGloTime(); // this starts GLONASS time at 31st of december 1995, 00:00 UTC + // uint32_t glotime = gm.getGloTime(); // this starts GLONASS time at 31st of december 1995, 00:00 UTC // CONVERSION, possibly vital // svstat.wn = glotime / (7*86400); // svstat.tow = glotime % (7*86400); diff --git a/navparse.hh b/navparse.hh index f774185..68a8342 100644 --- a/navparse.hh +++ b/navparse.hh @@ -8,6 +8,7 @@ #include "tle.hh" #include "sbas.hh" #include "ephemeris.hh" +#include "rtcm.hh" using namespace std; // XXX @@ -59,6 +60,8 @@ struct SVStat map sbas; + RTCMMessage::EphemerisDelta rtcmEphDelta; + const GPSLikeEphemeris& liveIOD() const; const GPSLikeEphemeris& prevIOD() const; diff --git a/osen.cc b/osen.cc index 1096a52..2a27446 100644 --- a/osen.cc +++ b/osen.cc @@ -1,5 +1,6 @@ #include #include +#include "ephemeris.hh" /* gratefully adopted from http://danceswithcode.net/engineeringnotes/geodetic_to_ecef/geodetic_to_ecef.html which in turn is based on the excellent work from diff --git a/reporter.cc b/reporter.cc index 35f6b97..dd812ad 100644 --- a/reporter.cc +++ b/reporter.cc @@ -38,6 +38,8 @@ struct IntervalStat { std::optional unhealthy; std::optional sisa; + bool ripe{false}; + bool expired{false}; }; @@ -116,12 +118,34 @@ int main(int argc, char **argv) } } + res = mc.getURL(url + mc.urlEncode("select max(\"eph-age\") from ephemeris where "+period+" and sigid='"+to_string(sigid)+"' group by gnssid,sv,sigid,time(10m)")); + j = nlohmann::json::parse(res); + for(const auto& sv : j["results"][0]["series"]) { + const auto& tags=sv["tags"]; + SatID id{(unsigned int)std::stoi((string)tags["gnssid"]), (unsigned int)std::stoi((string)tags["sv"]), (unsigned int)std::stoi((string)tags["sigid"])}; + + + for(const auto& v : sv["values"]) { + if(v.size() > 1 && v[1] != nullptr) { + int seconds = (int)v[1]; + if(seconds > 86400) { // probably wraparound + } + else if(seconds > 4*3600) { + g_stats[id][(int)v[0]].expired = 1; + cout< 2*3600) + g_stats[id][(int)v[0]].ripe = (int)v[1] > 7200; + } + } + } + g_stats.erase({2,14,1}); g_stats.erase({2,18,1}); g_stats.erase({2,14,5}); g_stats.erase({2,18,5}); - //g_stats[{2,11,1}]; + g_stats[{2,19,1}]; unsigned int maxintervals=0; time_t start=time(0), stop=0; @@ -140,10 +164,16 @@ int main(int argc, char **argv) cout<<"Report on "<