[PATCH 5/5] cinterion: retry GPS Engine activation up to 3 times
Aleksander Morgado
aleksander at aleksander.es
Wed May 17 13:24:04 UTC 2017
The default setup with 100ms between GPS commands doesn't seem to be
always enough for the Engine activation step:
[1495016625.392972] (ttyACM1): --> 'AT^SGPSC="NMEA/Output","on"<CR>'
[1495016625.503885] (ttyACM1): <-- '<CR><LF>^SGPSC: "Nmea/Output","on"<CR><LF><CR><LF><CR><LF>OK<CR><LF>'
[1495016625.607650] (ttyACM1): --> 'AT^SGPSC="Power/Antenna","on"<CR>'
[1495016625.697862] (ttyACM1): <-- '<CR><LF>^SGPSC: "Power/Antenna","on"<CR><LF><CR><LF>OK<CR><LF>'
[1495016625.809393] (ttyACM1): --> 'AT^SGPSC="Engine","1"<CR>'
[1495016625.895970] (ttyACM1): <-- '<CR><LF>+CME ERROR: 767<CR><LF>'
We now setup up to 3 retries for the Engine activation step before
returning an error, and we also update to 500ms the wait time before
the Engine activation command is run.
---
plugins/cinterion/mm-common-cinterion.c | 43 ++++++++++++++++++++++++---------
1 file changed, 32 insertions(+), 11 deletions(-)
diff --git a/plugins/cinterion/mm-common-cinterion.c b/plugins/cinterion/mm-common-cinterion.c
index 6e839c8d..40860206 100644
--- a/plugins/cinterion/mm-common-cinterion.c
+++ b/plugins/cinterion/mm-common-cinterion.c
@@ -533,6 +533,15 @@ mm_common_cinterion_disable_location_gathering (MMIfaceModemLocation *self,
/*****************************************************************************/
/* Enable location gathering (Location interface) */
+/* We will retry the SGPSC command that enables the Engine */
+#define MAX_SGPSC_ENGINE_RETRIES 3
+
+/* Cinterion asks for 100ms some time between GPS commands, but we'll give up
+ * to 500ms before setting the Engine configuration as 100ms didn't seem always
+ * enough (we would get +CME ERROR: 767 errors reported). */
+#define GPS_COMMAND_TIMEOUT_DEFAULT_MS 100
+#define GPS_COMMAND_TIMEOUT_ENGINE_MS 500
+
typedef enum {
ENABLE_LOCATION_GATHERING_GPS_STEP_FIRST,
ENABLE_LOCATION_GATHERING_GPS_STEP_SGPSS,
@@ -545,6 +554,7 @@ typedef enum {
typedef struct {
MMModemLocationSource source;
EnableLocationGatheringGpsStep gps_step;
+ guint sgpsc_engine_retries;
} EnableLocationGatheringContext;
static void
@@ -564,16 +574,10 @@ mm_common_cinterion_enable_location_gathering_finish (MMIfaceModemLocation *sel
static void enable_location_gathering_context_gps_step (GTask *task);
static gboolean
-enable_location_gathering_context_gps_step_next_cb (GTask *task)
+enable_location_gathering_context_gps_step_schedule_cb (GTask *task)
{
- EnableLocationGatheringContext *ctx;
-
- ctx = (EnableLocationGatheringContext *) g_task_get_task_data (task);
-
- /* We jump to the next step */
- ctx->gps_step++;
+ /* Run the scheduled step */
enable_location_gathering_context_gps_step (task);
-
return G_SOURCE_REMOVE;
}
@@ -582,16 +586,33 @@ enable_sgpsc_or_sgpss_ready (MMBaseModem *self,
GAsyncResult *res,
GTask *task)
{
- GError *error = NULL;
+ EnableLocationGatheringContext *ctx;
+ GError *error = NULL;
+
+ ctx = (EnableLocationGatheringContext *) g_task_get_task_data (task);
if (!mm_base_modem_at_command_finish (self, res, &error)) {
+ /* The GPS setup may sometimes report "+CME ERROR 767" when enabling the
+ * Engine; so we'll run some retries of the same command ourselves. */
+ if (ctx->gps_step == ENABLE_LOCATION_GATHERING_GPS_STEP_SGPSC_ENGINE) {
+ ctx->sgpsc_engine_retries++;
+ mm_dbg ("GPS Engine setup failed (%u/%u)", ctx->sgpsc_engine_retries, MAX_SGPSC_ENGINE_RETRIES);
+ if (ctx->sgpsc_engine_retries < MAX_SGPSC_ENGINE_RETRIES) {
+ g_clear_error (&error);
+ goto schedule;
+ }
+ }
g_task_return_error (task, error);
g_object_unref (task);
return;
}
- /* Cinterion asks for 100ms between GPS commands... */
- g_timeout_add (100, (GSourceFunc) enable_location_gathering_context_gps_step_next_cb, task);
+ /* Go on to next step */
+ ctx->gps_step++;
+
+schedule:
+ g_timeout_add (ctx->gps_step == ENABLE_LOCATION_GATHERING_GPS_STEP_SGPSC_ENGINE ? GPS_COMMAND_TIMEOUT_ENGINE_MS : GPS_COMMAND_TIMEOUT_DEFAULT_MS,
+ (GSourceFunc) enable_location_gathering_context_gps_step_schedule_cb, task);
}
static void
--
2.12.2
More information about the ModemManager-devel
mailing list