Pico GPS Teseo
Loading...
Searching...
No Matches
nmea_iface.cpp
Go to the documentation of this file.
1/*
2 * nmea_iface.cpp
3 *
4 * Created on: 29 jul. 2024
5 * Author: jancu
6 */
7
8module;
9
10#include <string>
11#include <array>
12#include <string_view>
13#include <chrono>
14#include <concepts>
15#include <type_traits>
16
17export module nmea;
18
19export namespace nmea {
20
21using time_t = std::chrono::hh_mm_ss<std::chrono::duration<long long, std::ratio<1, 1000>>>;
22
23enum class talker_id {
24 notset, // avoid that an initialised but unset variable assumes the first valid value
25 gps, // If system works in GPS only mode
26 glonass, // If system works in GLONASS only mode
27 galileo, // If system works in GALILEO only mode
28 beidou, // If system works in BEIDOU only mode
29 qzss, // If system works in QZSS only mode
30 multiconstellation // If system works in multi-constellation mode
31};
32
33enum class direction {
38};
39
40enum class quality : unsigned int {
41 q0 = 0,
42 q1 = 1,
43 q2 = 2,
44 q6 = 6
45};
46
47class nmea {
48public:
49 nmea() = delete; // prevent creation of objects of this utility class
50
51 static talker_id talker(const std::string_view& sv);
52 static talker_id system(const std::string_view& sv);
53 static float coord(const unsigned int degrees_chars, const std::string_view& sv);
54 static direction dir(const std::string_view& sv);
55 static void time(const std::string_view& sv, time_t& t);
56 static void date(const std::string_view& sv, std::chrono::year_month_day& d);
57 static bool valid(const std::string_view& sv);
58 static quality qual(const std::string_view& sv);
59};
60
61template<typename T>
63 requires(T t) {
64 true; // { t.success; } -> std::same_as<bool>; // need to read up
65 };
66
67template <has_success_bool T> struct nmea_result {
69 constexpr explicit operator bool() const noexcept { return result.success; }
70};
71
72struct gll {
74 static gll_result from_data(const std::string& data);
76 float lat;
77 float lon;
79 bool valid;
80 bool success = false;
81};
82
83struct gga {
85 static gga_result from_data(const std::string& data);
87 float lat;
88 float lon;
90 unsigned int sats;
92 float alt;
93 float geosep;
94 bool success = false;
95};
96
97using gsa_sat_array = std::array<unsigned int, 12>;
98
99struct gsa {
101 static gsa_result from_data(const std::string& data);
105 bool success = false;
106};
107
108struct gsv_sat {
109 unsigned int prn;
110 unsigned int elev;
111 unsigned int azim;
112 unsigned int snr;
113};
114
115using gsv_sat_array = std::array<gsv_sat, 4>;
116
117struct gsv {
119 static gsv_result from_data(const std::string& data);
122 bool success = false;
123};
124
125struct rmc {
127 static rmc_result from_data(const std::string& data);
129 float lat;
130 float lon;
131 float speed;
133 std::chrono::year_month_day d;
134 bool valid;
135 bool success = false;
136};
137
138} // namespace nmea
static quality qual(const std::string_view &sv)
Definition nmea.cpp:113
static talker_id system(const std::string_view &sv)
Definition nmea.cpp:40
nmea()=delete
static direction dir(const std::string_view &sv)
Definition nmea.cpp:64
static void time(const std::string_view &sv, time_t &t)
Definition nmea.cpp:82
static float coord(const unsigned int degrees_chars, const std::string_view &sv)
Definition nmea.cpp:56
static talker_id talker(const std::string_view &sv)
Definition nmea.cpp:22
static void date(const std::string_view &sv, std::chrono::year_month_day &d)
Definition nmea.cpp:92
Definition nmea.cpp:20
std::array< unsigned int, 12 > gsa_sat_array
std::array< gsv_sat, 4 > gsv_sat_array
std::chrono::hh_mm_ss< std::chrono::duration< long long, std::ratio< 1, 1000 > > > time_t
float geosep
quality qual
talker_id source
unsigned int sats
static gga_result from_data(const std::string &data)
Definition nmea.cpp:163
nmea_result< gga > gga_result
talker_id source
nmea_result< gll > gll_result
static gll_result from_data(const std::string &data)
Definition nmea.cpp:122
talker_id source
nmea_result< gsa > gsa_result
static gsa_result from_data(const std::string &data)
Definition nmea.cpp:215
talker_id system_id
gsa_sat_array sats
unsigned int snr
unsigned int prn
unsigned int elev
unsigned int azim
talker_id source
nmea_result< gsv > gsv_result
gsv_sat_array sats
static gsv_result from_data(const std::string &data)
Definition nmea.cpp:260
std::chrono::year_month_day d
static rmc_result from_data(const std::string &data)
Definition nmea.cpp:323
talker_id source
nmea_result< rmc > rmc_result