Pico GPS Teseo I2C
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
8
import
teseo
;
9
import
nmea
;
10
import
port_pico_reset
;
11
import
port_pico_communicate
;
12
13
14
teseo::teseo
gps
;
15
std::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);
21
std::array<std::string, NMEA_MAX_REPLIES>
replies
;
22
uint
count
;
// intentionally uninitialised
23
bool
valid
;
// intentionally uninitialised
24
25
void
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
31
void
print_d
(
const
std::chrono::year_month_day&
t
) {
32
printf
(
"%4i-%02i-%02i"
,
33
t
.year(),
t
.month(),
34
t
.day());
35
}
36
37
void
print_talker
(
const
nmea::talker_id
& talker_id) {
38
switch
(talker_id) {
39
case
nmea::talker_id::gps
:
40
printf
(
"gps"
);
41
break
;
42
case
nmea::talker_id::glonass
:
43
printf
(
"glonass"
);
44
break
;
45
case
nmea::talker_id::galileo
:
46
printf
(
"galileo"
);
47
break
;
48
default
:
49
printf
(
"other"
);
50
break
;
51
}
52
}
53
54
void
test_gll
() {
55
valid
=
gps
.ask_gll(
reply
);
56
if
(!
valid
) {
return
; }
57
assert
(
reply
.size());
58
nmea::gll
o;
59
valid
=
nmea::gll::from_data
(
reply
, o);
60
printf
(
"GLL source: "
);
61
print_talker
(o.
source
);
62
printf
(
". lat: %f lon: %f, time: "
,
63
o.
lat
, o.
lon
);
64
print_t
(o.
t
);
65
printf
(
".\n"
);
66
return
;
67
}
68
69
void
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
nmea::gsv
o;
74
valid
=
nmea::gsv::from_data
(
r
, o);
75
printf
(
"GSV source: "
);
76
print_talker
(o.
source
);
77
printf
(
".\r\n"
);
78
for
(
const
auto
s : o.
sats
) {
79
printf
(
"sat prn: %i, elev: %i, azim: %i, snr: %i.\r\n"
,
80
s.prn, s.elev, s.azim, s.snr);
81
}
82
}
83
return
;
84
}
85
86
void
test_gga
() {
87
valid
=
gps
.ask_gga(
reply
);
88
if
(!
valid
) {
return
; }
89
nmea::gga
o;
90
valid
=
nmea::gga::from_data
(
reply
, o);
91
printf
(
"GGA source: "
);
92
print_talker
(o.
source
);
93
printf
(
". lat: %f lon: %f, alt: %.3f, geosep: %.3f, sats: %i. "
,
94
o.
lat
, o.
lon
, o.
alt
, o.
geosep
, o.
sats
);
95
print_t
(o.
t
);
96
printf
(
".\n"
);
97
return
;
98
}
99
100
void
test_rmc
() {
101
valid
=
gps
.ask_rmc(
reply
);
102
if
(!
valid
) {
return
; }
103
nmea::rmc
o;
104
valid
=
nmea::rmc::from_data
(
reply
, o);
105
printf
(
"RMC source: "
);
106
print_talker
(o.
source
);
107
printf
(
". lat: %f lon: %f. "
,
108
o.
lat
, o.
lon
);
109
print_t
(o.
t
);
110
printf
(
". "
);
111
print_d
(o.
d
);
112
printf
(
".\n"
);
113
return
;
114
}
115
116
void
setCallbacks
() {
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
122
int
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
}
assert
#define assert(expr)
Definition
debug.h:68
nmea::gga
Definition
nmea_iface.cpp:69
nmea::gga::geosep
float geosep
Definition
nmea_iface.cpp:79
nmea::gga::from_data
static bool from_data(const std::string &data, gga &gga)
Definition
nmea.cpp:160
nmea::gga::source
talker_id source
Definition
nmea_iface.cpp:72
nmea::gga::alt
float alt
Definition
nmea_iface.cpp:78
nmea::gga::lon
float lon
Definition
nmea_iface.cpp:74
nmea::gga::lat
float lat
Definition
nmea_iface.cpp:73
nmea::gga::t
time_t t
Definition
nmea_iface.cpp:75
nmea::gga::sats
unsigned int sats
Definition
nmea_iface.cpp:76
nmea::gll
Definition
nmea_iface.cpp:59
nmea::gll::source
talker_id source
Definition
nmea_iface.cpp:62
nmea::gll::lat
float lat
Definition
nmea_iface.cpp:63
nmea::gll::lon
float lon
Definition
nmea_iface.cpp:64
nmea::gll::t
time_t t
Definition
nmea_iface.cpp:65
nmea::gll::from_data
static bool from_data(const std::string &data, gll &gll)
Definition
nmea.cpp:121
nmea::gsv
Definition
nmea_iface.cpp:102
nmea::gsv::from_data
static bool from_data(const std::string &data, gsv &gsv)
Definition
nmea.cpp:253
nmea::gsv::source
talker_id source
Definition
nmea_iface.cpp:105
nmea::gsv::sats
gsv_sat_array sats
Definition
nmea_iface.cpp:106
nmea::rmc
Definition
nmea_iface.cpp:109
nmea::rmc::t
time_t t
Definition
nmea_iface.cpp:116
nmea::rmc::d
std::chrono::year_month_day d
Definition
nmea_iface.cpp:117
nmea::rmc::lat
float lat
Definition
nmea_iface.cpp:113
nmea::rmc::lon
float lon
Definition
nmea_iface.cpp:114
nmea::rmc::source
talker_id source
Definition
nmea_iface.cpp:112
nmea::rmc::from_data
static bool from_data(const std::string &data, rmc &rmc)
Definition
nmea.cpp:314
teseo::teseo
Driver class for ST Teseo IC.
Definition
teseo_iface.cpp:28
t
int t
Definition
ctypes.h:77
main
int main()
getting-started Application entry point.
Definition
teseo_with_nmea_parse.cpp:122
sleep_ms
void sleep_ms(uint32_t ms)
Wait for the given number of milliseconds before returning.
Definition
time.c:439
initialize
void initialize()
Definition
teseo_communicate.cpp:41
read
void read(::std::string &s)
Definition
teseo_communicate.cpp:59
write
void write(const ::std::string &s)
Definition
teseo_communicate.cpp:54
nmea
port_pico_communicate
port_pico_reset
teseo
nmea::time_t
std::chrono::hh_mm_ss< std::chrono::duration< long long, std::ratio< 1, 1000 > > > time_t
Definition
nmea_iface.cpp:19
nmea::talker_id
talker_id
Definition
nmea_iface.cpp:21
nmea::talker_id::gps
@ gps
Definition
nmea_iface.cpp:23
nmea::talker_id::galileo
@ galileo
Definition
nmea_iface.cpp:25
nmea::talker_id::glonass
@ glonass
Definition
nmea_iface.cpp:24
port_pico::reset
void reset()
Definition
reset.cpp:17
r
return r
Definition
neon.h:77
count
volatile uint32_t count[3]
Definition
pico_divider_nesting_test.c:16
uint
unsigned int uint
Definition
types.h:18
stdlib.h
printf
#define printf(format,...)
Definition
sx1280-hal.c:23
valid
bool valid
Definition
teseo_nmea_with_data_processing.cpp:24
gps
teseo::teseo gps
Definition
teseo_nmea_with_data_processing.cpp:15
replies
std::array< std::string, NMEA_MAX_REPLIES > replies
Definition
teseo_nmea_with_data_processing.cpp:21
reply
std::string reply
Definition
teseo_nmea_with_data_processing.cpp:23
print_d
void print_d(const std::chrono::year_month_day &t)
Definition
teseo_with_nmea_parse.cpp:31
test_gsv
void test_gsv()
Definition
teseo_with_nmea_parse.cpp:69
test_gga
void test_gga()
Definition
teseo_with_nmea_parse.cpp:86
setCallbacks
void setCallbacks()
Definition
teseo_with_nmea_parse.cpp:116
print_t
void print_t(const nmea::time_t &t)
Definition
teseo_with_nmea_parse.cpp:25
print_talker
void print_talker(const nmea::talker_id &talker_id)
Definition
teseo_with_nmea_parse.cpp:37
test_gll
void test_gll()
Definition
teseo_with_nmea_parse.cpp:54
test_rmc
void test_rmc()
Definition
teseo_with_nmea_parse.cpp:100
Generated by
1.13.2