Merge remote-tracking branch 'origin/master' into armhf
commit
e228886848
|
@ -6,7 +6,7 @@
|
|||
#include "fmt/printf.h"
|
||||
#include "ext/powerblog/h2o-pp.hh"
|
||||
#include <variant>
|
||||
#include "githash.h"
|
||||
|
||||
#include "CLI/CLI.hpp"
|
||||
#include "version.hh"
|
||||
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
/*
|
||||
cerr<<"Preamble "<<getbitu(&cnav[0], 0, 8)<<" sv "<<
|
||||
getbitu(&cnav[0], 8, 6) << " type "<< type <<
|
||||
" tow " << tow;
|
||||
|
||||
if(type == 10) {
|
||||
wn = getbitu(&cnav[0], 38, 13);
|
||||
cerr<<" t0p " << 300*getbitu(&cnav[0], 54,11)<< " t0e "<< 300*getbitu(&cnav[0], 70, 11);
|
||||
}
|
||||
else if(type == 11) {
|
||||
cerr<<" t0e "<< 300* getbitu(&cnav[0], 38, 11);
|
||||
|
||||
|
||||
}
|
||||
else if(type == 32) {
|
||||
cerr<< " delta-ut1 " << 1000.0*ldexp(getbits(&cnav[0], 215, 31), -24)<< "ms rate " << 1000.0*ldexp(getbits(&cnav[0], 246, 19), -25) << " te0p " <<
|
||||
16*getbits(&cnav[0], 127, 16);
|
||||
|
||||
}
|
||||
*/
|
|
@ -0,0 +1,227 @@
|
|||
#pragma once
|
||||
#include <bitset>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include "bits.hh"
|
||||
#include <iostream>
|
||||
#include <math.h>
|
||||
|
||||
struct GPSCNavAlmanac
|
||||
{
|
||||
int dataid{-1};
|
||||
int sv;
|
||||
uint32_t t0a{0};
|
||||
uint32_t e{0}, sqrtA{0};
|
||||
int32_t M0, Omega0, deltai, omega, omegadot;
|
||||
int health;
|
||||
int af0, af1;
|
||||
|
||||
double getMu() const
|
||||
{
|
||||
return 3.986005 * pow(10.0, 14.0);
|
||||
} // m^3/s^2
|
||||
// same for galileo & gps
|
||||
double getOmegaE() const { return 7.2921151467 * pow(10.0, -5.0);} // rad/s
|
||||
|
||||
|
||||
double getE() const
|
||||
{
|
||||
return ldexp(e, -21);
|
||||
}
|
||||
double getT0e() const
|
||||
{
|
||||
return ldexp(t0a, 12);
|
||||
}
|
||||
|
||||
double getI0() const
|
||||
{
|
||||
return M_PI*0.3 + ldexp(M_PI*deltai, -19);
|
||||
}
|
||||
|
||||
double getOmegadot() const
|
||||
{
|
||||
return ldexp(M_PI * omegadot, -38);
|
||||
}
|
||||
|
||||
double getSqrtA() const
|
||||
{
|
||||
return ldexp(sqrtA, -11);
|
||||
}
|
||||
|
||||
double getOmega0() const
|
||||
{
|
||||
return ldexp(M_PI * Omega0, -23);
|
||||
}
|
||||
double getOmega() const
|
||||
{
|
||||
return ldexp(M_PI * omega, -23);
|
||||
}
|
||||
|
||||
double getM0() const
|
||||
{
|
||||
return ldexp(M_PI * M0, -23);
|
||||
}
|
||||
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
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
struct GPSCNavState
|
||||
{
|
||||
uint32_t t0e;
|
||||
uint32_t e, sqrtA;
|
||||
int32_t m0, omega0, i0, omega, idot, omegadot, deltan;
|
||||
|
||||
|
||||
int16_t cuc{0}, cus{0}, crc{0}, crs{0}, cic{0}, cis{0};
|
||||
// 16 seconds
|
||||
uint16_t t0c;
|
||||
|
||||
// 2^-31 2^-43
|
||||
int32_t af0 , af1;
|
||||
// ???
|
||||
int8_t af2;
|
||||
uint32_t wn{0}, tow{0};
|
||||
|
||||
double getMu() const
|
||||
{
|
||||
return 3.986005 * pow(10.0, 14.0);
|
||||
} // m^3/s^2
|
||||
// same for galileo & gps
|
||||
double getOmegaE() const { return 7.2921151467 * pow(10.0, -5.0);} // rad/s
|
||||
|
||||
uint32_t getT0e() const { return t0e; }
|
||||
double getSqrtA() const { return ldexp(sqrtA, -19); }
|
||||
double getE() const { return ldexp(e, -33); }
|
||||
double getCuc() const { return ldexp(cuc, -29); } // radians
|
||||
double getCus() const { return ldexp(cus, -29); } // radians
|
||||
double getCrc() const { return ldexp(crc, -5); } // meters
|
||||
double getCrs() const { return ldexp(crs, -5); } // meters
|
||||
double getM0() const { return ldexp(m0 * M_PI, -31); } // radians
|
||||
double getDeltan()const { return ldexp(deltan *M_PI, -43); } //radians/s
|
||||
double getI0() const { return ldexp(i0 * M_PI, -31); } // radians
|
||||
double getCic() const { return ldexp(cic, -29); } // radians
|
||||
double getCis() const { return ldexp(cis, -29); } // radians
|
||||
double getOmegadot() const { return ldexp(omegadot * M_PI, -43); } // radians/s
|
||||
double getOmega0() const { return ldexp(omega0 * M_PI, -31); } // radians
|
||||
double getIdot() const { return ldexp(idot * M_PI, -43); } // radians/s
|
||||
double getOmega() const { return ldexp(omega * M_PI, -31); } // radians
|
||||
|
||||
|
||||
uint8_t gpshealth{0};
|
||||
uint16_t ai0{0};
|
||||
int16_t ai1{0}, ai2{0};
|
||||
|
||||
int BGDE1E5a{0}, BGDE1E5b{0};
|
||||
|
||||
bool disturb1{false}, disturb2{false}, disturb3{false}, disturb4{false}, disturb5{false};
|
||||
//
|
||||
// 2^-30 2^-50 1 8-bit week
|
||||
int32_t a0{0}, a1{0}, t0t{0}, wn0t{0};
|
||||
int32_t a0g{0}, a1g{0}, t0g{0}, wn0g{0};
|
||||
int8_t dtLS{0}, dtLSF{0};
|
||||
uint16_t wnLSF{0};
|
||||
uint8_t dn; // leap second day number
|
||||
|
||||
|
||||
int gpsiod{-1};
|
||||
|
||||
int teop;
|
||||
int deltaUT1;
|
||||
int deltaUT1dot;
|
||||
|
||||
// milliseconds
|
||||
std::pair<double, double> getUT1OffsetMS(int tow)
|
||||
{
|
||||
int delta = ephAge(tow, 16* teop);
|
||||
std::cout<<" tow "<<tow<<" teop "<< 16*teop <<" delta "<<delta<<" " << 1000.0*ldexp(deltaUT1, -24)<<"ms ";
|
||||
double cur = ldexp(deltaUT1 + ldexp(delta * deltaUT1dot / 86400.0, -1), -24);
|
||||
double trend = ldexp(deltaUT1dot, -25);
|
||||
return {1000.0* cur, 1000.0*trend};
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
std::pair<double, double> getGPSCNavAtomicOffset(int tow, const T& eph)
|
||||
{
|
||||
int delta = ephAge(tow, getT0c(eph));
|
||||
double cur = eph.af0 + ldexp(delta*eph.af1, -12) + ldexp(delta*delta*eph.af2, -24);
|
||||
double trend = ldexp(eph.af1, -12) + ldexp(2*delta*eph.af2, -24);
|
||||
|
||||
// now in units of 2^-31 seconds, which are 0.5 nanoseconds each
|
||||
double factor = ldexp(1000000000, -31);
|
||||
return {factor * cur, factor * trend};
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
std::pair<double, double> getGPSCNavUTCOffset(int tow, int wn, const T& eph)
|
||||
{
|
||||
// 2^-30 2^-50 3600
|
||||
// a0 a1 t0t
|
||||
|
||||
int dw = (int)(uint8_t)wn - (int)(uint8_t) eph.wn0t;
|
||||
int delta = dw*7*86400 + tow - eph.t0t; // this is pre-scaled for GPS..
|
||||
|
||||
double cur = eph.a0 + ldexp(1.0*delta*eph.a1, -20);
|
||||
double trend = ldexp(eph.a1, -20);
|
||||
|
||||
// now in units of 2^-30 seconds, which are ~1.1 nanoseconds each
|
||||
|
||||
double factor = ldexp(1000000000, -30);
|
||||
return {factor * cur, factor * trend};
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
template<typename T>
|
||||
int parseGPSCNavMessage(std::basic_string_view<uint8_t> msg, T& out)
|
||||
{
|
||||
using namespace std;
|
||||
int type = getbitu(&msg[0], 14, 6);
|
||||
out.tow = 6 * getbitu(&msg[0], 20, 17) - 12;
|
||||
|
||||
if(type == 10) {
|
||||
out.wn = getbitu(&msg[0], 38, 13);
|
||||
// out.ura = getbitu(&msg[0], 65, 5);
|
||||
out.t0e = getbitu(&msg[0], 70, 11); // XXX scale?
|
||||
|
||||
// int32_t deltaSqrtA = getbits(&msg[0], 81, 26);
|
||||
// int32_t SqrtADot = getbits(&msg[0], 107, 25);
|
||||
out.deltan = getbitu(&msg[0], 132, 17); // XXX scale??
|
||||
// int deltandot = getbitu(&msg[0], 149, 23); // XXX scale??
|
||||
// int64_t M0n = getbitu(&msg[0], 172, 33); // XXX scale??
|
||||
|
||||
out.e = getbitu(&msg[0], 205, 33); // XXX scale??
|
||||
out.omega = getbitu(&msg[0], 238, 33); // XXX scale?
|
||||
}
|
||||
else if(type == 11) {
|
||||
out.t0e = getbitu(&msg[0], 38, 11); // XXX scale?
|
||||
out.omega0 = getbitu(&msg[0], 49, 33); // XXX scale?
|
||||
out.i0 = getbitu(&msg[0], 82, 33); // XXX scale?
|
||||
// int64_t deltaOmegaDot = getbitu(&msg[0], 115, 17); // XXX scale?
|
||||
out.idot = getbitu(&msg[0], 132, 15); // XXX scale?
|
||||
out.cis = getbits(&msg[0], 147, 16);// XXX scale?
|
||||
out.cic = getbits(&msg[0], 163, 16);// XXX scale?
|
||||
out.crs = getbits(&msg[0], 179, 24);// XXX scale?
|
||||
out.crc = getbits(&msg[0], 203, 24);// XXX scale?
|
||||
out.cus = getbits(&msg[0], 227, 21);// XXX scale?
|
||||
out.cuc = getbits(&msg[0], 248, 21); // XXX scale?
|
||||
}
|
||||
else if(type == 32) {
|
||||
out.deltaUT1 = getbits(&msg[0], 215, 31);
|
||||
out.deltaUT1dot = getbits(&msg[0], 246, 19);
|
||||
out.teop = getbitu(&msg[0], 127, 16);
|
||||
}
|
||||
return type;
|
||||
}
|
|
@ -16,7 +16,7 @@
|
|||
#include <dirent.h>
|
||||
#include <inttypes.h>
|
||||
#include "navmon.hh"
|
||||
#include "githash.h"
|
||||
|
||||
#include "CLI/CLI.hpp"
|
||||
#include "version.hh"
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
#include "navmon.pb.h"
|
||||
#include <unistd.h>
|
||||
#include "navmon.hh"
|
||||
#include "githash.h"
|
||||
|
||||
#include "CLI/CLI.hpp"
|
||||
#include "version.hh"
|
||||
|
||||
|
|
31
navdump.cc
31
navdump.cc
|
@ -26,8 +26,9 @@
|
|||
#include "sp3.hh"
|
||||
#include "ubx.hh"
|
||||
#include <unistd.h>
|
||||
#include "githash.h"
|
||||
|
||||
#include "version.hh"
|
||||
#include "gpscnav.hh"
|
||||
#include "rinex.hh"
|
||||
|
||||
static char program[]="navdump";
|
||||
|
@ -177,7 +178,7 @@ void emitFixState(int src, double iTow, FixStat& fs, int n)
|
|||
continue;
|
||||
|
||||
Point sat;
|
||||
double E=getCoordinates(iTow, s.second.ephemeris, &sat);
|
||||
getCoordinates(iTow, s.second.ephemeris, &sat);
|
||||
if(getElevationDeg(sat, g_ourpos) < 20)
|
||||
continue;
|
||||
/*
|
||||
|
@ -251,6 +252,7 @@ try
|
|||
app.add_option("--stations", stations, "Listen to specified stations.");
|
||||
app.add_option("--positions,-p", doObserverPosition, "Print out observer positions (or not)");
|
||||
app.add_option("--rfdata,-r", doRFData, "Print out RF data (or not)");
|
||||
app.add_option("--recdata", doReceptionData, "Print out reception data (or not)");
|
||||
app.add_flag("--version", doVERSION, "show program version and copyright");
|
||||
|
||||
try {
|
||||
|
@ -333,7 +335,7 @@ try
|
|||
if(nmm.type() == NavMonMessage::ReceptionDataType) {
|
||||
if(doReceptionData) {
|
||||
etstamp();
|
||||
cout<<"receptiondata for "<<nmm.rd().gnssid()<<","<<nmm.rd().gnsssv()<<","<< (nmm.rd().has_sigid() ? nmm.rd().sigid() : 0) <<" db "<<nmm.rd().db()<<" ele "<<nmm.rd().el() <<" azi "<<nmm.rd().azi()<<" prRes "<<nmm.rd().prres() << endl;
|
||||
cout<<"receptiondata for "<<nmm.rd().gnssid()<<","<<nmm.rd().gnsssv()<<","<< (nmm.rd().has_sigid() ? nmm.rd().sigid() : 0) <<" db "<<nmm.rd().db()<<" ele "<<nmm.rd().el() <<" azi "<<nmm.rd().azi()<<" prRes "<<nmm.rd().prres() << " qi " << (nmm.rd().has_qi() ? nmm.rd().qi() : -1) << " used " << (nmm.rd().has_used() ? nmm.rd().used() : -1) << endl;
|
||||
}
|
||||
}
|
||||
else if(nmm.type() == NavMonMessage::GalileoInavType) {
|
||||
|
@ -515,7 +517,6 @@ try
|
|||
cout<<endl;
|
||||
}
|
||||
else if(nmm.type() == NavMonMessage::GPSInavType) {
|
||||
|
||||
int sv = nmm.gpsi().gnsssv();
|
||||
|
||||
if(!svfilter.check(0, sv))
|
||||
|
@ -603,6 +604,26 @@ try
|
|||
|
||||
cout<<"\n";
|
||||
}
|
||||
else if(nmm.type() == NavMonMessage::GPSCnavType) {
|
||||
int sv = nmm.gpsc().gnsssv();
|
||||
int sigid = nmm.gpsc().sigid();
|
||||
if(!svfilter.check(0, sv, sigid))
|
||||
continue;
|
||||
etstamp();
|
||||
static map<int, GPSCNavState> states;
|
||||
auto& state = states[sv];
|
||||
int type = parseGPSCNavMessage(
|
||||
std::basic_string<uint8_t>((uint8_t*)nmm.gpsc().contents().c_str(),
|
||||
nmm.gpsc().contents().size()),
|
||||
state);
|
||||
|
||||
SatID sid{0, (uint32_t)sv, (uint32_t)sigid};
|
||||
cout << "GPS CNAV " << makeSatIDName(sid) <<" tow "<<state.tow<<" type " << type;
|
||||
if(type == 32) {
|
||||
cout <<" delta-ut1 "<< state.getUT1OffsetMS(state.tow).first<<"ms";
|
||||
}
|
||||
cout<<endl;
|
||||
}
|
||||
else if(nmm.type() == NavMonMessage::BeidouInavTypeD1) {
|
||||
int sv = nmm.bid1().gnsssv();
|
||||
|
||||
|
@ -938,7 +959,7 @@ try
|
|||
|
||||
Point sat;
|
||||
|
||||
double E=getCoordinates(rtow - clockoffms/1000.0, eph, &sat, sv.sv != 14);
|
||||
double E=getCoordinates(rtow - clockoffms/1000.0, eph, &sat);
|
||||
double range = Vector(g_ourpos, sat).length();
|
||||
getCoordinates(rtow - clockoffms/1000.0 - range/299792458.0, eph, &sat);
|
||||
range = Vector(g_ourpos, sat).length();
|
||||
|
|
22
navmon.cc
22
navmon.cc
|
@ -307,3 +307,25 @@ string makeHexDump(const string& str)
|
|||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::string sbasName(int prn)
|
||||
{
|
||||
string sbas;
|
||||
if(prn == 138 || prn == 131 || prn == 133) {
|
||||
sbas = "WAAS";
|
||||
}
|
||||
else if(prn== 126 || prn == 136 || prn == 123 ) {
|
||||
sbas = "EGNOS";
|
||||
}
|
||||
else if(prn == 140 || prn == 125 || prn == 141) {
|
||||
sbas = "SDCM";
|
||||
}
|
||||
else if(prn == 127 || prn == 128 || prn == 138) {
|
||||
sbas ="GAGAN";
|
||||
}
|
||||
else
|
||||
sbas ="SBAS";
|
||||
|
||||
sbas+=" " + std::to_string(prn);
|
||||
return sbas;
|
||||
}
|
||||
|
|
|
@ -6,6 +6,9 @@
|
|||
#include <tuple>
|
||||
#include <mutex>
|
||||
|
||||
extern const char* g_gitHash;
|
||||
|
||||
|
||||
struct EofException{};
|
||||
struct TimeoutError{};
|
||||
|
||||
|
@ -66,6 +69,8 @@ char getGNSSChar(int id);
|
|||
std::string makeSatIDName(const SatID& satid);
|
||||
std::string makeSatPartialName(const SatID& satid);
|
||||
|
||||
std::string sbasName(int prn);
|
||||
|
||||
extern int g_dtLS, g_dtLSBeidou;
|
||||
uint64_t utcFromGST(int wn, int tow);
|
||||
double utcFromGST(int wn, double tow);
|
||||
|
|
13
navmon.proto
13
navmon.proto
|
@ -15,6 +15,7 @@ message NavMonMessage {
|
|||
ObserverDetailsType = 11;
|
||||
UbloxJammingStatsType = 12;
|
||||
SBASMessageType = 13;
|
||||
GPSCnavType = 14;
|
||||
}
|
||||
|
||||
required uint64 sourceID = 1;
|
||||
|
@ -160,6 +161,17 @@ message NavMonMessage {
|
|||
}
|
||||
|
||||
|
||||
message GPSCnav {
|
||||
required uint32 gnssWN =1;
|
||||
required uint32 gnssTOW =2; // INTEGERS!
|
||||
|
||||
required uint32 gnssID =3;
|
||||
required uint32 gnssSV =4;
|
||||
required bytes contents =5;
|
||||
required uint32 sigid = 6;
|
||||
}
|
||||
|
||||
|
||||
optional GalileoInav gi=5;
|
||||
optional ReceptionData rd=6;
|
||||
optional RFData rfd=7;
|
||||
|
@ -173,4 +185,5 @@ message NavMonMessage {
|
|||
optional ObserverDetails od = 15;
|
||||
optional UbloxJammingStats ujs = 16;
|
||||
optional SBASMessage sbm = 17;
|
||||
optional GPSCnav gpsc=18;
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
#include "storage.hh"
|
||||
#include <dirent.h>
|
||||
#include <inttypes.h>
|
||||
#include "githash.h"
|
||||
|
||||
#include "CLI/CLI.hpp"
|
||||
#include "version.hh"
|
||||
|
||||
|
|
91
navparse.cc
91
navparse.cc
|
@ -30,8 +30,9 @@
|
|||
#include "navparse.hh"
|
||||
#include <fenv.h>
|
||||
#include "influxpush.hh"
|
||||
#include "githash.h"
|
||||
|
||||
#include "CLI/CLI.hpp"
|
||||
#include "gpscnav.hh"
|
||||
#include "version.hh"
|
||||
|
||||
static char program[]="navparse";
|
||||
|
@ -63,6 +64,21 @@ struct ObserverPosition
|
|||
std::map<int, ObserverPosition> g_srcpos;
|
||||
|
||||
|
||||
struct SBASStatus
|
||||
{
|
||||
time_t last_seen{0};
|
||||
time_t last_type_0{0};
|
||||
struct PerRecv
|
||||
{
|
||||
time_t last_seen{0};
|
||||
};
|
||||
map<int, PerRecv> perrecv;
|
||||
|
||||
};
|
||||
typedef map<int, SBASStatus> sbas_t;
|
||||
sbas_t g_sbas;
|
||||
GetterSetter<sbas_t> g_sbaskeeper;
|
||||
|
||||
map<int, BeidouAlmanacEntry> g_beidoualma;
|
||||
map<int, pair<GlonassMessage, GlonassMessage>> g_glonassalma;
|
||||
map<int, GalileoMessage::Almanac> g_galileoalma;
|
||||
|
@ -1070,6 +1086,49 @@ try
|
|||
}
|
||||
return ret;
|
||||
});
|
||||
|
||||
h2s.addHandler("/sbas.json", [](auto handler, auto req) {
|
||||
addHeaders(req);
|
||||
auto svstats = g_statskeeper.get();
|
||||
auto sbas = g_sbaskeeper.get();
|
||||
nlohmann::json ret = nlohmann::json::object();
|
||||
h2o_add_header(&req->pool, &req->res.headers, H2O_TOKEN_CACHE_CONTROL,
|
||||
NULL, H2O_STRLIT("max-age=3"));
|
||||
|
||||
// Access-Control-Allow-Origin
|
||||
h2o_add_header(&req->pool, &req->res.headers, H2O_TOKEN_ACCESS_CONTROL_ALLOW_ORIGIN,
|
||||
NULL, H2O_STRLIT("*"));
|
||||
|
||||
|
||||
for(const auto& s: sbas) {
|
||||
nlohmann::json item = nlohmann::json::object();
|
||||
item["last-seen"] = s.second.last_seen;
|
||||
item["last-seen-s"] = time(0) - s.second.last_seen;
|
||||
|
||||
item["last-type-0"] = s.second.last_type_0;
|
||||
item["last-type-0-s"] = time(0) - s.second.last_type_0;
|
||||
|
||||
if(s.second.last_seen - s.second.last_type_0 < 120)
|
||||
item["health"]="DON'T USE";
|
||||
else
|
||||
item["health"]="OK";
|
||||
|
||||
nlohmann::json perrecv = nlohmann::json::object();
|
||||
for(const auto& recv : s.second.perrecv) {
|
||||
perrecv[to_string(recv.first)]["last-seen"] = recv.second.last_seen;
|
||||
perrecv[to_string(recv.first)]["last-seen-s"] = time(0) - recv.second.last_seen;
|
||||
}
|
||||
item["perrecv"]=perrecv;
|
||||
|
||||
|
||||
|
||||
ret[to_string(s.first)]=item;
|
||||
|
||||
|
||||
|
||||
}
|
||||
return ret;
|
||||
});
|
||||
|
||||
h2s.addHandler("/svs.json", [](auto handler, auto req) {
|
||||
addHeaders(req);
|
||||
|
@ -1346,6 +1405,7 @@ try
|
|||
static time_t lastWebSync;
|
||||
if(lastWebSync != time(0)) {
|
||||
g_statskeeper.set(g_svstats);
|
||||
g_sbaskeeper.set(g_sbas);
|
||||
g_galileoalmakeeper.set(g_galileoalma);
|
||||
g_glonassalmakeeper.set(g_glonassalma);
|
||||
g_beidoualmakeeper.set(g_beidoualma);
|
||||
|
@ -1422,8 +1482,6 @@ try
|
|||
int gnssid = nmm.rd().gnssid();
|
||||
int sv = nmm.rd().gnsssv();
|
||||
int sigid = nmm.rd().sigid();
|
||||
if(nmm.sourceid()==14)
|
||||
cerr<<"gnssid: "<<gnssid<<endl;
|
||||
if(gnssid==2 && sigid == 0)
|
||||
sigid = 1;
|
||||
|
||||
|
@ -1977,6 +2035,22 @@ try
|
|||
if(g_svstats[id].wn < 512)
|
||||
g_svstats[id].wn += 2048;
|
||||
}
|
||||
else if(nmm.type()== NavMonMessage::GPSCnavType) {
|
||||
SatID id{nmm.gpsc().gnssid(), nmm.gpsc().gnsssv(), nmm.gpsc().sigid()};
|
||||
g_svstats[id].perrecv[nmm.sourceid()].t = nmm.localutcseconds();
|
||||
|
||||
auto& svstat = g_svstats[id];
|
||||
|
||||
GPSCNavState gcns;
|
||||
parseGPSCNavMessage(
|
||||
std::basic_string<uint8_t>((uint8_t*)nmm.gpsc().contents().c_str(),
|
||||
nmm.gpsc().contents().size()),
|
||||
gcns);
|
||||
// cout<<"Got a message from "<<makeSatIDName(id)<<endl;
|
||||
svstat.tow = nmm.gpsc().gnsstow();
|
||||
svstat.wn = nmm.gpsc().gnsswn();
|
||||
|
||||
}
|
||||
else if(nmm.type()== NavMonMessage::BeidouInavTypeD1) {
|
||||
try {
|
||||
SatID id{nmm.bid1().gnssid(), nmm.bid1().gnsssv(), nmm.bid1().sigid()};
|
||||
|
@ -2164,6 +2238,17 @@ try
|
|||
}
|
||||
// cout<<"GLONASS R"<<id.second<<" str "<<strno<<endl;
|
||||
}
|
||||
else if(nmm.type() == NavMonMessage::SBASMessageType) {
|
||||
auto& sb = g_sbas[nmm.sbm().gnsssv()];
|
||||
sb.last_seen = nmm.localutcseconds();
|
||||
sb.perrecv[nmm.sourceid()].last_seen = nmm.localutcseconds();
|
||||
|
||||
basic_string<uint8_t> sbas((uint8_t*)nmm.sbm().contents().c_str(), nmm.sbm().contents().length());
|
||||
int type = getbitu(&sbas[0], 8, 6);
|
||||
if(type == 0) { // the don't use message
|
||||
sb.last_type_0 = nmm.localutcseconds();
|
||||
}
|
||||
}
|
||||
else {
|
||||
cout<<"Unknown type "<< (int)nmm.type()<<endl;
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include "githash.h"
|
||||
|
||||
#include "CLI/CLI.hpp"
|
||||
#include "version.hh"
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
#include "navmon.hh"
|
||||
#include "fmt/format.h"
|
||||
#include "fmt/printf.h"
|
||||
#include "githash.h"
|
||||
|
||||
#include "CLI/CLI.hpp"
|
||||
#include "version.hh"
|
||||
|
||||
|
@ -61,6 +61,7 @@ int main(int argc, char **argv)
|
|||
app.add_option("--period,-p", periodarg, "period over which to report (1h, 1w)");
|
||||
app.add_option("--begin,-b", beginarg, "Beginning");
|
||||
app.add_option("--end,-e", endarg, "End");
|
||||
app.add_option("--sigid,-s", sigid, "Signal identifier. 1 or 5 for Galileo.");
|
||||
app.add_option("--influxdb", influxDBName, "Name of influxdb database");
|
||||
try {
|
||||
app.parse(argc, argv);
|
||||
|
@ -117,6 +118,9 @@ int main(int argc, char **argv)
|
|||
|
||||
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}];
|
||||
|
||||
unsigned int maxintervals=0;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include "SGP4.h"
|
||||
#include <string>
|
||||
#include <time.h>
|
||||
#include "githash.h"
|
||||
|
||||
#include "CLI/CLI.hpp"
|
||||
#include "version.hh"
|
||||
|
||||
|
|
46
ubxtool.cc
46
ubxtool.cc
|
@ -34,7 +34,7 @@
|
|||
#include "comboaddress.hh"
|
||||
#include "swrappers.hh"
|
||||
#include "sclasses.hh"
|
||||
#include "githash.h"
|
||||
|
||||
#include "version.hh"
|
||||
|
||||
static char program[]="ubxtool";
|
||||
|
@ -923,6 +923,7 @@ int main(int argc, char** argv)
|
|||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(!doKeepNMEA) {
|
||||
if (doDEBUG) { cerr<<humanTimeNow()<<" Disabling NMEA"<<endl; }
|
||||
|
@ -1263,7 +1264,7 @@ int main(int argc, char** argv)
|
|||
svseen.clear();
|
||||
}
|
||||
|
||||
if(id.first == 0 && !sigid) { // can only parse the old stuff
|
||||
if(id.first == 0 && !sigid) { // classic GPS
|
||||
NavMonMessage nmm;
|
||||
nmm.set_type(NavMonMessage::GPSInavType);
|
||||
nmm.set_localutcseconds(g_gnssutc.tv_sec);
|
||||
|
@ -1289,6 +1290,33 @@ int main(int argc, char** argv)
|
|||
ns.emitNMM( nmm);
|
||||
continue;
|
||||
}
|
||||
if(id.first == 0 && sigid) { // new GPS
|
||||
auto cnav = getGPSFromSFRBXMsg(payload);
|
||||
static int wn, tow;
|
||||
|
||||
int type = getbitu(&cnav[0], 14, 6);
|
||||
tow = 6 * getbitu(&cnav[0], 20, 17) - 12;
|
||||
|
||||
if(type == 10) {
|
||||
wn = getbitu(&cnav[0], 38, 13);
|
||||
}
|
||||
|
||||
if(!wn)
|
||||
continue; // can't file this yet
|
||||
|
||||
NavMonMessage nmm;
|
||||
nmm.set_type(NavMonMessage::GPSCnavType);
|
||||
nmm.set_localutcseconds(g_gnssutc.tv_sec);
|
||||
nmm.set_localutcnanoseconds(g_gnssutc.tv_nsec);
|
||||
nmm.set_sourceid(g_srcid);
|
||||
nmm.mutable_gpsc()->set_gnsswn(wn); // XXX this sucks
|
||||
nmm.mutable_gpsc()->set_sigid(sigid);
|
||||
nmm.mutable_gpsc()->set_gnsstow(tow); // "with 6 second increments" -- needs to be adjusted
|
||||
nmm.mutable_gpsc()->set_gnssid(id.first);
|
||||
nmm.mutable_gpsc()->set_gnsssv(id.second);
|
||||
nmm.mutable_gpsc()->set_contents(string((char*)cnav.c_str(), cnav.size()));
|
||||
ns.emitNMM( nmm);
|
||||
}
|
||||
else if(id.first ==2) { // GALILEO
|
||||
auto inav = getInavFromSFRBXMsg(payload);
|
||||
unsigned int wtype = getbitu(&inav[0], 0, 6);
|
||||
|
@ -1470,8 +1498,8 @@ int main(int argc, char** argv)
|
|||
|
||||
}
|
||||
else if(msg.getClass() == 1 && msg.getType() == 0x35) { // UBX-NAV-SAT
|
||||
// if(version9) // we have UBX-NAV-SIG
|
||||
// continue;
|
||||
if(version9) // we have UBX-NAV-SIG
|
||||
continue;
|
||||
// if (doDEBUG) { cerr<<humanTimeNow()<<" Info for "<<(int) payload[5]<<" svs: \n"; }
|
||||
for(unsigned int n = 0 ; n < payload[5]; ++n) {
|
||||
int gnssid = payload[8+12*n];
|
||||
|
@ -1530,8 +1558,14 @@ int main(int argc, char** argv)
|
|||
sigid = payload[10+16*n];
|
||||
if(gnssid == 2 && sigid ==6) // they separate out I and Q, but the rest of UBX doesn't
|
||||
sigid = 5; // so map it back
|
||||
if(gnssid == 2 && sigid ==0) // they separate out I and Q, but the rest of UBX doesn't
|
||||
sigid = 1; // so map it back
|
||||
if(gnssid == 2 && sigid ==0)
|
||||
sigid = 1;
|
||||
if(gnssid ==0) {
|
||||
if(sigid==3) // L2C is sent as '4' and '3', but the '4' numbers here are bogus
|
||||
sigid=4; // if we see 3, use it, and change number to 4 to be consistent
|
||||
else if(sigid != 0) // sigid 0 = 0
|
||||
continue; // ignore the rest
|
||||
}
|
||||
}
|
||||
else if(gnssid==2) { // version 8 defaults galileo to E1B
|
||||
sigid = 1;
|
||||
|
|
Loading…
Reference in New Issue