I have GPSD installed and am using the c library libgps. It works okay, but I've noticed what look like bugs. Specifically if I run the simple program below with the GPS plugged in the program prints GPS data like expected, but if while runnign I unplugged the GPS the program still says it has a GPS fix, and also the lat. and long. values change slightly. Which is obviously very odd. I would guess I'm doing something wrong in the code but I can't figure it out, any ideas?
#include <gps.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
int main() {
int rc;
struct timeval tv;
struct gps_data_t gps_data;
if ((rc = gps_open("localhost", "2947", &gps_data)) == -1) {
printf("code: %d, reason: %s\n", rc, gps_errstr(rc));
return EXIT_FAILURE;
}
gps_stream(&gps_data, WATCH_ENABLE | WATCH_JSON, NULL);
while (1) {
/* wait for 2 seconds to receive data */
if (gps_waiting (&gps_data, 2000000)) {
/* read data */
printf("GPS Status: %i, GPS Fix Mode: %i, GPS Lat: %f \n", gps_data.status,gps_data.fix.mode,gps_data.fix.latitude);
if ((rc = gps_read(&gps_data)) == -1) {
printf("error occured reading gps data. code: %d, reason: %s\n", rc, gps_errstr(rc));
} else {
/* Display data from the GPS receiver. */
if ((gps_data.status == STATUS_FIX) &&
(gps_data.fix.mode == MODE_2D || gps_data.fix.mode == MODE_3D) &&
!isnan(gps_data.fix.latitude) &&
!isnan(gps_data.fix.longitude)) {
//gettimeofday(&tv, NULL); EDIT: tv.tv_sec isn't actually the timestamp!
printf("GPS Status: %i, latitude: %f, longitude: %f, speed: %f, timestamp: %lf\n", gps_data.status, gps_data.fix.latitude, gps_data.fix.longitude, gps_data.fix.speed, gps_data.fix.time); //EDIT: Replaced tv.tv_sec with gps_data.fix.time
} else {
printf("no GPS data available\n");
}
}
}
sleep(3);
printf("out of sleep \n");
}
/* When you are done... */
gps_stream(&gps_data, WATCH_DISABLE, NULL);
gps_close (&gps_data);
return EXIT_SUCCESS;
}
Example of output data with GPS unplugged
GPS Status: 1, GPS Fix Mode: 3, GPS Lat: 34.371312
GPS Status: 1, latitude: 34.371312, longitude: -117.448095, speed: 0.050000, timestamp: 1551545758.000000
out of sleep
GPS Status: 1, GPS Fix Mode: 3, GPS Lat: 34.371312
GPS Status: 1, latitude: 34.371313, longitude: -117.448093, speed: 0.114000, timestamp: 1551545759.000000
out of sleep
GPS Status: 1, GPS Fix Mode: 2, GPS Lat: 34.371313
GPS Status: 1, latitude: 34.371313, longitude: -117.448093, speed: 0.114000, timestamp: 1551545759.000000
out of sleep
GPS Status: 1, GPS Fix Mode: 3, GPS Lat: 34.371313
GPS Status: 1, latitude: 34.371313, longitude: -117.448093, speed: 0.114000, timestamp: 1551545759.000000
out of sleep
GPS Status: 1, GPS Fix Mode: 3, GPS Lat: 34.371313
GPS Status: 1, latitude: 34.371313, longitude: -117.448093, speed: 0.095000, timestamp: 1551545760.000000
I also noticed sometimes the program above says gps_data.status = 0 (no satellite fix), but cgps will have a fix. Both are running at same time (i.e., program above and cgps).