Hiber

Committer:
hmbed
Date:
Thu Dec 19 10:52:48 2019 +0000
Revision:
107:fc06d50dacef
Hiber First Commit

Who changed what in which revision?

UserRevisionLine numberNew 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