aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Van Assche <me@dylanvanassche.be>2021-03-16 19:28:09 +0100
committerAleksander Morgado <aleksander@aleksander.es>2021-03-21 10:01:52 +0000
commit192e067f97153125fe9d3362c750146a5a7215cf (patch)
tree9530a269ee034a8cb257b51b417c11740555d163
parentdbb3825984956a77df5d27dc6957cc623620a0b4 (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.c10
-rw-r--r--plugins/quectel/mm-broadband-modem-quectel.c10
-rw-r--r--plugins/quectel/mm-shared-quectel.c48
-rw-r--r--plugins/quectel/mm-shared-quectel.h7
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);