Pico GPS Teseo
Loading...
Searching...
No Matches
teseo_with_nmea_parse.cpp
Go to the documentation of this file.
1#include <string>
2#include <chrono>
3
4// for debug messages
5#include <stdio.h>
6#include "pico/stdlib.h"
7
8import teseo;
9import nmea;
10import port_pico_reset;
12
13
15std::string reply;
16// for the container that will hold multy-line replies,
17// you can use an array, vector, C array
18// based on what your architecture prefers or requires.
19// vector size is a suggestion. STL will allocate at least NMEA_MAX_REPLIES
20//std::vector<std::string> replies(NMEA_MAX_REPLIES);
21std::array<std::string, NMEA_MAX_REPLIES> replies;
22uint count; // intentionally uninitialised
23bool valid; // intentionally uninitialised
24
25void print_t(const nmea::time_t& t) {
26 printf("%02i:%02i:%02i.%03i",
27 (int)(t.hours().count()), (int)(t.minutes().count()),
28 (int)(t.seconds().count()), (int)(t.subseconds().count()));
29}
30
31void print_d(const std::chrono::year_month_day& t) {
32 printf("%4i-%02i-%02i",
33 t.year(), t.month(),
34 t.day());
35}
36
37void print_talker(const nmea::talker_id& talker_id) {
38 switch (talker_id) {
40 printf("gps");
41 break;
43 printf("glonass");
44 break;
46 printf("galileo");
47 break;
48 default:
49 printf("other");
50 break;
51 }
52}
53
54void test_gll() {
55 valid = gps.ask_gll(reply);
56 if (!valid) { return; }
57 assert(reply.size());
58 if (auto result = nmea::gll::from_data(reply)) {
59 printf("GLL source: ");
60 print_talker(result.result.source);
61 printf(". lat: %f lon: %f, time: ",
62 result.result.lat, result.result.lon);
63 print_t(result.result.t);
64 printf(".\n");
65 }
66 return;
67}
68
69void test_gsv() {
70 valid = gps.ask_gsv(replies, count);
71 if (!valid) { return; }
72 for(auto r : std::ranges::subrange(replies.begin(), replies.begin() + count)) {
73 if (auto result = nmea::gsv::from_data(r)){
74 printf("GSV source: ");
75 print_talker(result.result.source);
76 printf(".\r\n");
77 for(const auto s : result.result.sats) {
78 printf("sat prn: %i, elev: %i, azim: %i, snr: %i.\r\n",
79 s.prn, s.elev, s.azim, s.snr);
80 }
81 }
82 }
83 return;
84}
85
86void test_gga() {
87 valid = gps.ask_gga(reply);
88 if (!valid) { return; }
89 if (auto result = nmea::gga::from_data(reply)) {
90 printf("GGA source: ");
91 print_talker(result.result.source);
92 printf(". lat: %f lon: %f, alt: %.3f, geosep: %.3f, sats: %i. ",
93 result.result.lat, result.result.lon, result.result.alt, result.result.geosep, result.result.sats);
94 print_t(result.result.t);
95 printf(".\n");
96 }
97 return;
98}
99
100void test_rmc() {
101 valid = gps.ask_rmc(reply);
102 if (!valid) { return; }
103 if (auto result = nmea::rmc::from_data(reply)) {
104 printf("RMC source: ");
105 print_talker(result.result.source);
106 printf(". lat: %f lon: %f. ",
107 result.result.lat, result.result.lon);
108 print_t(result.result.t);
109 printf(". ");
110 print_d(result.result.d);
111 printf(".\n");
112 }
113 return;
114}
115
117 gps.writer().set([](const std::string& s) -> void { write(s); });
118 gps.reader().set([](std::string& s) -> void { read(s); });
119 gps.resetter().set([]() -> void { port_pico::reset(); });
120}
121
122int main() {
123 initialize();
124 setCallbacks();
125
126 /*
127 when the teseo is preset for i2c according to AN5203,
128 init is not required, and you can cut 4s 10ms from the startup sequence
129 https://www.st.com/resource/en/application_note/an5203-teseoliv3f--i2c-positioning-sensor--stmicroelectronics.pdf
130 */
131 gps.initialize();
132
133 while (true) {
134 printf("+-- start --+\r\n");
135 test_gll();
136 test_gsv();
137 test_gga();
138 test_rmc();
139 printf("+-- end --+\r\n\r\n");
140 sleep_ms(1000);
141 }
142}
Driver class for ST Teseo IC.
void initialize()
void read(::std::string &s)
void write(const ::std::string &s)
std::chrono::hh_mm_ss< std::chrono::duration< long long, std::ratio< 1, 1000 > > > time_t
void reset()
Definition reset.cpp:17
static gga_result from_data(const std::string &data)
Definition nmea.cpp:163
static gll_result from_data(const std::string &data)
Definition nmea.cpp:122
static gsv_result from_data(const std::string &data)
Definition nmea.cpp:260
static rmc_result from_data(const std::string &data)
Definition nmea.cpp:323
std::array< std::string, NMEA_MAX_REPLIES > replies
void print_d(const std::chrono::year_month_day &t)
void test_gsv()
void test_gga()
void setCallbacks()
void print_t(const nmea::time_t &t)
void print_talker(const nmea::talker_id &talker_id)
void test_gll()
void test_rmc()