Hiber

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MAXM8.cpp Source File

MAXM8.cpp

00001 #include "mbed.h"
00002 #include "MAXM8.h"
00003 #define NUM_OF_NMEA_SENTENCES 3
00004 // <editor-fold defaultstate="collapsed" desc="Golbal Variables"> 
00005  
00006 int BUFFER_Num=0;
00007 bool Status_SentenceIsReadyToParse;
00008 bool Status_SentenceParsed;
00009  
00010 
00011 // </editor-fold>
00012  
00013 // <editor-fold defaultstate="collapsed" desc="Prototypes"> 
00014  
00015 enum minmea_sentence_id MAXM8_NMEA_Id(char *str_id);
00016 
00017  
00018 // </editor-fold>
00019   
00020 char uart_first_buffer[MAX_BUFFER_SIZE];
00021 
00022  
00023 
00024 bool MAXM8_NMEA_Putc(char uart_char, char *uart_buffer){
00025 
00026     static int sentence_initialized = FALSE;
00027     static char *uart_buffer_prt=0;
00028 
00029     if (uart_char == '$') {
00030         uart_buffer_prt=uart_buffer;
00031         memset(uart_buffer_prt, '\0', MAX_BUFFER_SIZE); //clears the buffer
00032         *uart_buffer_prt = uart_char;
00033         uart_buffer_prt++;
00034         sentence_initialized = TRUE;
00035         
00036         return FALSE;//Sentence Not Complete
00037 
00038     } else if (uart_char != '\r' && sentence_initialized == TRUE) {
00039         *uart_buffer_prt = uart_char;
00040         uart_buffer_prt++;
00041         
00042         return FALSE; //Sentence Not Complete
00043 
00044     } else if (uart_char == '\r' && sentence_initialized == TRUE) {
00045         *uart_buffer_prt = '\0';
00046         sentence_initialized = FALSE;
00047         
00048         return TRUE; //Sentence Complete
00049     }
00050     else
00051         return FALSE;
00052 }
00053  
00054 bool MAXM8_NMEA_Parser(struct minmea_sentence *gps_frame, int *isPositionDataValid, char *uart_buffer_prt) {
00055 
00056 
00057     //GGA - RMC - VTG
00058     char *start_decimalpart;
00059     char *end_decimalpart;
00060     int  GPS_nmea_id;
00061     char *field[MAX_FIELDS_NUMBER];
00062 
00063     bool isSentenceParsedValid=FALSE;
00064 
00065     int p = 0;
00066 
00067     // <editor-fold defaultstate="collapsed" desc="Command Splitter">
00068     field[0] =(uart_buffer_prt);
00069 
00070     while (*uart_buffer_prt != '\0') {
00071         if (*uart_buffer_prt == ',' || *uart_buffer_prt == '*') {
00072             *uart_buffer_prt = '\0';
00073             field[++p] = uart_buffer_prt + 1;
00074         }
00075         uart_buffer_prt++;
00076     }
00077 
00078 
00079     // </editor-fold>
00080 
00081     // <editor-fold defaultstate="collapsed" desc="Parser">
00082 
00083 
00084     GPS_nmea_id = MAXM8_NMEA_Id(field[0]);
00085 
00086 
00087 
00088     switch (GPS_nmea_id) {
00089 
00090         case NMEA_SENTENCE_RMC:
00091             //$GPRMC,130652.000,A,4038.0868,N,00838.9093,W,0.40,67.63,290316,,,A*49
00092             //Valid
00093              //FGPMMOPA6H_DisableInterrupts();
00094 
00095 
00096 
00097             if (*field[2]== 'A'){ //If the coordenates are valid
00098 
00099 
00100         //Latitude
00101 
00102                 gps_frame->latitude.integer = strtol(field[3], &start_decimalpart, 10);
00103 
00104 
00105                 //printf("%ld ",gps_frame->latitude.integer);
00106 
00107 
00108                 gps_frame->latitude.decimal = strtol(start_decimalpart+1, &end_decimalpart, 10);
00109                 if (strcmp(field[4], "N") == 0)
00110                     gps_frame->latitude.cardeal = 0; //0=North
00111 
00112                 if (strcmp(field[4], "S") == 0)
00113                     gps_frame->latitude.cardeal = 1; // 1=South
00114 
00115 
00116 
00117                 //Longitude
00118                 gps_frame->longitude.integer = strtol(field[5], &start_decimalpart, 10);
00119                 gps_frame->longitude.decimal = strtol(start_decimalpart+1, &end_decimalpart, 10);
00120 
00121                 //Longitude
00122                 if (strcmp(field[6], "W") == 0)
00123                     gps_frame->longitude.cardeal = 0; //0=West
00124 
00125                 if (strcmp(field[6], "E") == 0)
00126                     gps_frame->longitude.cardeal = 1; // 1=East
00127             }
00128             else
00129                 *isPositionDataValid = FALSE;
00130 
00131             break;
00132 
00133       case NMEA_SENTENCE_GGA:
00134                 isSentenceParsedValid=TRUE;
00135             gps_frame->altitude = strtol(field[11], &start_decimalpart, 10);
00136 
00137             gps_frame->num_of_satellites_tracked= strtol(field[7],&start_decimalpart, 10);
00138 
00139             break;
00140 
00141         case NMEA_SENTENCE_VTG:
00142                 isSentenceParsedValid=TRUE;
00143 
00144             gps_frame->speed = strtol(field[7], &start_decimalpart, 10);
00145             break;
00146 
00147         default:
00148             isSentenceParsedValid=FALSE;
00149             break;
00150     }
00151 
00152 
00153 
00154     return isSentenceParsedValid;
00155 }
00156  
00157 enum minmea_sentence_id MAXM8_NMEA_Id(char *str_id) {
00158  
00159     if (strcmp(str_id, "$GPGGA") == 0)
00160         return NMEA_SENTENCE_GGA;
00161     else if (strcmp(str_id, "$GPRMC") == 0)
00162         return NMEA_SENTENCE_RMC;
00163      
00164     else if (strcmp(str_id,"$GPVTG")==0)
00165         return NMEA_SENTENCE_VTG;
00166  
00167     else
00168         return MINMEA_UNKNOWN;
00169  
00170      
00171 }
00172