summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2019-03-14 09:24:20 +0100
committerAleksander Morgado <aleksander@aleksander.es>2019-03-14 11:42:50 +0100
commit4f823d5fe09b6ac264744f942602d074786b84c9 (patch)
tree6e67dfac82f834176c03ca98fc4be2736a3bd4c4
parentc1c842c3e6745edb0ef689710cf1fdb4094d4ee5 (diff)
downloadModemManager-4f823d5fe09b6ac264744f942602d074786b84c9.tar.gz
shared-qmi: implement support for MSB A-GPS
-rw-r--r--src/mm-shared-qmi.c124
1 files changed, 89 insertions, 35 deletions
diff --git a/src/mm-shared-qmi.c b/src/mm-shared-qmi.c
index a67104654..9a1e2c95f 100644
--- a/src/mm-shared-qmi.c
+++ b/src/mm-shared-qmi.c
@@ -2992,12 +2992,13 @@ start_gps_engine (MMSharedQmi *self,
}
/*****************************************************************************/
-/* Location: internal helper: select operation mode (assisted/standalone) */
+/* Location: internal helper: select operation mode (msa/msb/standalone) */
typedef enum {
GPS_OPERATION_MODE_UNKNOWN,
GPS_OPERATION_MODE_STANDALONE,
- GPS_OPERATION_MODE_ASSISTED,
+ GPS_OPERATION_MODE_AGPS_MSA,
+ GPS_OPERATION_MODE_AGPS_MSB,
} GpsOperationMode;
typedef struct {
@@ -3057,7 +3058,19 @@ pds_set_default_tracking_session_ready (QmiClientPds *client,
qmi_message_pds_set_default_tracking_session_output_unref (output);
- mm_dbg ("A-GPS %s", ctx->mode == GPS_OPERATION_MODE_ASSISTED ? "enabled" : "disabled");
+ switch (ctx->mode) {
+ case GPS_OPERATION_MODE_AGPS_MSA:
+ mm_dbg ("MSA A-GPS operation mode enabled");
+ break;
+ case GPS_OPERATION_MODE_AGPS_MSB:
+ mm_dbg ("MSB A-GPS operation mode enabled");
+ break;
+ case GPS_OPERATION_MODE_STANDALONE:
+ mm_dbg ("Standalone mode enabled (A-GPS disabled)");
+ break;
+ default:
+ g_assert_not_reached ();
+ }
g_task_return_boolean (task, TRUE);
g_object_unref (task);
}
@@ -3106,15 +3119,24 @@ pds_get_default_tracking_session_ready (QmiClientPds *client,
qmi_message_pds_get_default_tracking_session_output_unref (output);
- if (ctx->mode == GPS_OPERATION_MODE_ASSISTED) {
+ if (ctx->mode == GPS_OPERATION_MODE_AGPS_MSA) {
if (session_operation == QMI_PDS_OPERATING_MODE_MS_ASSISTED) {
- mm_dbg ("A-GPS already enabled");
+ mm_dbg ("MSA A-GPS already enabled");
g_task_return_boolean (task, TRUE);
g_object_unref (task);
return;
}
- mm_dbg ("Need to enable A-GPS");
+ mm_dbg ("Need to enable MSA A-GPS");
session_operation = QMI_PDS_OPERATING_MODE_MS_ASSISTED;
+ } else if (ctx->mode == GPS_OPERATION_MODE_AGPS_MSB) {
+ if (session_operation == QMI_PDS_OPERATING_MODE_MS_BASED) {
+ mm_dbg ("MSB A-GPS already enabled");
+ g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
+ return;
+ }
+ mm_dbg ("Need to enable MSB A-GPS");
+ session_operation = QMI_PDS_OPERATING_MODE_MS_BASED;
} else if (ctx->mode == GPS_OPERATION_MODE_STANDALONE) {
if (session_operation == QMI_PDS_OPERATING_MODE_STANDALONE) {
mm_dbg ("A-GPS already disabled");
@@ -3183,7 +3205,19 @@ loc_location_set_operation_mode_indication_cb (QmiClientLoc
return;
}
- mm_dbg ("A-GPS %s", ctx->mode == GPS_OPERATION_MODE_ASSISTED ? "enabled" : "disabled");
+ switch (ctx->mode) {
+ case GPS_OPERATION_MODE_AGPS_MSA:
+ mm_dbg ("MSA A-GPS operation mode enabled");
+ break;
+ case GPS_OPERATION_MODE_AGPS_MSB:
+ mm_dbg ("MSB A-GPS operation mode enabled");
+ break;
+ case GPS_OPERATION_MODE_STANDALONE:
+ mm_dbg ("Standalone mode enabled (A-GPS disabled)");
+ break;
+ default:
+ g_assert_not_reached ();
+ }
g_task_return_boolean (task, TRUE);
g_object_unref (task);
}
@@ -3255,15 +3289,24 @@ loc_location_get_operation_mode_indication_cb (QmiClientLoc
qmi_indication_loc_get_operation_mode_output_get_operation_mode (output, &mode, NULL);
- if (ctx->mode == GPS_OPERATION_MODE_ASSISTED) {
+ if (ctx->mode == GPS_OPERATION_MODE_AGPS_MSA) {
if (mode == QMI_LOC_OPERATION_MODE_MSA) {
- mm_dbg ("A-GPS already enabled");
+ mm_dbg ("MSA A-GPS already enabled");
g_task_return_boolean (task, TRUE);
g_object_unref (task);
return;
}
- mm_dbg ("Need to enable A-GPS");
+ mm_dbg ("Need to enable MSA A-GPS");
mode = QMI_LOC_OPERATION_MODE_MSA;
+ } else if (ctx->mode == GPS_OPERATION_MODE_AGPS_MSB) {
+ if (mode == QMI_LOC_OPERATION_MODE_MSB) {
+ mm_dbg ("MSB A-GPS already enabled");
+ g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
+ return;
+ }
+ mm_dbg ("Need to enable MSB A-GPS");
+ mode = QMI_LOC_OPERATION_MODE_MSB;
} else if (ctx->mode == GPS_OPERATION_MODE_STANDALONE) {
if (mode == QMI_LOC_OPERATION_MODE_STANDALONE) {
mm_dbg ("A-GPS already disabled");
@@ -3432,8 +3475,9 @@ set_gps_operation_mode_standalone_ready (MMSharedQmi *self,
GAsyncResult *res,
GTask *task)
{
- GError *error = NULL;
- Private *priv;
+ MMModemLocationSource source;
+ Private *priv;
+ GError *error = NULL;
if (!set_gps_operation_mode_finish (self, res, &error)) {
g_task_return_error (task, error);
@@ -3441,9 +3485,10 @@ set_gps_operation_mode_standalone_ready (MMSharedQmi *self,
return;
}
+ source = (MMModemLocationSource) GPOINTER_TO_UINT (g_task_get_task_data (task));
priv = get_private (self);
- priv->enabled_sources &= ~MM_MODEM_LOCATION_SOURCE_AGPS_MSA;
+ priv->enabled_sources &= ~source;
g_task_return_boolean (task, TRUE);
g_object_unref (task);
@@ -3469,8 +3514,9 @@ mm_shared_qmi_disable_location_gathering (MMIfaceModemLocation *_self,
/* NOTE: no parent disable_location_gathering() implementation */
if (!(source & (MM_MODEM_LOCATION_SOURCE_GPS_NMEA |
- MM_MODEM_LOCATION_SOURCE_GPS_RAW |
- MM_MODEM_LOCATION_SOURCE_AGPS_MSA))) {
+ MM_MODEM_LOCATION_SOURCE_GPS_RAW |
+ MM_MODEM_LOCATION_SOURCE_AGPS_MSA |
+ MM_MODEM_LOCATION_SOURCE_AGPS_MSB))) {
g_task_return_boolean (task, TRUE);
g_object_unref (task);
return;
@@ -3479,7 +3525,7 @@ mm_shared_qmi_disable_location_gathering (MMIfaceModemLocation *_self,
g_assert (!(priv->pds_client && priv->loc_client));
/* Disable A-GPS? */
- if (source == MM_MODEM_LOCATION_SOURCE_AGPS_MSA) {
+ if (source == MM_MODEM_LOCATION_SOURCE_AGPS_MSA || source == MM_MODEM_LOCATION_SOURCE_AGPS_MSB) {
set_gps_operation_mode (self,
GPS_OPERATION_MODE_STANDALONE,
(GAsyncReadyCallback)set_gps_operation_mode_standalone_ready,
@@ -3540,12 +3586,13 @@ start_gps_engine_ready (MMSharedQmi *self,
}
static void
-set_gps_operation_mode_assisted_ready (MMSharedQmi *self,
- GAsyncResult *res,
- GTask *task)
+set_gps_operation_mode_agps_ready (MMSharedQmi *self,
+ GAsyncResult *res,
+ GTask *task)
{
- GError *error = NULL;
- Private *priv;
+ MMModemLocationSource source;
+ Private *priv;
+ GError *error = NULL;
if (!set_gps_operation_mode_finish (self, res, &error)) {
g_task_return_error (task, error);
@@ -3553,9 +3600,10 @@ set_gps_operation_mode_assisted_ready (MMSharedQmi *self,
return;
}
+ source = (MMModemLocationSource) GPOINTER_TO_UINT (g_task_get_task_data (task));
priv = get_private (self);
- priv->enabled_sources |= MM_MODEM_LOCATION_SOURCE_AGPS_MSA;
+ priv->enabled_sources |= source;
g_task_return_boolean (task, TRUE);
g_object_unref (task);
@@ -3584,17 +3632,27 @@ parent_enable_location_gathering_ready (MMIfaceModemLocation *_self,
/* We only consider GPS related sources in this shared QMI implementation */
if (!(source & (MM_MODEM_LOCATION_SOURCE_GPS_NMEA |
MM_MODEM_LOCATION_SOURCE_GPS_RAW |
- MM_MODEM_LOCATION_SOURCE_AGPS_MSA))) {
+ MM_MODEM_LOCATION_SOURCE_AGPS_MSA |
+ MM_MODEM_LOCATION_SOURCE_AGPS_MSB))) {
g_task_return_boolean (task, TRUE);
g_object_unref (task);
return;
}
- /* Enabling A-GPS? */
+ /* Enabling MSA A-GPS? */
if (source == MM_MODEM_LOCATION_SOURCE_AGPS_MSA) {
set_gps_operation_mode (self,
- GPS_OPERATION_MODE_ASSISTED,
- (GAsyncReadyCallback)set_gps_operation_mode_assisted_ready,
+ GPS_OPERATION_MODE_AGPS_MSA,
+ (GAsyncReadyCallback)set_gps_operation_mode_agps_ready,
+ task);
+ return;
+ }
+
+ /* Enabling MSB A-GPS? */
+ if (source == MM_MODEM_LOCATION_SOURCE_AGPS_MSB) {
+ set_gps_operation_mode (self,
+ GPS_OPERATION_MODE_AGPS_MSB,
+ (GAsyncReadyCallback)set_gps_operation_mode_agps_ready,
task);
return;
}
@@ -3677,17 +3735,13 @@ parent_load_capabilities_ready (MMIfaceModemLocation *self,
/* Now our own checks */
- /* If we have support for the PDS client, GPS and A-GPS location is supported */
- if (mm_shared_qmi_peek_client (MM_SHARED_QMI (self), QMI_SERVICE_PDS, MM_PORT_QMI_FLAG_DEFAULT, NULL))
- sources |= (MM_MODEM_LOCATION_SOURCE_GPS_NMEA |
- MM_MODEM_LOCATION_SOURCE_GPS_RAW |
- MM_MODEM_LOCATION_SOURCE_AGPS_MSA);
-
- /* If we have support for the LOC client, GPS location is supported */
- if (mm_shared_qmi_peek_client (MM_SHARED_QMI (self), QMI_SERVICE_LOC, MM_PORT_QMI_FLAG_DEFAULT, NULL))
+ /* If we have support for the PDS or LOC client, GPS and A-GPS location is supported */
+ if ((mm_shared_qmi_peek_client (MM_SHARED_QMI (self), QMI_SERVICE_PDS, MM_PORT_QMI_FLAG_DEFAULT, NULL)) ||
+ (mm_shared_qmi_peek_client (MM_SHARED_QMI (self), QMI_SERVICE_LOC, MM_PORT_QMI_FLAG_DEFAULT, NULL)))
sources |= (MM_MODEM_LOCATION_SOURCE_GPS_NMEA |
MM_MODEM_LOCATION_SOURCE_GPS_RAW |
- MM_MODEM_LOCATION_SOURCE_AGPS_MSA);
+ MM_MODEM_LOCATION_SOURCE_AGPS_MSA |
+ MM_MODEM_LOCATION_SOURCE_AGPS_MSB);
/* So we're done, complete */
g_task_return_int (task, sources);