From 75570e45dac524e9720c653d0b9f46a4eead2268 Mon Sep 17 00:00:00 2001 From: Dylan Van Assche Date: Wed, 11 Aug 2021 17:09:26 +0200 Subject: [PATCH 1/2] gpio: extend softsleep wake time 50ms is way to short for the Quectel firmware to react, increase to 200ms --- src/gpio.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gpio.c b/src/gpio.c index 617b69e..aae9b94 100644 --- a/src/gpio.c +++ b/src/gpio.c @@ -73,8 +73,8 @@ int gpio_sequence_wake(struct EG25Manager *manager) { gpiod_line_set_value(manager->gpio_out[GPIO_OUT_DTR], 0); - /* Give the modem 5ms to wake from soft sleep */ - usleep(5000); + /* Give the modem 200ms to wake from soft sleep */ + usleep(200000); g_message("Executed soft wake sequence"); From ef94492b30c01fa9778216ce8d5f130ba6df064e Mon Sep 17 00:00:00 2001 From: Dylan Van Assche Date: Wed, 11 Aug 2021 17:11:01 +0200 Subject: [PATCH 2/2] gnss: handle locked SIM ModemManager Location service is only available after SIM unlock and network registration. Track service separately to avoid an assert error and crashes. GNSS assistance data is uploaded when the service becomes available. --- src/gnss.c | 16 +++++++++++++--- src/gnss.h | 2 +- src/mm-iface.c | 16 +++++++++++++--- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/gnss.c b/src/gnss.c index d986be0..aeb73af 100644 --- a/src/gnss.c +++ b/src/gnss.c @@ -14,20 +14,30 @@ static void gnss_step(struct EG25Manager *manager); -void gnss_upload_assistance_data(struct EG25Manager *manager) +gboolean gnss_upload_assistance_data(struct EG25Manager *manager) { if (!manager->gnss_assistance_enabled) { g_message("GNSS assistance is disabled!"); - return; + return FALSE; } if (manager->gnss_assistance_step < EG25_GNSS_STEP_LAST) { g_warning("GNSS assistance data upload already in process (%d/%d)", manager->gnss_assistance_step, EG25_GNSS_STEP_LAST); - return; + return FALSE; } + + /* ModemManager's Location is only available after unlocking */ + if(!manager->mm_location) { + g_message ("Rescheduling upload since Location interface is not available, in %ds", + RESCHEDULE_IN_SECS); + manager->gnss_assistance_step = EG25_GNSS_STEP_LAST; + return TRUE; + } + manager->gnss_assistance_step = EG25_GNSS_STEP_FIRST; gnss_step(manager); + return FALSE; } void gnss_init(struct EG25Manager *manager, toml_table_t *config) diff --git a/src/gnss.h b/src/gnss.h index 931ab8b..1b49403 100644 --- a/src/gnss.h +++ b/src/gnss.h @@ -13,4 +13,4 @@ void gnss_init(struct EG25Manager *manager, toml_table_t *config); void gnss_destroy(struct EG25Manager *manager); -void gnss_upload_assistance_data(struct EG25Manager *manager); +gboolean gnss_upload_assistance_data(struct EG25Manager *manager); diff --git a/src/mm-iface.c b/src/mm-iface.c index 2bbdfe5..577a718 100644 --- a/src/mm-iface.c +++ b/src/mm-iface.c @@ -32,10 +32,7 @@ static void add_modem(struct EG25Manager *manager, GDBusObject *object) g_assert(MM_IS_OBJECT (object)); manager->mm_modem = mm_object_get_modem(MM_OBJECT(object)); - manager->mm_location = mm_object_get_modem_location(MM_OBJECT(object)); g_assert_nonnull(manager->mm_modem); - g_assert_nonnull(manager->mm_location); - if (manager->modem_state == EG25_STATE_RESUMING) { if (manager->modem_recovery_timer) { @@ -63,6 +60,16 @@ static void add_modem(struct EG25Manager *manager, GDBusObject *object) g_signal_connect(gdbus_modem, "state-changed", G_CALLBACK(state_changed_cb), manager); } +static void add_modem_location(struct EG25Manager *manager, GDBusObject *object) +{ + const gchar *path; + + path = g_dbus_object_get_object_path(object); + g_message("Adding new modem with location capabilities `%s'", path); + manager->mm_location = mm_object_get_modem_location(MM_OBJECT(object)); + g_assert_nonnull(manager->mm_location); +} + static void interface_added_cb (struct EG25Manager *manager, GDBusObject *object, GDBusInterface *interface) @@ -75,6 +82,9 @@ static void interface_added_cb (struct EG25Manager *manager, if (g_strcmp0(info->name, MM_DBUS_INTERFACE_MODEM) == 0) add_modem(manager, object); + + if (g_strcmp0(info->name, MM_DBUS_INTERFACE_MODEM_LOCATION) == 0) + add_modem_location(manager, object); }