galmon/sbas.hh

84 lines
2.2 KiB
C++
Raw Normal View History

2020-02-14 14:28:14 -07:00
#pragma once
#include <cstdint>
#include <string>
#include <map>
#include "navmon.hh"
#include <vector>
#include "minivec.hh"
2020-02-14 14:28:14 -07:00
// 0 do not use
// 1 PRN mask
// 2-5 fast corrections
// 7 Fast correction degradation factor
// 10 Degradation parameters
// 18 Ionospheric grid point masks
// 24 Mixed fastllong-term satellite error corrections
// 25 half-message
// 26 Ionospheric delay corrections
// 27 SBAS service message
// GSA HQ Prague
const Point c_egnosCenter{3970085, 1021937, 4869792};
// Somewhere in Minnesota, Dakota, Canada border
const Point c_waasCenter{-510062, -4166466, 4786089};
2020-02-14 14:28:14 -07:00
struct SBASState
{
struct FastCorrection
{
SatID id;
double correction;
int udrei;
time_t lastUpdate{-1};
};
struct LongTermCorrection
{
SatID id;
int iod8;
int toa;
int iodp;
double dx, dy, dz, dai;
2020-02-25 15:17:55 -07:00
double ddx{0}, ddy{0}, ddz{0}, ddai{0};
2020-02-14 14:28:14 -07:00
bool velocity{false};
time_t lastUpdate{-1};
};
2020-02-25 15:17:55 -07:00
std::pair<std::vector<SBASState::FastCorrection>, std::vector<SBASState::LongTermCorrection>> parse(const std::basic_string<uint8_t>& sbas, time_t now);
2020-02-14 14:28:14 -07:00
void parse0(const std::basic_string<uint8_t>& message, time_t now);
// updates slot2prn mapping
void parse1(const std::basic_string<uint8_t>& message, time_t now);
std::vector<FastCorrection> parse2_5(const std::basic_string<uint8_t>& message, time_t now);
std::vector<FastCorrection> parse6(const std::basic_string<uint8_t>& message, time_t now);
void parse7(const std::basic_string<uint8_t>& message, time_t now);
std::pair<std::vector<FastCorrection>, std::vector<LongTermCorrection>> parse24(const std::basic_string<uint8_t>& message, time_t now);
std::vector<LongTermCorrection> parse25(const std::basic_string<uint8_t>& message, time_t now);
int getSBASNumber(int slot) const;
SatID getSBASSatID(int slot) const;
std::map<SatID, FastCorrection> d_fast;
std::map<SatID, LongTermCorrection> d_longterm;
time_t d_lastDNU{-1};
std::map<int,int> d_slot2prn;
int d_latency = -1;
time_t d_lastSeen{-1};
void parse25H(const std::basic_string<uint8_t>& sbas, time_t t, int offset, std::vector<LongTermCorrection>& ret);
};
struct SBASCombo
{
SBASState::FastCorrection fast;
SBASState::LongTermCorrection longterm;
};