// Compute the GPS location using decimal scale extern void gps_location(loc_t *coord) { uint8_t status = _EMPTY; while(status != _COMPLETED) { gpgga_t gpgga; gprmc_t gprmc; char buffer[256]; serial_readln(buffer, 256); switch (nmea_get_message_type(buffer)) { case NMEA_GPGGA: nmea_parse_gpgga(buffer, &gpgga); gps_convert_deg_to_dec(&(gpgga.latitude), gpgga.lat, &(gpgga.longitude), gpgga.lon); coord->latitude = gpgga.latitude; coord->longitude = gpgga.longitude; coord->altitude = gpgga.altitude; status |= NMEA_GPGGA; break; case NMEA_GPRMC: nmea_parse_gprmc(buffer, &gprmc); coord->speed = gprmc.speed; coord->course = gprmc.course; status |= NMEA_GPRMC; break; } } }
/** * Parses a message. If the message could not be parsed, NULL is returned. The * return value be cast to the proper struct, based on the determined message * type. * * If the message could not be parsed, and if the outError pointer is non-NULL, * its contents will be set to the appropriate error code. */ LIBNMEA_PUBLIC nmea_message_t *nmea_parse_message(char *message, nmea_error_t *outError) { assert(message != NULL); // If we can parse the message, point to it here nmea_message_t *parsed; // Create a copy of the input message. int len = strlen(message); char *copy = malloc(len + 2); strncpy(copy, message, len + 2); // Figure out what function will parse this message nmea_message_type_t t = nmea_get_message_type(message); switch(t) { case kNMEAMessageGGA: parsed = (nmea_message_t *) parse_gga(copy, outError); break; case kNMEAMessageGSA: parsed = (nmea_message_t *) parse_gsa(copy, outError); break; case kNMEAMessageGSV: parsed = (nmea_message_t *) parse_gsv(copy, outError); break; case kNMEAMessageVTG: parsed = (nmea_message_t *) parse_vtg(copy, outError); break; // The message was of an unknown type. (Handles kNMEAMessageUnknown) default: if(outError) *outError = kNMEAErrorTypeNotUnderstood; parsed = NULL; break; } // Ensure we don't pass back invalid data. assert(parsed); // Clean up free(copy); parsed->type = t; // We're done. return parsed; }
// Compute the GPS location using decimal scale void gps_location(loc_t *coord, char *buffer) { coord->type = nmea_get_message_type(buffer); switch (coord->type) { case NMEA_GPGGA: nmea_parse_gpgga(buffer, coord); gps_convert_deg_to_dec(&(coord->latitude), coord->lat, &(coord->longitude), coord->lon); break; case NMEA_GPRMC: nmea_parse_gprmc(buffer, coord); break; case NMEA_UNKNOWN: // unknown message type break; } }
// Compute the GPS location using decimal scale extern void gps_location(loc_t *coord) { uint8_t status = _EMPTY; while(status != _COMPLETED) { gpgga_t gpgga; gprmc_t gprmc; char buffer[1000]; //mraa_uart_read(uart, buffer, 256); serial_readln(buffer, 256); //printf("%s\n", buffer); //printf("%d\n",nmea_get_message_type(buffer)); switch (nmea_get_message_type(buffer)) { case NMEA_GPGGA: nmea_parse_gpgga(buffer, &gpgga); //printf("%d\n", gpgga.latitude); gps_convert_deg_to_dec(&(gpgga.latitude), gpgga.lat, &(gpgga.longitude), gpgga.lon); // printf("%d\n", gpgga.latitude); coord->latitude = gpgga.latitude; coord->longitude = gpgga.longitude; coord->altitude = gpgga.altitude; status |= NMEA_GPGGA; break; case NMEA_GPRMC: nmea_parse_gprmc(buffer, &gprmc); coord->speed = gprmc.speed; coord->course = gprmc.course; //printf("%dspeed\n", gprmc.speed); //coord->magnetic = gprmc.magnetic; //coord->mag = gprmc.mag; //printf("%d\n", gprmc.magnetic); status |= NMEA_GPRMC; break; } } }