Jose Jn
/
mbed-os-example-blinky2
Hiber
GPS/MAXM8.cpp@107:fc06d50dacef, 2019-12-19 (annotated)
- Committer:
- hmbed
- Date:
- Thu Dec 19 10:52:48 2019 +0000
- Revision:
- 107:fc06d50dacef
Hiber First Commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hmbed | 107:fc06d50dacef | 1 | #include "mbed.h" |
hmbed | 107:fc06d50dacef | 2 | #include "MAXM8.h" |
hmbed | 107:fc06d50dacef | 3 | #define NUM_OF_NMEA_SENTENCES 3 |
hmbed | 107:fc06d50dacef | 4 | // <editor-fold defaultstate="collapsed" desc="Golbal Variables"> |
hmbed | 107:fc06d50dacef | 5 | |
hmbed | 107:fc06d50dacef | 6 | int BUFFER_Num=0; |
hmbed | 107:fc06d50dacef | 7 | bool Status_SentenceIsReadyToParse; |
hmbed | 107:fc06d50dacef | 8 | bool Status_SentenceParsed; |
hmbed | 107:fc06d50dacef | 9 | |
hmbed | 107:fc06d50dacef | 10 | |
hmbed | 107:fc06d50dacef | 11 | // </editor-fold> |
hmbed | 107:fc06d50dacef | 12 | |
hmbed | 107:fc06d50dacef | 13 | // <editor-fold defaultstate="collapsed" desc="Prototypes"> |
hmbed | 107:fc06d50dacef | 14 | |
hmbed | 107:fc06d50dacef | 15 | enum minmea_sentence_id MAXM8_NMEA_Id(char *str_id); |
hmbed | 107:fc06d50dacef | 16 | |
hmbed | 107:fc06d50dacef | 17 | |
hmbed | 107:fc06d50dacef | 18 | // </editor-fold> |
hmbed | 107:fc06d50dacef | 19 | |
hmbed | 107:fc06d50dacef | 20 | char uart_first_buffer[MAX_BUFFER_SIZE]; |
hmbed | 107:fc06d50dacef | 21 | |
hmbed | 107:fc06d50dacef | 22 | |
hmbed | 107:fc06d50dacef | 23 | |
hmbed | 107:fc06d50dacef | 24 | bool MAXM8_NMEA_Putc(char uart_char, char *uart_buffer){ |
hmbed | 107:fc06d50dacef | 25 | |
hmbed | 107:fc06d50dacef | 26 | static int sentence_initialized = FALSE; |
hmbed | 107:fc06d50dacef | 27 | static char *uart_buffer_prt=0; |
hmbed | 107:fc06d50dacef | 28 | |
hmbed | 107:fc06d50dacef | 29 | if (uart_char == '$') { |
hmbed | 107:fc06d50dacef | 30 | uart_buffer_prt=uart_buffer; |
hmbed | 107:fc06d50dacef | 31 | memset(uart_buffer_prt, '\0', MAX_BUFFER_SIZE); //clears the buffer |
hmbed | 107:fc06d50dacef | 32 | *uart_buffer_prt = uart_char; |
hmbed | 107:fc06d50dacef | 33 | uart_buffer_prt++; |
hmbed | 107:fc06d50dacef | 34 | sentence_initialized = TRUE; |
hmbed | 107:fc06d50dacef | 35 | |
hmbed | 107:fc06d50dacef | 36 | return FALSE;//Sentence Not Complete |
hmbed | 107:fc06d50dacef | 37 | |
hmbed | 107:fc06d50dacef | 38 | } else if (uart_char != '\r' && sentence_initialized == TRUE) { |
hmbed | 107:fc06d50dacef | 39 | *uart_buffer_prt = uart_char; |
hmbed | 107:fc06d50dacef | 40 | uart_buffer_prt++; |
hmbed | 107:fc06d50dacef | 41 | |
hmbed | 107:fc06d50dacef | 42 | return FALSE; //Sentence Not Complete |
hmbed | 107:fc06d50dacef | 43 | |
hmbed | 107:fc06d50dacef | 44 | } else if (uart_char == '\r' && sentence_initialized == TRUE) { |
hmbed | 107:fc06d50dacef | 45 | *uart_buffer_prt = '\0'; |
hmbed | 107:fc06d50dacef | 46 | sentence_initialized = FALSE; |
hmbed | 107:fc06d50dacef | 47 | |
hmbed | 107:fc06d50dacef | 48 | return TRUE; //Sentence Complete |
hmbed | 107:fc06d50dacef | 49 | } |
hmbed | 107:fc06d50dacef | 50 | else |
hmbed | 107:fc06d50dacef | 51 | return FALSE; |
hmbed | 107:fc06d50dacef | 52 | } |
hmbed | 107:fc06d50dacef | 53 | |
hmbed | 107:fc06d50dacef | 54 | bool MAXM8_NMEA_Parser(struct minmea_sentence *gps_frame, int *isPositionDataValid, char *uart_buffer_prt) { |
hmbed | 107:fc06d50dacef | 55 | |
hmbed | 107:fc06d50dacef | 56 | |
hmbed | 107:fc06d50dacef | 57 | //GGA - RMC - VTG |
hmbed | 107:fc06d50dacef | 58 | char *start_decimalpart; |
hmbed | 107:fc06d50dacef | 59 | char *end_decimalpart; |
hmbed | 107:fc06d50dacef | 60 | int GPS_nmea_id; |
hmbed | 107:fc06d50dacef | 61 | char *field[MAX_FIELDS_NUMBER]; |
hmbed | 107:fc06d50dacef | 62 | |
hmbed | 107:fc06d50dacef | 63 | bool isSentenceParsedValid=FALSE; |
hmbed | 107:fc06d50dacef | 64 | |
hmbed | 107:fc06d50dacef | 65 | int p = 0; |
hmbed | 107:fc06d50dacef | 66 | |
hmbed | 107:fc06d50dacef | 67 | // <editor-fold defaultstate="collapsed" desc="Command Splitter"> |
hmbed | 107:fc06d50dacef | 68 | field[0] =(uart_buffer_prt); |
hmbed | 107:fc06d50dacef | 69 | |
hmbed | 107:fc06d50dacef | 70 | while (*uart_buffer_prt != '\0') { |
hmbed | 107:fc06d50dacef | 71 | if (*uart_buffer_prt == ',' || *uart_buffer_prt == '*') { |
hmbed | 107:fc06d50dacef | 72 | *uart_buffer_prt = '\0'; |
hmbed | 107:fc06d50dacef | 73 | field[++p] = uart_buffer_prt + 1; |
hmbed | 107:fc06d50dacef | 74 | } |
hmbed | 107:fc06d50dacef | 75 | uart_buffer_prt++; |
hmbed | 107:fc06d50dacef | 76 | } |
hmbed | 107:fc06d50dacef | 77 | |
hmbed | 107:fc06d50dacef | 78 | |
hmbed | 107:fc06d50dacef | 79 | // </editor-fold> |
hmbed | 107:fc06d50dacef | 80 | |
hmbed | 107:fc06d50dacef | 81 | // <editor-fold defaultstate="collapsed" desc="Parser"> |
hmbed | 107:fc06d50dacef | 82 | |
hmbed | 107:fc06d50dacef | 83 | |
hmbed | 107:fc06d50dacef | 84 | GPS_nmea_id = MAXM8_NMEA_Id(field[0]); |
hmbed | 107:fc06d50dacef | 85 | |
hmbed | 107:fc06d50dacef | 86 | |
hmbed | 107:fc06d50dacef | 87 | |
hmbed | 107:fc06d50dacef | 88 | switch (GPS_nmea_id) { |
hmbed | 107:fc06d50dacef | 89 | |
hmbed | 107:fc06d50dacef | 90 | case NMEA_SENTENCE_RMC: |
hmbed | 107:fc06d50dacef | 91 | //$GPRMC,130652.000,A,4038.0868,N,00838.9093,W,0.40,67.63,290316,,,A*49 |
hmbed | 107:fc06d50dacef | 92 | //Valid |
hmbed | 107:fc06d50dacef | 93 | //FGPMMOPA6H_DisableInterrupts(); |
hmbed | 107:fc06d50dacef | 94 | |
hmbed | 107:fc06d50dacef | 95 | |
hmbed | 107:fc06d50dacef | 96 | |
hmbed | 107:fc06d50dacef | 97 | if (*field[2]== 'A'){ //If the coordenates are valid |
hmbed | 107:fc06d50dacef | 98 | |
hmbed | 107:fc06d50dacef | 99 | |
hmbed | 107:fc06d50dacef | 100 | //Latitude |
hmbed | 107:fc06d50dacef | 101 | |
hmbed | 107:fc06d50dacef | 102 | gps_frame->latitude.integer = strtol(field[3], &start_decimalpart, 10); |
hmbed | 107:fc06d50dacef | 103 | |
hmbed | 107:fc06d50dacef | 104 | |
hmbed | 107:fc06d50dacef | 105 | //printf("%ld ",gps_frame->latitude.integer); |
hmbed | 107:fc06d50dacef | 106 | |
hmbed | 107:fc06d50dacef | 107 | |
hmbed | 107:fc06d50dacef | 108 | gps_frame->latitude.decimal = strtol(start_decimalpart+1, &end_decimalpart, 10); |
hmbed | 107:fc06d50dacef | 109 | if (strcmp(field[4], "N") == 0) |
hmbed | 107:fc06d50dacef | 110 | gps_frame->latitude.cardeal = 0; //0=North |
hmbed | 107:fc06d50dacef | 111 | |
hmbed | 107:fc06d50dacef | 112 | if (strcmp(field[4], "S") == 0) |
hmbed | 107:fc06d50dacef | 113 | gps_frame->latitude.cardeal = 1; // 1=South |
hmbed | 107:fc06d50dacef | 114 | |
hmbed | 107:fc06d50dacef | 115 | |
hmbed | 107:fc06d50dacef | 116 | |
hmbed | 107:fc06d50dacef | 117 | //Longitude |
hmbed | 107:fc06d50dacef | 118 | gps_frame->longitude.integer = strtol(field[5], &start_decimalpart, 10); |
hmbed | 107:fc06d50dacef | 119 | gps_frame->longitude.decimal = strtol(start_decimalpart+1, &end_decimalpart, 10); |
hmbed | 107:fc06d50dacef | 120 | |
hmbed | 107:fc06d50dacef | 121 | //Longitude |
hmbed | 107:fc06d50dacef | 122 | if (strcmp(field[6], "W") == 0) |
hmbed | 107:fc06d50dacef | 123 | gps_frame->longitude.cardeal = 0; //0=West |
hmbed | 107:fc06d50dacef | 124 | |
hmbed | 107:fc06d50dacef | 125 | if (strcmp(field[6], "E") == 0) |
hmbed | 107:fc06d50dacef | 126 | gps_frame->longitude.cardeal = 1; // 1=East |
hmbed | 107:fc06d50dacef | 127 | } |
hmbed | 107:fc06d50dacef | 128 | else |
hmbed | 107:fc06d50dacef | 129 | *isPositionDataValid = FALSE; |
hmbed | 107:fc06d50dacef | 130 | |
hmbed | 107:fc06d50dacef | 131 | break; |
hmbed | 107:fc06d50dacef | 132 | |
hmbed | 107:fc06d50dacef | 133 | case NMEA_SENTENCE_GGA: |
hmbed | 107:fc06d50dacef | 134 | isSentenceParsedValid=TRUE; |
hmbed | 107:fc06d50dacef | 135 | gps_frame->altitude = strtol(field[11], &start_decimalpart, 10); |
hmbed | 107:fc06d50dacef | 136 | |
hmbed | 107:fc06d50dacef | 137 | gps_frame->num_of_satellites_tracked= strtol(field[7],&start_decimalpart, 10); |
hmbed | 107:fc06d50dacef | 138 | |
hmbed | 107:fc06d50dacef | 139 | break; |
hmbed | 107:fc06d50dacef | 140 | |
hmbed | 107:fc06d50dacef | 141 | case NMEA_SENTENCE_VTG: |
hmbed | 107:fc06d50dacef | 142 | isSentenceParsedValid=TRUE; |
hmbed | 107:fc06d50dacef | 143 | |
hmbed | 107:fc06d50dacef | 144 | gps_frame->speed = strtol(field[7], &start_decimalpart, 10); |
hmbed | 107:fc06d50dacef | 145 | break; |
hmbed | 107:fc06d50dacef | 146 | |
hmbed | 107:fc06d50dacef | 147 | default: |
hmbed | 107:fc06d50dacef | 148 | isSentenceParsedValid=FALSE; |
hmbed | 107:fc06d50dacef | 149 | break; |
hmbed | 107:fc06d50dacef | 150 | } |
hmbed | 107:fc06d50dacef | 151 | |
hmbed | 107:fc06d50dacef | 152 | |
hmbed | 107:fc06d50dacef | 153 | |
hmbed | 107:fc06d50dacef | 154 | return isSentenceParsedValid; |
hmbed | 107:fc06d50dacef | 155 | } |
hmbed | 107:fc06d50dacef | 156 | |
hmbed | 107:fc06d50dacef | 157 | enum minmea_sentence_id MAXM8_NMEA_Id(char *str_id) { |
hmbed | 107:fc06d50dacef | 158 | |
hmbed | 107:fc06d50dacef | 159 | if (strcmp(str_id, "$GPGGA") == 0) |
hmbed | 107:fc06d50dacef | 160 | return NMEA_SENTENCE_GGA; |
hmbed | 107:fc06d50dacef | 161 | else if (strcmp(str_id, "$GPRMC") == 0) |
hmbed | 107:fc06d50dacef | 162 | return NMEA_SENTENCE_RMC; |
hmbed | 107:fc06d50dacef | 163 | |
hmbed | 107:fc06d50dacef | 164 | else if (strcmp(str_id,"$GPVTG")==0) |
hmbed | 107:fc06d50dacef | 165 | return NMEA_SENTENCE_VTG; |
hmbed | 107:fc06d50dacef | 166 | |
hmbed | 107:fc06d50dacef | 167 | else |
hmbed | 107:fc06d50dacef | 168 | return MINMEA_UNKNOWN; |
hmbed | 107:fc06d50dacef | 169 | |
hmbed | 107:fc06d50dacef | 170 | |
hmbed | 107:fc06d50dacef | 171 | } |
hmbed | 107:fc06d50dacef | 172 |