diff options
author | Dylan Van Assche <me@dylanvanassche.be> | 2021-03-16 19:28:09 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-03-21 10:01:52 +0000 |
commit | 192e067f97153125fe9d3362c750146a5a7215cf (patch) | |
tree | 9530a269ee034a8cb257b51b417c11740555d163 | |
parent | dbb3825984956a77df5d27dc6957cc623620a0b4 (diff) |
quectel: ignore QGPSURC
QGPSURCs are not ignored and causes calls to be rejected in some cases
-rw-r--r-- | plugins/quectel/mm-broadband-modem-qmi-quectel.c | 10 | ||||
-rw-r--r-- | plugins/quectel/mm-broadband-modem-quectel.c | 10 | ||||
-rw-r--r-- | plugins/quectel/mm-shared-quectel.c | 48 | ||||
-rw-r--r-- | plugins/quectel/mm-shared-quectel.h | 7 |
4 files changed, 72 insertions, 3 deletions
diff --git a/plugins/quectel/mm-broadband-modem-qmi-quectel.c b/plugins/quectel/mm-broadband-modem-qmi-quectel.c index a6bc114e..85d3c27b 100644 --- a/plugins/quectel/mm-broadband-modem-qmi-quectel.c +++ b/plugins/quectel/mm-broadband-modem-qmi-quectel.c @@ -78,6 +78,12 @@ peek_parent_modem_interface (MMSharedQuectel *self) return iface_modem_parent; } +static MMBroadbandModemClass * +peek_parent_broadband_modem_class (MMSharedQuectel *self) +{ + return MM_BROADBAND_MODEM_CLASS (mm_broadband_modem_qmi_quectel_parent_class); +} + static void iface_modem_firmware_init (MMIfaceModemFirmware *iface) { @@ -116,9 +122,13 @@ shared_quectel_init (MMSharedQuectel *iface) { iface->peek_parent_modem_interface = peek_parent_modem_interface; iface->peek_parent_modem_location_interface = peek_parent_modem_location_interface; + iface->peek_parent_broadband_modem_class = peek_parent_broadband_modem_class; } static void mm_broadband_modem_qmi_quectel_class_init (MMBroadbandModemQmiQuectelClass *klass) { + MMBroadbandModemClass *broadband_modem_class = MM_BROADBAND_MODEM_CLASS (klass); + + broadband_modem_class->setup_ports = mm_shared_quectel_setup_ports; } diff --git a/plugins/quectel/mm-broadband-modem-quectel.c b/plugins/quectel/mm-broadband-modem-quectel.c index 795ce410..53916bf7 100644 --- a/plugins/quectel/mm-broadband-modem-quectel.c +++ b/plugins/quectel/mm-broadband-modem-quectel.c @@ -78,6 +78,12 @@ peek_parent_modem_interface (MMSharedQuectel *self) return iface_modem_parent; } +static MMBroadbandModemClass * +peek_parent_broadband_modem_class (MMSharedQuectel *self) +{ + return MM_BROADBAND_MODEM_CLASS (mm_broadband_modem_quectel_parent_class); +} + static void iface_modem_firmware_init (MMIfaceModemFirmware *iface) { @@ -116,9 +122,13 @@ shared_quectel_init (MMSharedQuectel *iface) { iface->peek_parent_modem_interface = peek_parent_modem_interface; iface->peek_parent_modem_location_interface = peek_parent_modem_location_interface; + iface->peek_parent_broadband_modem_class = peek_parent_broadband_modem_class; } static void mm_broadband_modem_quectel_class_init (MMBroadbandModemQuectelClass *klass) { + MMBroadbandModemClass *broadband_modem_class = MM_BROADBAND_MODEM_CLASS (klass); + + broadband_modem_class->setup_ports = mm_shared_quectel_setup_ports; } diff --git a/plugins/quectel/mm-shared-quectel.c b/plugins/quectel/mm-shared-quectel.c index 0274fbe1..61373db6 100644 --- a/plugins/quectel/mm-shared-quectel.c +++ b/plugins/quectel/mm-shared-quectel.c @@ -43,13 +43,22 @@ typedef enum { } FeatureSupport; typedef struct { + MMBroadbandModemClass *broadband_modem_class_parent; MMIfaceModem *iface_modem_parent; MMIfaceModemLocation *iface_modem_location_parent; MMModemLocationSource provided_sources; MMModemLocationSource enabled_sources; FeatureSupport qgps_supported; + GRegex *qgpsurc_regex; } Private; +static void +private_free (Private *priv) +{ + g_regex_unref (priv->qgpsurc_regex); + g_slice_free (Private, priv); +} + static Private * get_private (MMSharedQuectel *self) { @@ -65,6 +74,10 @@ get_private (MMSharedQuectel *self) priv->provided_sources = MM_MODEM_LOCATION_SOURCE_NONE; priv->enabled_sources = MM_MODEM_LOCATION_SOURCE_NONE; priv->qgps_supported = FEATURE_SUPPORT_UNKNOWN; + priv->qgpsurc_regex = g_regex_new ("\\r\\n\\+QGPSURC:.*", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); + + g_assert (MM_SHARED_QUECTEL_GET_INTERFACE (self)->peek_parent_broadband_modem_class); + priv->broadband_modem_class_parent = MM_SHARED_QUECTEL_GET_INTERFACE (self)->peek_parent_broadband_modem_class (self); g_assert (MM_SHARED_QUECTEL_GET_INTERFACE (self)->peek_parent_modem_location_interface); priv->iface_modem_location_parent = MM_SHARED_QUECTEL_GET_INTERFACE (self)->peek_parent_modem_location_interface (self); @@ -72,12 +85,45 @@ get_private (MMSharedQuectel *self) g_assert (MM_SHARED_QUECTEL_GET_INTERFACE (self)->peek_parent_modem_interface); priv->iface_modem_parent = MM_SHARED_QUECTEL_GET_INTERFACE (self)->peek_parent_modem_interface (self); - g_object_set_qdata (G_OBJECT (self), private_quark, priv); + g_object_set_qdata_full (G_OBJECT (self), private_quark, priv, (GDestroyNotify)private_free); } return priv; } /*****************************************************************************/ +/* Setup ports (Broadband modem class) */ + +void +mm_shared_quectel_setup_ports (MMBroadbandModem *self) +{ + Private *priv; + MMPortSerialAt *ports[2]; + guint i; + + priv = get_private (MM_SHARED_QUECTEL (self)); + g_assert (priv->broadband_modem_class_parent); + g_assert (priv->broadband_modem_class_parent->setup_ports); + + /* Parent setup always first */ + priv->broadband_modem_class_parent->setup_ports (self); + + ports[0] = mm_base_modem_peek_port_primary (MM_BASE_MODEM (self)); + ports[1] = mm_base_modem_peek_port_secondary (MM_BASE_MODEM (self)); + + /* Enable/disable unsolicited events in given port */ + for (i = 0; i < G_N_ELEMENTS (ports); i++) { + if (!ports[i]) + continue; + + /* Ignore +QGPSURC */ + mm_port_serial_at_add_unsolicited_msg_handler ( + ports[i], + priv->qgpsurc_regex, + NULL, NULL, NULL); + } +} + +/*****************************************************************************/ /* Firmware update settings loading (Firmware interface) */ MMFirmwareUpdateSettings * diff --git a/plugins/quectel/mm-shared-quectel.h b/plugins/quectel/mm-shared-quectel.h index 1a49c29b..f9266c06 100644 --- a/plugins/quectel/mm-shared-quectel.h +++ b/plugins/quectel/mm-shared-quectel.h @@ -37,12 +37,15 @@ typedef struct _MMSharedQuectel MMSharedQuectel; struct _MMSharedQuectel { GTypeInterface g_iface; - MMIfaceModem * (* peek_parent_modem_interface) (MMSharedQuectel *self); - MMIfaceModemLocation * (* peek_parent_modem_location_interface) (MMSharedQuectel *self); + MMBroadbandModemClass * (* peek_parent_broadband_modem_class) (MMSharedQuectel *self); + MMIfaceModem * (* peek_parent_modem_interface) (MMSharedQuectel *self); + MMIfaceModemLocation * (* peek_parent_modem_location_interface) (MMSharedQuectel *self); }; GType mm_shared_quectel_get_type (void); +void mm_shared_quectel_setup_ports (MMBroadbandModem *self); + void mm_shared_quectel_firmware_load_update_settings (MMIfaceModemFirmware *self, GAsyncReadyCallback callback, gpointer user_data); |