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
12SAM_M10Q_t GPS_init(
13 SAM_M10Q_t *gps,
14 USART_TypeDef *interface,
15 GPIO_TypeDef *port,
16 UART_Pins pins,
17 uint32_t baud
18) {
19 UART_init(&gps->base, interface, port, pins, baud, OVER8);
20 gps->message = GPS_message;
21 gps->decode = GPS_decode;
22
23 gps->base.print(&gps->base, GPS_PUBX_SILENCE);
24 // gps->base.print(&gps->base, "$PUBX,41,1,0003,0003,19200,0*21\r\n"se.setBaud(&gps->base, 19200);
25
26 return *gps;
27}
28
29void GPS_message(SAM_M10Q_t *gps, char *message) {
30 UART_t uart = gps->base;
31 uart.print(&uart, GPS_PUBX_POLL);
32
33 // Reads GPS message
34 uint8_t flag = 0;
35 message[0] = '$';
36 message[1] = 'P';
37 message[2] = 'U';
38 message[3] = 'B';
39 message[4] = 'X';
40 message[5] = ',';
41
42 while (1) {
43 for (int x = 0; x < 6; x++) {
44 uint8_t byte = uart.receive(&uart);
45 if (message[x] != byte) {
46 flag = 0;
47 break;
48 }
49
50 if (x == 5)
51 flag = 1;
52 }
53 if (flag) {
54 uint8_t byte = 0;
55 for (int x = 6; byte != '\n'; x++) {
56 byte = uart.receive(&uart);
57 message[x] = byte;
58 }
59 return;
60 }
61 }
62}
63
64void GPS_decode(SAM_M10Q_t *gps, char *message, struct GPS_Data *data) {
65 {
66 int GPSpointer = 9;
67 int pointer = 0;
68 int tempPointer = 0;
69 char *temp[] = {data->time, data->latitude, data->N_S, data->longitude, data->E_W, data->altref, data->navstat, data->hacc, data->vacc, data->sog, data->cog, data->vvel, data->diffage, data->hdop, data->vdop, data->tdop, data->satellites};
70 while (tempPointer <= 16) {
71 if (message[GPSpointer] == ',') {
72 if ((pointer == 0) && ((tempPointer == 1) || (tempPointer == 3)))
73 data->lock = 0;
74 else if ((pointer >= 8) && ((tempPointer == 1) || (tempPointer == 3)))
75 data->lock = 1;
76
77 pointer = 0;
78 tempPointer++;
79
80 } else {
81 if (pointer <= 15) {
82 temp[tempPointer][pointer] = message[GPSpointer];
83 temp[tempPointer][pointer + 1] = '\0';
84 pointer++;
85 }
86 }
87 GPSpointer++;
88 }
89 }
90 data->hour = (data->time[0] - '0') * 10 + (data->time[1] - '0');
91 data->minute = (data->time[2] - '0') * 10 + (data->time[3] - '0');
92 data->second = (data->time[4] - '0') * 10 + (data->time[5] - '0');
93 data->latitude_degrees = (data->latitude[0] - '0') * 10 + (data->latitude[1] - '0');
94 int j = 1;
95 data->latitude_minutes = 0;
96 for (int i = 0; i < 9; i++) {
97 if (data->latitude[i + 2] == '.')
98 i++;
99 data->latitude_minutes = data->latitude_minutes + (data->latitude[i + 2] - '0') * (float)pow(10, j);
100 j--;
101 }
102 data->longitude_degrees = (data->longitude[0] - '0') * 100 + (data->longitude[1] - '0') * 10 + (data->longitude[2] - '0');
103 j = 1;
104 data->longitude_minutes = 0;
105 for (int i = 0; i < 9; i++) {
106 if (data->longitude[i + 3] == '.')
107 i++;
108 data->longitude_minutes = data->longitude_minutes + (data->longitude[i + 3] - '0') * (float)pow(10, j);
109 j--;
110 }
111}
112
General Purpose I/O.
Universal Synchronous Asynchronous Receiver Transmitter.
void(* print)(struct UART *, char *)
UART print string method.
Definition uart.h:61
uint8_t(* receive)(struct UART *)
UART receive method.
Definition uart.h:62
UART_t UART_init(UART_t *, USART_TypeDef *, GPIO_TypeDef *, UART_Pins, uint32_t, OversampleMode)
Initialiser for a UART device interface.
Definition uart.c:26
Struct definition for UART interface.
Definition uart.h:52