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.
GPS/MAXM8.cpp
- Committer:
- hmbed
- Date:
- 2019-12-19
- Revision:
- 107:fc06d50dacef
File content as of revision 107:fc06d50dacef:
#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;
}