Example #1
0
// 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;
        }
    }
}
Example #2
0
/**
 * 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;
}
Example #3
0
// 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;
	}

}
Example #4
0
// 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;
        }
    }
}