diff --git a/Makefile b/Makefile index 288c486..8251ffd 100644 --- a/Makefile +++ b/Makefile @@ -72,7 +72,7 @@ navmon.pb.cc: navmon.proto ubxtool: navmon.pb.o ubxtool.o ubx.o bits.o ext/fmt-5.2.1/src/format.o galileo.o gps.o beidou.o navmon.o ephemeris.o $(SIMPLESOCKETS) osen.o githash.o $(CXX) -std=gnu++17 $^ -o $@ -L/usr/local/lib -lprotobuf -pthread -testrunner: navmon.pb.o testrunner.o ubx.o bits.o ext/fmt-5.2.1/src/format.o galileo.o gps.o beidou.o ephemeris.o sp3.o osen.o +testrunner: navmon.pb.o testrunner.o ubx.o bits.o ext/fmt-5.2.1/src/format.o galileo.o gps.o beidou.o ephemeris.o sp3.o osen.o navmon.o $(CXX) -std=gnu++17 $^ -o $@ -L/usr/local/lib -lprotobuf check: testrunner diff --git a/navmon.cc b/navmon.cc index 001e77c..33b0564 100644 --- a/navmon.cc +++ b/navmon.cc @@ -152,3 +152,13 @@ std::string humanTime(time_t t, uint32_t nanoseconds) strftime(buffer, sizeof(buffer), fmt.c_str(), &tm); return buffer; } + +// truncate to x digits precision, see testrunner.cc for details +double truncPrec(double in, unsigned int digits) +{ + double partial = in - trunc(in); + int factor=1; + for(; digits ; --digits) + factor *= 10; + return trunc(in) + round(partial * factor) / factor; +} diff --git a/navmon.hh b/navmon.hh index 6fffaa6..6cbd635 100644 --- a/navmon.hh +++ b/navmon.hh @@ -49,3 +49,5 @@ private: std::mutex d_lock; }; + +double truncPrec(double in, unsigned int digits); diff --git a/navparse.cc b/navparse.cc index 5986fe4..31b558a 100644 --- a/navparse.cc +++ b/navparse.cc @@ -785,10 +785,10 @@ try Point sat; if((sv.first.gnss == 0 || sv.first.gnss == 2) && sv.second.completeIOD()) { - svo["delta_hz"] = iter->second.deltaHz; + svo["delta_hz"] = truncPrec(iter->second.deltaHz, 2); auto hzCorrection = getHzCorrection(time(0), src.first , sv.first.gnss, sv.first.sigid, svstats); if(hzCorrection) - svo["delta_hz_corr"] = iter->second.deltaHz - *hzCorrection; + svo["delta_hz_corr"] = truncPrec(iter->second.deltaHz - *hzCorrection, 2); getCoordinates(latestTow(sv.first.gnss, svstats), sv.second.liveIOD(), & sat); } @@ -804,9 +804,7 @@ try svo["azi"] = roundf(10.0*getAzimuthDeg(sat, our))/10.0; } - - - svo["prres"] = iter->second.prres; + svo["prres"] = truncPrec(iter->second.prres, 2); svo["qi"] = iter->second.qi; svo["used"] = iter->second.used; svo["age-s"] = time(0) - iter->second.t; @@ -965,7 +963,7 @@ try recv["db"] = perrecv.second.db; recv["qi"] = perrecv.second.qi; recv["used"] = perrecv.second.used; - recv["prres"] = perrecv.second.prres; + recv["prres"] = truncPrec(perrecv.second.prres, 2); recv["elev"] = perrecv.second.el; recv["last-seen-s"] = time(0) - perrecv.second.t; recvs[std::to_string(perrecv.first)] = recv; @@ -1152,7 +1150,7 @@ try if(auto iter = beidoualma.find(s.first.sv); iter != beidoualma.end()) { Point almapos; getCoordinates(s.second.tow, iter->second.alma, &almapos); - item["alma-dist"] = Vector(almapos, p).length()/1000.0; + item["alma-dist"] = truncPrec(Vector(almapos, p).length()/1000.0, 1); } } } @@ -1171,7 +1169,7 @@ try item["eph-age-m"] = ephAge(s.second.tow, getGlonassT0e(pseudoTow, s.second.glonassMessage.Tb))/60.0; if(s.second.tleMatch.distance >=0) { item["best-tle"] = s.second.tleMatch.name; - item["best-tle-dist"] = s.second.tleMatch.distance /1000.0; + item["best-tle-dist"] = truncPrec(s.second.tleMatch.distance /1000.0, 1); item["best-tle-norad"] = s.second.tleMatch.norad; item["best-tle-int-desig"] = s.second.tleMatch.internat; } @@ -1328,7 +1326,7 @@ try det["db"] = pr.second.db; det["last-seen-s"] = time(0) - pr.second.t; - det["prres"] = pr.second.prres; + det["prres"] = truncPrec(pr.second.prres, 2); det["qi"] = pr.second.qi; det["used"] = pr.second.used; @@ -1348,11 +1346,11 @@ try item["last-seen-s"] = time(0) - nanoTime(s.first.gnss, s.second.wn, s.second.tow)/1000000000; if(s.second.latestDisco >=0) { - item["latest-disco"]= s.second.latestDisco; + item["latest-disco"]= truncPrec(s.second.latestDisco, 3); item["latest-disco-age"]= s.second.latestDiscoAge; } if(s.second.timeDisco > -100 && s.second.timeDisco < 100) { - item["time-disco"]= s.second.timeDisco; + item["time-disco"]= truncPrec(s.second.timeDisco, 1); } diff --git a/testrunner.cc b/testrunner.cc index a2a8867..937b324 100644 --- a/testrunner.cc +++ b/testrunner.cc @@ -2,6 +2,7 @@ #include "ext/doctest.h" #include "ephemeris.hh" +#include "navmon.hh" TEST_CASE("testing ephemeris age") { CHECK(ephAge(0,0) == 0); @@ -36,3 +37,15 @@ TEST_CASE("sp3") { CHECK(e.clockBias == 1000.0 * -306.607761); } + +TEST_CASE("truncation") { + CHECK(truncPrec(123.0, 0) == 123.0); + CHECK(truncPrec(123.123, 1) == 123.1); + CHECK(truncPrec(123.123, 2) == 123.12); + CHECK(truncPrec(123.123, 3) == 123.123); + CHECK(truncPrec(123.191, 1) == 123.2); + CHECK(truncPrec(123.191, 2) == 123.19); + CHECK(truncPrec(123.999, 0) == 124.0); + + +}