diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2015-12-03 17:06:16 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2015-12-19 12:22:30 +0100 |
commit | 6c35878f12ab37604d85cb3a864e3859973bd195 (patch) | |
tree | 8cb47c2e08eed2a95be75c580a37ffbc8519cfec /src | |
parent | aae96778c54a59dcf3955c2d81bee393c0348077 (diff) |
location: support updating the GPS refresh time
The default setup uses a refresh time of 30s, which means that even if the GPS
location updates are received at a higher frequency, the DBus interface will
still expose at most one update every 30s.
This patch includes a new "SetGpsRefreshTime()" method in the Location
interface, which takes a single 'u' parameter, specifying the refresh rate to
use, in seconds. This method also allows 0 being passed, which will make the
implementation to publish the GPS location updates are soon as ModemManager
detects them.
Along with the new method, a "GpsRefreshTime" read-only property is exposed
to specify the refresh time in effect.
The new method and property will only be applicable if the device has GPS
capabilities.
https://bugs.freedesktop.org/show_bug.cgi?id=89924
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-iface-modem-location.c | 104 |
1 files changed, 102 insertions, 2 deletions
diff --git a/src/mm-iface-modem-location.c b/src/mm-iface-modem-location.c index bf1e64e2..a15942d5 100644 --- a/src/mm-iface-modem-location.c +++ b/src/mm-iface-modem-location.c @@ -253,7 +253,7 @@ mm_iface_modem_location_gps_update (MMIfaceModemLocation *self, g_assert (ctx->location_gps_nmea != NULL); if (mm_location_gps_nmea_add_trace (ctx->location_gps_nmea, nmea_trace) && (ctx->location_gps_nmea_last_time == 0 || - time (NULL) - ctx->location_gps_nmea_last_time >= MM_LOCATION_GPS_REFRESH_TIME_SECS)) { + time (NULL) - ctx->location_gps_nmea_last_time >= mm_gdbus_modem_location_get_gps_refresh_rate (skeleton))) { ctx->location_gps_nmea_last_time = time (NULL); update_nmea = TRUE; } @@ -263,7 +263,7 @@ mm_iface_modem_location_gps_update (MMIfaceModemLocation *self, g_assert (ctx->location_gps_raw != NULL); if (mm_location_gps_raw_add_trace (ctx->location_gps_raw, nmea_trace) && (ctx->location_gps_raw_last_time == 0 || - time (NULL) - ctx->location_gps_raw_last_time >= MM_LOCATION_GPS_REFRESH_TIME_SECS)) { + time (NULL) - ctx->location_gps_raw_last_time >= mm_gdbus_modem_location_get_gps_refresh_rate (skeleton))) { ctx->location_gps_raw_last_time = time (NULL); update_raw = TRUE; } @@ -1029,6 +1029,91 @@ typedef struct { MmGdbusModemLocation *skeleton; GDBusMethodInvocation *invocation; MMIfaceModemLocation *self; + guint rate; +} HandleSetGpsRefreshRateContext; + +static void +handle_set_gps_refresh_rate_context_free (HandleSetGpsRefreshRateContext *ctx) +{ + g_object_unref (ctx->skeleton); + g_object_unref (ctx->invocation); + g_object_unref (ctx->self); + g_slice_free (HandleSetGpsRefreshRateContext, ctx); +} + +static void +handle_set_gps_refresh_rate_auth_ready (MMBaseModem *self, + GAsyncResult *res, + HandleSetGpsRefreshRateContext *ctx) +{ + GError *error = NULL; + MMModemState modem_state; + + if (!mm_base_modem_authorize_finish (self, res, &error)) { + g_dbus_method_invocation_take_error (ctx->invocation, error); + handle_set_gps_refresh_rate_context_free (ctx); + return; + } + + modem_state = MM_MODEM_STATE_UNKNOWN; + g_object_get (self, + MM_IFACE_MODEM_STATE, &modem_state, + NULL); + if (modem_state < MM_MODEM_STATE_ENABLED) { + g_dbus_method_invocation_return_error (ctx->invocation, + MM_CORE_ERROR, + MM_CORE_ERROR_WRONG_STATE, + "Cannot set SUPL server: " + "device not yet enabled"); + handle_set_gps_refresh_rate_context_free (ctx); + return; + } + + /* If GPS is NOT supported, set error */ + if (!(mm_gdbus_modem_location_get_capabilities (ctx->skeleton) & ((MM_MODEM_LOCATION_SOURCE_GPS_RAW | + MM_MODEM_LOCATION_SOURCE_GPS_NMEA)))) { + g_dbus_method_invocation_return_error (ctx->invocation, + MM_CORE_ERROR, + MM_CORE_ERROR_UNSUPPORTED, + "Cannot set GPS refresh rate: GPS not supported"); + handle_set_gps_refresh_rate_context_free (ctx); + return; + } + + /* Set the new rate in the interface */ + mm_gdbus_modem_location_set_gps_refresh_rate (ctx->skeleton, ctx->rate); + mm_gdbus_modem_location_complete_set_gps_refresh_rate (ctx->skeleton, ctx->invocation); + handle_set_gps_refresh_rate_context_free (ctx); +} + +static gboolean +handle_set_gps_refresh_rate (MmGdbusModemLocation *skeleton, + GDBusMethodInvocation *invocation, + guint rate, + MMIfaceModemLocation *self) +{ + HandleSetGpsRefreshRateContext *ctx; + + ctx = g_slice_new (HandleSetGpsRefreshRateContext); + ctx->skeleton = g_object_ref (skeleton); + ctx->invocation = g_object_ref (invocation); + ctx->self = g_object_ref (self); + ctx->rate = rate; + + mm_base_modem_authorize (MM_BASE_MODEM (self), + invocation, + MM_AUTHORIZATION_DEVICE_CONTROL, + (GAsyncReadyCallback)handle_set_gps_refresh_rate_auth_ready, + ctx); + return TRUE; +} + +/*****************************************************************************/ + +typedef struct { + MmGdbusModemLocation *skeleton; + GDBusMethodInvocation *invocation; + MMIfaceModemLocation *self; } HandleGetLocationContext; static void @@ -1362,6 +1447,7 @@ typedef enum { INITIALIZATION_STEP_CAPABILITIES, INITIALIZATION_STEP_VALIDATE_CAPABILITIES, INITIALIZATION_STEP_SUPL_SERVER, + INITIALIZATION_STEP_GPS_REFRESH_RATE, INITIALIZATION_STEP_LAST } InitializationStep; @@ -1497,6 +1583,16 @@ interface_initialization_step (InitializationContext *ctx) /* Fall down to next step */ ctx->step++; + case INITIALIZATION_STEP_GPS_REFRESH_RATE: + /* If we have GPS capabilities, expose the GPS refresh rate */ + if (ctx->capabilities & ((MM_MODEM_LOCATION_SOURCE_GPS_RAW | + MM_MODEM_LOCATION_SOURCE_GPS_NMEA))) + /* Set the default rate in the interface */ + mm_gdbus_modem_location_set_gps_refresh_rate (ctx->skeleton, MM_LOCATION_GPS_REFRESH_TIME_SECS); + + /* Fall down to next step */ + ctx->step++; + case INITIALIZATION_STEP_LAST: /* We are done without errors! */ @@ -1510,6 +1606,10 @@ interface_initialization_step (InitializationContext *ctx) G_CALLBACK (handle_set_supl_server), ctx->self); g_signal_connect (ctx->skeleton, + "handle-set-gps-refresh-rate", + G_CALLBACK (handle_set_gps_refresh_rate), + ctx->self); + g_signal_connect (ctx->skeleton, "handle-get-location", G_CALLBACK (handle_get_location), ctx->self); |