From 8564ececa58741d9117c175d5b4324403e9579b6 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Mon, 17 Dec 2018 18:22:18 +0100 Subject: sysmobts_mgr: Add support for gpsd < 2.96 This allows running sysmobts-mgr on systems with old gpsd releases (which may have other software depending on such old release). GPSD_API_MAJOR_VERSION define was first added in gpsd 2.39, before that it didn't exist (but this code is known to work against 2.38). GPSD_API_MAJOR_VERSION == 5 was set in version 2.96. Related gpsd commits: 3771dba081bd1175adab6096d7b6270d3822aaa1 e69bcb6b01af6b25c6a525fb1961b92ac04f5213 Related: SYS#4290 Change-Id: If3c35021a020a61d5fa3cde5eebcd09908db822b --- src/osmo-bts-sysmo/misc/sysmobts_mgr.h | 6 ++++++ src/osmo-bts-sysmo/misc/sysmobts_mgr_calib.c | 17 +++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/osmo-bts-sysmo/misc/sysmobts_mgr.h b/src/osmo-bts-sysmo/misc/sysmobts_mgr.h index b62707c8..668263d9 100644 --- a/src/osmo-bts-sysmo/misc/sysmobts_mgr.h +++ b/src/osmo-bts-sysmo/misc/sysmobts_mgr.h @@ -9,6 +9,10 @@ #include +#if !defined(GPSD_API_MAJOR_VERSION) || GPSD_API_MAJOR_VERSION < 5 +#define USE_GPSD2_API 1 +#endif + #include enum { @@ -97,7 +101,9 @@ struct sysmobts_mgr_instance { int gps_open; struct osmo_fd gpsfd; struct gps_data_t *gpsdata; +#if !USE_GPSD2_API struct gps_data_t gpsdata_buf; +#endif struct osmo_timer_list fix_timeout; /* Loop/Re-try control */ diff --git a/src/osmo-bts-sysmo/misc/sysmobts_mgr_calib.c b/src/osmo-bts-sysmo/misc/sysmobts_mgr_calib.c index c3e821e6..a0ba6493 100644 --- a/src/osmo-bts-sysmo/misc/sysmobts_mgr_calib.c +++ b/src/osmo-bts-sysmo/misc/sysmobts_mgr_calib.c @@ -59,8 +59,10 @@ enum calib_result { static inline int compat_gps_read(struct gps_data_t *data) { +#if USE_GPSD2_API + return gps_poll(data); /* API break in gpsd 6bba8b329fc7687b15863d30471d5af402467802 */ -#if GPSD_API_MAJOR_VERSION >= 7 && GPSD_API_MINOR_VERSION >= 0 +#elif GPSD_API_MAJOR_VERSION >= 7 && GPSD_API_MINOR_VERSION >= 0 return gps_read(data, NULL, 0); #else return gps_read(data); @@ -87,7 +89,9 @@ static void mgr_gps_close(struct sysmobts_mgr_instance *mgr) osmo_fd_unregister(&mgr->calib.gpsfd); gps_close(mgr->calib.gpsdata); +#if !USE_GPSD2_API memset(mgr->calib.gpsdata, 0, sizeof(*(mgr->calib.gpsdata))); +#endif mgr->calib.gps_open = 0; } @@ -143,8 +147,13 @@ static void mgr_gps_open(struct sysmobts_mgr_instance *mgr) { int rc; +#if USE_GPSD2_API + mgr->calib.gpsdata = gps_open("localhost", DEFAULT_GPSD_PORT); + rc = mgr->calib.gpsdata ? 0 : -1; +#else mgr->calib.gpsdata = &mgr->calib.gpsdata_buf; rc = gps_open("localhost", DEFAULT_GPSD_PORT, mgr->calib.gpsdata); +#endif if (rc != 0) { LOGP(DCALIB, LOGL_ERROR, "Failed to connect to GPS %d\n", rc); calib_state_reset(mgr, CALIB_FAIL_GPS); @@ -152,8 +161,12 @@ static void mgr_gps_open(struct sysmobts_mgr_instance *mgr) } mgr->calib.gps_open = 1; - gps_stream(mgr->calib.gpsdata, WATCH_ENABLE, NULL); +#if USE_GPSD2_API + gps_query(mgr->calib.gpsdata, "w+x"); +#else + gps_stream(mgr->calib.gpsdata, WATCH_ENABLE, NULL); +#endif mgr->calib.gpsfd.data = mgr; mgr->calib.gpsfd.cb = mgr_gps_read; mgr->calib.gpsfd.when = BSC_FD_READ | BSC_FD_EXCEPT; -- cgit v1.2.3