aboutsummaryrefslogtreecommitdiff
path: root/plugins/quectel
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/quectel')
-rw-r--r--plugins/quectel/mm-shared-quectel.c101
1 files changed, 38 insertions, 63 deletions
diff --git a/plugins/quectel/mm-shared-quectel.c b/plugins/quectel/mm-shared-quectel.c
index 00384787..1b8fe6f5 100644
--- a/plugins/quectel/mm-shared-quectel.c
+++ b/plugins/quectel/mm-shared-quectel.c
@@ -320,21 +320,17 @@ mm_shared_quectel_location_load_capabilities (MMIfaceModemLocation *_self,
/*****************************************************************************/
/* Enable location gathering (Location interface) */
-static const gchar *gps_startup[] = {
- /* NOTES:
- * 1) "+QGPSCFG=\"nmeasrc\",1" will be necessary for getting location data
- * without the nmea port.
- * 2) may be necessary to set "+QGPSCFG=\"gpsnmeatype\".
- */
- "+QGPSCFG=\"outport\",\"usbnmea\"",
- "+QGPS=1",
+/* NOTES:
+ * 1) "+QGPSCFG=\"nmeasrc\",1" will be necessary for getting location data
+ * without the nmea port.
+ * 2) may be necessary to set "+QGPSCFG=\"gpsnmeatype\".
+ */
+static const MMBaseModemAtCommand gps_startup[] = {
+ { "+QGPSCFG=\"outport\",\"usbnmea\"", 3, FALSE, mm_base_modem_response_processor_no_result_continue },
+ { "+QGPS=1", 3, FALSE, mm_base_modem_response_processor_no_result_continue },
+ { NULL }
};
-typedef struct {
- MMModemLocationSource source;
- guint idx;
-} LocationGatheringContext;
-
gboolean
mm_shared_quectel_enable_location_gathering_finish (MMIfaceModemLocation *self,
GAsyncResult *res,
@@ -343,48 +339,25 @@ mm_shared_quectel_enable_location_gathering_finish (MMIfaceModemLocation *self,
return g_task_propagate_boolean (G_TASK (res), error);
}
-static void run_gps_startup (GTask *task);
-
static void
-gps_startup_command_ready (MMBaseModem *self,
- GAsyncResult *res,
- GTask *task)
+gps_startup_ready (MMBaseModem *self,
+ GAsyncResult *res,
+ GTask *task)
{
- GError *error = NULL;
+ MMModemLocationSource source;
+ GError *error = NULL;
- if (!mm_base_modem_at_command_full_finish (self, res, &error)) {
+ mm_base_modem_at_sequence_finish (self, res, NULL, &error);
+ if (error) {
g_task_return_error (task, error);
g_object_unref (task);
return;
}
- /* continue with next command */
- run_gps_startup (task);
-}
-
-static void
-run_gps_startup (GTask *task)
-{
- MMSharedQuectel *self;
- LocationGatheringContext *ctx;
-
- self = g_task_get_source_object (task);
- ctx = g_task_get_task_data (task);
-
- /* If there are more commands run them */
- if (ctx->idx < G_N_ELEMENTS (gps_startup)) {
- mm_base_modem_at_command (MM_BASE_MODEM (self),
- gps_startup[ctx->idx++],
- 3,
- FALSE,
- (GAsyncReadyCallback)gps_startup_command_ready,
- task);
- return;
- }
+ source = GPOINTER_TO_UINT (g_task_get_task_data (task));
/* Check if the nmea/raw gps port exists and is available */
- if (ctx->source & (MM_MODEM_LOCATION_SOURCE_GPS_NMEA | MM_MODEM_LOCATION_SOURCE_GPS_RAW)) {
- GError *error = NULL;
+ if (source & (MM_MODEM_LOCATION_SOURCE_GPS_NMEA | MM_MODEM_LOCATION_SOURCE_GPS_RAW)) {
MMPortSerialGps *gps_port;
gps_port = mm_base_modem_peek_port_gps (MM_BASE_MODEM (self));
@@ -425,10 +398,9 @@ mm_shared_quectel_enable_location_gathering (MMIfaceModemLocation *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
- LocationGatheringContext *ctx;
- GTask *task;
- Private *priv;
- gboolean start_gps = FALSE;
+ GTask *task;
+ Private *priv;
+ gboolean start_gps = FALSE;
priv = get_private (MM_SHARED_QUECTEL (self));
g_assert (priv->iface_modem_location_parent);
@@ -436,6 +408,7 @@ mm_shared_quectel_enable_location_gathering (MMIfaceModemLocation *self,
g_assert (priv->iface_modem_location_parent->enable_location_gathering_finish);
task = g_task_new (self, NULL, callback, user_data);
+ g_task_set_task_data (task, GUINT_TO_POINTER (source), NULL);
/* Check if the source is provided by the parent */
if (!(priv->provided_sources & source)) {
@@ -447,26 +420,28 @@ mm_shared_quectel_enable_location_gathering (MMIfaceModemLocation *self,
return;
}
- ctx = g_new0 (LocationGatheringContext, 1);
- ctx->source = source;
- g_task_set_task_data (task, ctx, g_free);
+ /* Only start GPS engine if not done already */
+ start_gps = ((source & (MM_MODEM_LOCATION_SOURCE_GPS_NMEA |
+ MM_MODEM_LOCATION_SOURCE_GPS_RAW |
+ MM_MODEM_LOCATION_SOURCE_GPS_UNMANAGED)) &&
+ !(priv->enabled_sources & (MM_MODEM_LOCATION_SOURCE_GPS_NMEA |
+ MM_MODEM_LOCATION_SOURCE_GPS_RAW |
+ MM_MODEM_LOCATION_SOURCE_GPS_UNMANAGED)));
- /* RAW, NMEA and UNMANAGED are all enabled in the same way */
- if (ctx->source & (MM_MODEM_LOCATION_SOURCE_GPS_NMEA |
- MM_MODEM_LOCATION_SOURCE_GPS_RAW |
- MM_MODEM_LOCATION_SOURCE_GPS_UNMANAGED)) {
- if (priv->enabled_sources == MM_MODEM_LOCATION_SOURCE_NONE)
- start_gps = TRUE;
-
- priv->enabled_sources |= ctx->source;
- }
+ priv->enabled_sources |= source;
if (start_gps) {
- run_gps_startup (task);
+ mm_base_modem_at_sequence (
+ MM_BASE_MODEM (self),
+ gps_startup,
+ NULL, /* response_processor_context */
+ NULL, /* response_processor_context_free */
+ (GAsyncReadyCallback)gps_startup_ready,
+ task);
return;
}
- /* For any other location (e.g. 3GPP), or if the GPS is already running just return */
+ /* If the GPS is already running just return */
g_task_return_boolean (task, TRUE);
g_object_unref (task);
}