Loading...
Searching...
No Matches
sam_m10q.c
1/**************************************************************************************************
2 * @file gps.c *
3 * @author Matt Ricci *
4 * @addtogroup GPS *
5 * @brief Brief description of the file's purpose. *
6 * *
7 * @{ *
8 **************************************************************************************************/
9
10#include "sam_m10q.h"
11
12#include "string.h"
13#include "stdio.h"
14#include "stdlib.h"
15
16static uint8_t _checksumNMEA(const char *str);
17
18/* ============================================================================================== */
27bool SAM_M10Q_init(SAM_M10Q_t *gps, UART_t *uart, uint32_t baud) {
28 gps->uart = uart;
29 gps->setBaud = SAM_M10Q_setBaud;
30 gps->pollPUBX = SAM_M10Q_pollPUBX;
31 gps->parsePUBX = SAM_M10Q_parsePUBX;
32 gps->baud = baud;
33
34 gps->uart->print(gps->uart, GPS_PUBX_SILENCE);
35 gps->setBaud(gps, gps->baud);
36
37 return true;
38}
39
40/* ============================================================================================== */
49// clang-format off
50void SAM_M10Q_setBaud(SAM_M10Q_t *gps, uint32_t baud) {
51 char str1[35]; char str2[35]; char *_str = "$PUBX,41,1,0003,0003,%u,0*%x\r\n";
52 snprintf(str1, sizeof(str1), _str, baud, 0);
53 snprintf(str2, sizeof(str2), _str, baud, _checksumNMEA(str1));
54 gps->uart->print(gps->uart, str2);
55 gps->uart->setBaud(gps->uart, baud);
56}
57// clang-format on
58
59/* ============================================================================================== */
69 UART_t *uart = gps->uart;
70 uart->print(uart, GPS_PUBX_POLL);
71}
72
73/* ============================================================================================== */
82bool SAM_M10Q_parsePUBX(SAM_M10Q_t *gps, uint8_t *bytes, SAM_M10Q_Data *data) {
83 char *string = (char *)bytes;
84 char *const delim = ",";
85
86 char *tokens[SAM_M10Q_PUBX_POSITION_FIELD_COUNT];
87
88 char *token = strtok(string, ",");
89 uint8_t numTokens = 0;
90 // Tokenize string data into array
91 while (token != NULL && numTokens < SAM_M10Q_PUBX_POSITION_FIELD_COUNT) {
92 tokens[numTokens++] = token; // Store the token
93 token = strtok(NULL, ","); // Get the next token
94 }
95
96 // Early exit if first tokens aren't PUBX identifiers
97 if (strcmp(tokens[SAM_M10Q_PUBX_POSITION_TOKEN], "$PUBX")
98 || strcmp(tokens[SAM_M10Q_PUBX_POSITION_ID], "00"))
99 return false;
100
101 // Copy message tokens to GPS data struct
102 strncpy(&data->ns, tokens[SAM_M10Q_PUBX_POSITION_NS], sizeof(data->ns));
103 strncpy(&data->ew, tokens[SAM_M10Q_PUBX_POSITION_EW], sizeof(data->ew));
104 strncpy(data->time, tokens[SAM_M10Q_PUBX_POSITION_TIME], sizeof(data->time));
105 strncpy(data->navstat, tokens[SAM_M10Q_PUBX_POSITION_NAV_STAT], sizeof(data->navstat));
106
107 // Parse coordinates as floats
108 data->latitude = strtof(tokens[SAM_M10Q_PUBX_POSITION_LAT], NULL);
109 data->longitude = strtof(tokens[SAM_M10Q_PUBX_POSITION_LONG], NULL);
110
111 if (data->ns == 'S')
112 data->latitude = data->latitude * -1;
113 if (data->ew == 'W')
114 data->longitude = data->longitude * -1;
115
116 gps->sampleData = *data;
117
118 return true;
119}
120
121/* ============================================================================================== */
130
131static uint8_t _checksumNMEA(const char *str) {
132 const char *n = str + 1; // Plus one, skip '$'
133 uint8_t chk = 0;
134
135 while ('*' != *n && '\n' != *n && '\0' != *n) {
136 chk ^= (uint8_t)*n;
137 n++;
138 }
139
140 return chk;
141}
142
bool SAM_M10Q_parsePUBX(SAM_M10Q_t *gps, uint8_t *bytes, SAM_M10Q_Data *data)
Definition sam_m10q.c:82
void SAM_M10Q_setBaud(SAM_M10Q_t *gps, uint32_t baud)
Definition sam_m10q.c:50
void SAM_M10Q_pollPUBX(SAM_M10Q_t *gps)
Definition sam_m10q.c:68
bool SAM_M10Q_init(SAM_M10Q_t *gps, UART_t *uart, uint32_t baud)
Definition sam_m10q.c:27
void(* print)(struct UART *, char *)
UART print string method.
Definition uart.h:140
Struct definition for UART interface.
Definition uart.h:132