Merge remote-tracking branch 'origin/master' into armhf

pull/56/head
Leonid Evdokimov 2020-02-11 22:02:26 +03:00
commit e228886848
15 changed files with 452 additions and 21 deletions

View File

@ -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"

20
gpscnav.cc 100644
View File

@ -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);
}
*/

227
gpscnav.hh 100644
View File

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

View File

@ -16,7 +16,7 @@
#include <dirent.h>
#include <inttypes.h>
#include "navmon.hh"
#include "githash.h"
#include "CLI/CLI.hpp"
#include "version.hh"

View File

@ -13,7 +13,7 @@
#include "navmon.pb.h"
#include <unistd.h>
#include "navmon.hh"
#include "githash.h"
#include "CLI/CLI.hpp"
#include "version.hh"

View File

@ -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();

View File

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

View File

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

View File

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

View File

@ -15,7 +15,7 @@
#include "storage.hh"
#include <dirent.h>
#include <inttypes.h>
#include "githash.h"
#include "CLI/CLI.hpp"
#include "version.hh"

View File

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

View File

@ -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"

View File

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

View File

@ -1,7 +1,7 @@
#include "SGP4.h"
#include <string>
#include <time.h>
#include "githash.h"
#include "CLI/CLI.hpp"
#include "version.hh"

View File

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