Jose Jn
/
mbed-os-example-blinky2
Hiber
Diff: GPS/MAXM8.cpp
- Revision:
- 107:fc06d50dacef
--- /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