10
10
11
11
#include <string.h>
12
12
13
+ #include "gnss_parse.h"
13
14
#include "gnss_nmea0183.h"
14
15
#include "gnss_nmea0183_match.h"
15
16
16
- static bool gnss_nmea0183_match_timed_out ( struct gnss_nmea0183_match_data * data )
17
+ static int gnss_nmea0183_match_parse_utc ( char * * argv , uint16_t argc , uint32_t * utc )
17
18
{
18
- int64_t delta ;
19
+ int64_t i64 ;
19
20
20
- delta = k_uptime_delta (& data -> timestamp );
21
- data -> timestamp = k_uptime_get ();
22
- return ((uint16_t )delta ) > data -> timeout_ms ;
21
+ if ((gnss_parse_dec_to_milli (argv [1 ], & i64 ) < 0 ) ||
22
+ (i64 < 0 ) ||
23
+ (i64 > UINT32_MAX )) {
24
+ return - EINVAL ;
25
+ }
26
+
27
+ * utc = (uint32_t )i64 ;
28
+ return 0 ;
23
29
}
24
30
25
31
#if CONFIG_GNSS_SATELLITES
@@ -30,50 +36,47 @@ static void gnss_nmea0183_match_reset_gsv(struct gnss_nmea0183_match_data *data)
30
36
}
31
37
#endif
32
38
33
- static void gnss_nmea0183_match_reset (struct gnss_nmea0183_match_data * data )
39
+ static void gnss_nmea0183_match_publish (struct gnss_nmea0183_match_data * data )
34
40
{
35
- data -> gga_received = false;
36
- data -> rmc_received = false;
41
+ if ((data -> gga_utc == 0 ) || (data -> rmc_utc == 0 )) {
42
+ return ;
43
+ }
44
+
45
+ if (data -> gga_utc == data -> rmc_utc ) {
46
+ gnss_publish_data (data -> gnss , & data -> data );
47
+ }
37
48
}
38
49
39
50
void gnss_nmea0183_match_gga_callback (struct modem_chat * chat , char * * argv , uint16_t argc ,
40
51
void * user_data )
41
52
{
42
53
struct gnss_nmea0183_match_data * data = user_data ;
43
54
44
- if (gnss_nmea0183_match_timed_out (data )) {
45
- gnss_nmea0183_match_reset (data );
46
- }
47
-
48
55
if (gnss_nmea0183_parse_gga ((const char * * )argv , argc , & data -> data ) < 0 ) {
49
56
return ;
50
57
}
51
58
52
- data -> gga_received = true;
53
-
54
- if (data -> gga_received && data -> rmc_received ) {
55
- gnss_publish_data (data -> gnss , & data -> data );
59
+ if (gnss_nmea0183_match_parse_utc (argv , argc , & data -> gga_utc ) < 0 ) {
60
+ return ;
56
61
}
62
+
63
+ gnss_nmea0183_match_publish (data );
57
64
}
58
65
59
66
void gnss_nmea0183_match_rmc_callback (struct modem_chat * chat , char * * argv , uint16_t argc ,
60
67
void * user_data )
61
68
{
62
69
struct gnss_nmea0183_match_data * data = user_data ;
63
70
64
- if (gnss_nmea0183_match_timed_out (data )) {
65
- gnss_nmea0183_match_reset (data );
66
- }
67
-
68
71
if (gnss_nmea0183_parse_rmc ((const char * * )argv , argc , & data -> data ) < 0 ) {
69
72
return ;
70
73
}
71
74
72
- data -> rmc_received = true;
73
-
74
- if (data -> gga_received && data -> rmc_received ) {
75
- gnss_publish_data (data -> gnss , & data -> data );
75
+ if (gnss_nmea0183_match_parse_utc (argv , argc , & data -> rmc_utc ) < 0 ) {
76
+ return ;
76
77
}
78
+
79
+ gnss_nmea0183_match_publish (data );
77
80
}
78
81
79
82
#if CONFIG_GNSS_SATELLITES
@@ -84,10 +87,6 @@ void gnss_nmea0183_match_gsv_callback(struct modem_chat *chat, char **argv, uint
84
87
struct gnss_nmea0183_gsv_header header ;
85
88
int ret ;
86
89
87
- if (gnss_nmea0183_match_timed_out (data )) {
88
- gnss_nmea0183_match_reset (data );
89
- }
90
-
91
90
if (gnss_nmea0183_parse_gsv_header ((const char * * )argv , argc , & header ) < 0 ) {
92
91
return ;
93
92
}
@@ -124,14 +123,13 @@ int gnss_nmea0183_match_init(struct gnss_nmea0183_match_data *data,
124
123
const struct gnss_nmea0183_match_config * config )
125
124
{
126
125
__ASSERT (data != NULL , "data argument must be provided" );
127
- __ASSERT (config != NULL , "data argument must be provided" );
126
+ __ASSERT (config != NULL , "config argument must be provided" );
128
127
129
128
memset (data , 0 , sizeof (struct gnss_nmea0183_match_data ));
130
129
data -> gnss = config -> gnss ;
131
130
#if CONFIG_GNSS_SATELLITES
132
131
data -> satellites = config -> satellites ;
133
132
data -> satellites_size = config -> satellites_size ;
134
133
#endif
135
- data -> timeout_ms = config -> timeout_ms ;
136
134
return 0 ;
137
135
}
0 commit comments