// 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; } } }
void *serial_thread(void *queue_ptr) { char raw_packet[254] = "\0"; struct rp_entry *rpe = NULL; // char buf[255]; log_debug("starting serial thread"); while (1) { if (serial_readln(raw_packet) == 0) { if (!(rpe = (struct rp_entry *)malloc(sizeof(struct rp_entry)))) { log_debug("serial_thread: malloc failed"); return NULL; } // (void)snprintf(buf, sizeof(buf), "received: %s", raw_packet); // log_debug(buf); rpe->payload = raw_packet; pthread_mutex_lock(&rp_mutex); SIMPLEQ_INSERT_TAIL(&rp_head, rpe, rp_entries); pthread_cond_signal(&rp_cond); pthread_mutex_unlock(&rp_mutex); } } return 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; } } }