#include #include #define MODE_STR_NUM 4 static char *mode_str[MODE_STR_NUM] = { "n/a", "None", "2D", "3D" }; typedef struct { double latitude; double longitude; double speed; timespec_t time; double hdop; int settelite_used; int satellites_visible; int mode; int status; }GNSS_DATA; int main(int argc, char *argv[]) { struct gps_data_t gpsd_gps_data; int status; GNSS_DATA gnss_data = {0}; if (0 != gps_open("localhost", GPSD_PORT, &gpsd_gps_data)) { _LOG_DEBUG ( _LOG_FAULT_MSG, "LC79D_GNSS open error"); exit(-1); } /*enable watch enable from gpsd demon*/ (void)gps_stream(&gpsd_gps_data, WATCH_ENABLE | WATCH_JSON, NULL); // Wait for data available. while (gps_waiting(&gpsd_gps_data, GNSS_DATA_TIME_OUT_US)) { // will not block because we know data is available. if (-1 == gps_read(&gpsd_gps_data, NULL, 0)) { _LOG_DEBUG ( _LOG_FAULT_MSG, "GNSS Read ERROR"); break; } if (MODE_SET != (MODE_SET & gpsd_gps_data.set)) { continue; } if (0 > gpsd_gps_data.fix.mode || MODE_STR_NUM <= gpsd_gps_data.fix.mode) { /*valid fix is not avilable*/ gpsd_gps_data.fix.mode = 0; } if (TIME_SET == (TIME_SET & gpsd_gps_data.set)) { /*reset old data*/ gnss_reset_data(&gnss_data); gnss_data.time = gpsd_gps_data.fix.time; } if (isfinite(gpsd_gps_data.fix.latitude) && isfinite( gpsd_gps_data.fix.longitude)) { /* store data from the GPS receiver if valid*/ gnss_data.latitude = gpsd_gps_data.fix.latitude; gnss_data.longitude = gpsd_gps_data.fix.longitude; /*store speed into KPH as per requirement*/ gnss_data.speed = gpsd_gps_data.fix.speed * MPS_TO_KPH; gnss_data.settelite_used = gpsd_gps_data.satellites_used; gnss_data.hdop = gpsd_gps_data.dop.hdop; gnss_data.mode = gpsd_gps_data.fix.mode; gnss_data.satellites_visible = gpsd_gps_data.satellites_visible; gnss_data.status = gpsd_gps_data.fix.status; printf("mode: %s ",mode_str[gnss_data.mode]); printf("GPS Quality: %d %d\n ",gnss_data.status,status); } } _LOG_DEBUG ( _LOG_FAULT_MSG, "GNSS data timeout"); return 0; }