Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: GPS/MAXM8.cpp
- Revision:
- 107:fc06d50dacef
diff -r d323dd088ba2 -r fc06d50dacef GPS/MAXM8.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/GPS/MAXM8.cpp Thu Dec 19 10:52:48 2019 +0000
@@ -0,0 +1,172 @@
+#include "mbed.h"
+#include "MAXM8.h"
+#define NUM_OF_NMEA_SENTENCES 3
+// <editor-fold defaultstate="collapsed" desc="Golbal Variables">
+
+int BUFFER_Num=0;
+bool Status_SentenceIsReadyToParse;
+bool Status_SentenceParsed;
+
+
+// </editor-fold>
+
+// <editor-fold defaultstate="collapsed" desc="Prototypes">
+
+enum minmea_sentence_id MAXM8_NMEA_Id(char *str_id);
+
+
+// </editor-fold>
+
+char uart_first_buffer[MAX_BUFFER_SIZE];
+
+
+
+bool MAXM8_NMEA_Putc(char uart_char, char *uart_buffer){
+
+ static int sentence_initialized = FALSE;
+ static char *uart_buffer_prt=0;
+
+ if (uart_char == '$') {
+ uart_buffer_prt=uart_buffer;
+ memset(uart_buffer_prt, '\0', MAX_BUFFER_SIZE); //clears the buffer
+ *uart_buffer_prt = uart_char;
+ uart_buffer_prt++;
+ sentence_initialized = TRUE;
+
+ return FALSE;//Sentence Not Complete
+
+ } else if (uart_char != '\r' && sentence_initialized == TRUE) {
+ *uart_buffer_prt = uart_char;
+ uart_buffer_prt++;
+
+ return FALSE; //Sentence Not Complete
+
+ } else if (uart_char == '\r' && sentence_initialized == TRUE) {
+ *uart_buffer_prt = '\0';
+ sentence_initialized = FALSE;
+
+ return TRUE; //Sentence Complete
+ }
+ else
+ return FALSE;
+}
+
+bool MAXM8_NMEA_Parser(struct minmea_sentence *gps_frame, int *isPositionDataValid, char *uart_buffer_prt) {
+
+
+ //GGA - RMC - VTG
+ char *start_decimalpart;
+ char *end_decimalpart;
+ int GPS_nmea_id;
+ char *field[MAX_FIELDS_NUMBER];
+
+ bool isSentenceParsedValid=FALSE;
+
+ int p = 0;
+
+ // <editor-fold defaultstate="collapsed" desc="Command Splitter">
+ field[0] =(uart_buffer_prt);
+
+ while (*uart_buffer_prt != '\0') {
+ if (*uart_buffer_prt == ',' || *uart_buffer_prt == '*') {
+ *uart_buffer_prt = '\0';
+ field[++p] = uart_buffer_prt + 1;
+ }
+ uart_buffer_prt++;
+ }
+
+
+ // </editor-fold>
+
+ // <editor-fold defaultstate="collapsed" desc="Parser">
+
+
+ GPS_nmea_id = MAXM8_NMEA_Id(field[0]);
+
+
+
+ switch (GPS_nmea_id) {
+
+ case NMEA_SENTENCE_RMC:
+ //$GPRMC,130652.000,A,4038.0868,N,00838.9093,W,0.40,67.63,290316,,,A*49
+ //Valid
+ //FGPMMOPA6H_DisableInterrupts();
+
+
+
+ if (*field[2]== 'A'){ //If the coordenates are valid
+
+
+ //Latitude
+
+ gps_frame->latitude.integer = strtol(field[3], &start_decimalpart, 10);
+
+
+ //printf("%ld ",gps_frame->latitude.integer);
+
+
+ gps_frame->latitude.decimal = strtol(start_decimalpart+1, &end_decimalpart, 10);
+ if (strcmp(field[4], "N") == 0)
+ gps_frame->latitude.cardeal = 0; //0=North
+
+ if (strcmp(field[4], "S") == 0)
+ gps_frame->latitude.cardeal = 1; // 1=South
+
+
+
+ //Longitude
+ gps_frame->longitude.integer = strtol(field[5], &start_decimalpart, 10);
+ gps_frame->longitude.decimal = strtol(start_decimalpart+1, &end_decimalpart, 10);
+
+ //Longitude
+ if (strcmp(field[6], "W") == 0)
+ gps_frame->longitude.cardeal = 0; //0=West
+
+ if (strcmp(field[6], "E") == 0)
+ gps_frame->longitude.cardeal = 1; // 1=East
+ }
+ else
+ *isPositionDataValid = FALSE;
+
+ break;
+
+ case NMEA_SENTENCE_GGA:
+ isSentenceParsedValid=TRUE;
+ gps_frame->altitude = strtol(field[11], &start_decimalpart, 10);
+
+ gps_frame->num_of_satellites_tracked= strtol(field[7],&start_decimalpart, 10);
+
+ break;
+
+ case NMEA_SENTENCE_VTG:
+ isSentenceParsedValid=TRUE;
+
+ gps_frame->speed = strtol(field[7], &start_decimalpart, 10);
+ break;
+
+ default:
+ isSentenceParsedValid=FALSE;
+ break;
+ }
+
+
+
+ return isSentenceParsedValid;
+}
+
+enum minmea_sentence_id MAXM8_NMEA_Id(char *str_id) {
+
+ if (strcmp(str_id, "$GPGGA") == 0)
+ return NMEA_SENTENCE_GGA;
+ else if (strcmp(str_id, "$GPRMC") == 0)
+ return NMEA_SENTENCE_RMC;
+
+ else if (strcmp(str_id,"$GPVTG")==0)
+ return NMEA_SENTENCE_VTG;
+
+ else
+ return MINMEA_UNKNOWN;
+
+
+}
+
\ No newline at end of file