diff options
-rw-r--r-- | plugins/cinterion/mm-broadband-modem-cinterion.c | 340 |
1 files changed, 170 insertions, 170 deletions
diff --git a/plugins/cinterion/mm-broadband-modem-cinterion.c b/plugins/cinterion/mm-broadband-modem-cinterion.c index 1453581e..6ad44725 100644 --- a/plugins/cinterion/mm-broadband-modem-cinterion.c +++ b/plugins/cinterion/mm-broadband-modem-cinterion.c @@ -112,13 +112,136 @@ struct _MMBroadbandModemCinterionPrivate { MMBaseModemAtCommandAlloc *cmds; }; +/*****************************************************************************/ + MMCinterionModemFamily -mm_broadband_modem_cinterion_get_family (MMBroadbandModemCinterion * modem) +mm_broadband_modem_cinterion_get_family (MMBroadbandModemCinterion *self) +{ + return self->priv->modem_family; +} + +/*****************************************************************************/ +/* Check support (Signal interface) */ + +static gboolean +signal_check_support_finish (MMIfaceModemSignal *self, + GAsyncResult *res, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (res), error); +} + +static void +parent_signal_check_support_ready (MMIfaceModemSignal *self, + GAsyncResult *res, + GTask *task) +{ + GError *error = NULL; + + if (!iface_modem_signal_parent->check_support_finish (self, res, &error)) + g_task_return_error (task, error); + else + g_task_return_boolean (task, TRUE); + g_object_unref (task); +} + +static void +check_smoni_support (MMBaseModem *_self, + GAsyncResult *res, + GTask *task) +{ + MMBroadbandModemCinterion *self = MM_BROADBAND_MODEM_CINTERION (_self); + + /* Fetch the result to the SMONI test. If no response given (error triggered), assume unsupported */ + if (mm_base_modem_at_command_finish (_self, res, NULL)) { + mm_obj_dbg (self, "SMONI supported"); + self->priv->smoni_support = FEATURE_SUPPORTED; + g_task_return_boolean (task, TRUE); + g_object_unref (task); + return; + } + + mm_obj_dbg (self, "SMONI unsupported"); + self->priv->smoni_support = FEATURE_NOT_SUPPORTED; + + /* Otherwise, check if the parent CESQ-based implementation works */ + g_assert (iface_modem_signal_parent->check_support && iface_modem_signal_parent->check_support_finish); + iface_modem_signal_parent->check_support (MM_IFACE_MODEM_SIGNAL (self), + (GAsyncReadyCallback) parent_signal_check_support_ready, + task); +} + +static void +signal_check_support (MMIfaceModemSignal *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (self, NULL, callback, user_data); + mm_base_modem_at_command (MM_BASE_MODEM (self), + "^SMONI=?", + 3, + TRUE, + (GAsyncReadyCallback) check_smoni_support, + task); +} + +/*****************************************************************************/ +/* Load extended signal information (Signal interface) */ + +static gboolean +signal_load_values_finish (MMIfaceModemSignal *_self, + GAsyncResult *res, + MMSignal **cdma, + MMSignal **evdo, + MMSignal **gsm, + MMSignal **umts, + MMSignal **lte, + MMSignal **nr5g, + GError **error) { - g_assert_nonnull (modem); - return modem->priv->modem_family; + MMBroadbandModemCinterion *self = MM_BROADBAND_MODEM_CINTERION (_self); + const gchar *response; + + if (self->priv->smoni_support == FEATURE_NOT_SUPPORTED) + return iface_modem_signal_parent->load_values_finish (_self, res, cdma, evdo, gsm, umts, lte, nr5g, error); + + response = mm_base_modem_at_command_finish (MM_BASE_MODEM (_self), res, error); + if (!response || !mm_cinterion_smoni_response_to_signal_info (response, gsm, umts, lte, error)) + return FALSE; + + if (cdma) + *cdma = NULL; + if (evdo) + *evdo = NULL; + if (nr5g) + *nr5g = NULL; + + return TRUE; } +static void +signal_load_values (MMIfaceModemSignal *_self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + MMBroadbandModemCinterion *self = MM_BROADBAND_MODEM_CINTERION (_self); + + if (self->priv->smoni_support == FEATURE_SUPPORTED) { + mm_base_modem_at_command (MM_BASE_MODEM (self), + "^SMONI", + 3, + FALSE, + callback, + user_data); + return; + } + + /* ^SMONI not supported, fallback to the parent */ + iface_modem_signal_parent->load_values (_self, cancellable, callback, user_data); +} /*****************************************************************************/ /* Enable unsolicited events (SMS indications) (Messaging interface) */ @@ -2690,6 +2813,44 @@ cinterion_modem_create_bearer (MMIfaceModem *_self, /*****************************************************************************/ +static void +setup_ports (MMBroadbandModem *_self) +{ + MMBroadbandModemCinterion *self = (MM_BROADBAND_MODEM_CINTERION (_self)); + MMPortSerialAt *port; + + /* Call parent's setup ports first always */ + MM_BROADBAND_MODEM_CLASS (mm_broadband_modem_cinterion_parent_class)->setup_ports (_self); + + /* Primary */ + port = mm_base_modem_get_port_primary (MM_BASE_MODEM (self)); + if (port) { + mm_port_serial_at_add_unsolicited_msg_handler ( + port, + self->priv->sysstart_regex, + NULL, NULL, NULL); + mm_port_serial_at_add_unsolicited_msg_handler ( + port, + self->priv->scks_regex, + NULL, NULL, NULL); + } + + /* Secondary */ + port = mm_base_modem_get_port_secondary (MM_BASE_MODEM (self)); + if (port) { + mm_port_serial_at_add_unsolicited_msg_handler ( + port, + self->priv->sysstart_regex, + NULL, NULL, NULL); + mm_port_serial_at_add_unsolicited_msg_handler ( + port, + self->priv->scks_regex, + NULL, NULL, NULL); + } +} + +/*****************************************************************************/ + MMBroadbandModemCinterion * mm_broadband_modem_cinterion_new (const gchar *device, const gchar **drivers, @@ -2894,41 +3055,14 @@ shared_cinterion_init (MMSharedCinterion *iface) } static void -setup_ports (MMBroadbandModem *_self) +iface_modem_signal_init (MMIfaceModemSignal *iface) { - MMBroadbandModemCinterion *self = (MM_BROADBAND_MODEM_CINTERION (_self)); - MMPortSerialAt *port; - - /* Call parent's setup ports first always */ - MM_BROADBAND_MODEM_CLASS (mm_broadband_modem_cinterion_parent_class)->setup_ports (_self); - - /* Primary */ - port = mm_base_modem_get_port_primary (MM_BASE_MODEM (self)); - if (port) { - mm_port_serial_at_add_unsolicited_msg_handler ( - port, - self->priv->sysstart_regex, - NULL, NULL, NULL); - - mm_port_serial_at_add_unsolicited_msg_handler ( - port, - self->priv->scks_regex, - NULL, NULL, NULL); - } - - /* Secondary */ - port = mm_base_modem_get_port_secondary (MM_BASE_MODEM (self)); - if (port) { - mm_port_serial_at_add_unsolicited_msg_handler ( - port, - self->priv->sysstart_regex, - NULL, NULL, NULL); + iface_modem_signal_parent = g_type_interface_peek_parent (iface); - mm_port_serial_at_add_unsolicited_msg_handler ( - port, - self->priv->scks_regex, - NULL, NULL, NULL); - } + iface->check_support = signal_check_support; + iface->check_support_finish = signal_check_support_finish; + iface->load_values = signal_load_values; + iface->load_values_finish = signal_load_values_finish; } static void @@ -2943,137 +3077,3 @@ mm_broadband_modem_cinterion_class_init (MMBroadbandModemCinterionClass *klass) object_class->finalize = finalize; broadband_modem_class->setup_ports = setup_ports; } - -/*****************************************************************************/ -/* Check support (Signal interface) */ - -static gboolean -signal_check_support_finish (MMIfaceModemSignal *self, - GAsyncResult *res, - GError **error) -{ - return g_task_propagate_boolean (G_TASK (res), error); -} - -static void -parent_signal_check_support_ready (MMIfaceModemSignal *self, - GAsyncResult *res, - GTask *task) -{ - GError *error = NULL; - - if (!iface_modem_signal_parent->check_support_finish (self, res, &error)) - g_task_return_error (task, error); - else - g_task_return_boolean (task, TRUE); - g_object_unref (task); -} - -static void -check_smoni_support (MMBaseModem *_self, - GAsyncResult *res, - GTask *task) -{ - MMBroadbandModemCinterion *self = MM_BROADBAND_MODEM_CINTERION (_self); - - /* Fetch the result to the SMONI test. If no response given (error triggered), assume unsupported */ - if (mm_base_modem_at_command_finish (_self, res, NULL)) { - mm_obj_dbg (self, "SMONI supported"); - self->priv->smoni_support = FEATURE_SUPPORTED; - g_task_return_boolean (task, TRUE); - g_object_unref (task); - return; - } - - mm_obj_dbg (self, "SMONI unsupported"); - self->priv->smoni_support = FEATURE_NOT_SUPPORTED; - - /* Otherwise, check if the parent CESQ-based implementation works */ - g_assert (iface_modem_signal_parent->check_support && iface_modem_signal_parent->check_support_finish); - iface_modem_signal_parent->check_support (MM_IFACE_MODEM_SIGNAL (self), - (GAsyncReadyCallback) parent_signal_check_support_ready, - task); -} - -static void -signal_check_support (MMIfaceModemSignal *self, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GTask *task; - - task = g_task_new (self, NULL, callback, user_data); - mm_base_modem_at_command (MM_BASE_MODEM (self), - "^SMONI=?", - 3, - TRUE, - (GAsyncReadyCallback) check_smoni_support, - task); -} - -/*****************************************************************************/ -/* Load extended signal information (Signal interface) */ - -static gboolean -signal_load_values_finish (MMIfaceModemSignal *_self, - GAsyncResult *res, - MMSignal **cdma, - MMSignal **evdo, - MMSignal **gsm, - MMSignal **umts, - MMSignal **lte, - MMSignal **nr5g, - GError **error) -{ - MMBroadbandModemCinterion *self = MM_BROADBAND_MODEM_CINTERION (_self); - const gchar *response; - - if (self->priv->smoni_support == FEATURE_NOT_SUPPORTED) - return iface_modem_signal_parent->load_values_finish (_self, res, cdma, evdo, gsm, umts, lte, nr5g, error); - - response = mm_base_modem_at_command_finish (MM_BASE_MODEM (_self), res, error); - if (!response || !mm_cinterion_smoni_response_to_signal_info (response, gsm, umts, lte, error)) - return FALSE; - - if (cdma) - *cdma = NULL; - if (evdo) - *evdo = NULL; - if (nr5g) - *nr5g = NULL; - - return TRUE; -} - -static void -signal_load_values (MMIfaceModemSignal *_self, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - MMBroadbandModemCinterion *self = MM_BROADBAND_MODEM_CINTERION (_self); - - if (self->priv->smoni_support == FEATURE_SUPPORTED) { - mm_base_modem_at_command (MM_BASE_MODEM (self), - "^SMONI", - 3, - FALSE, - callback, - user_data); - return; - } - - /* ^SMONI not supported, fallback to the parent */ - iface_modem_signal_parent->load_values (_self, cancellable, callback, user_data); -} - -static void -iface_modem_signal_init (MMIfaceModemSignal *iface) -{ - iface_modem_signal_parent = g_type_interface_peek_parent (iface); - - iface->check_support = signal_check_support; - iface->check_support_finish = signal_check_support_finish; - iface->load_values = signal_load_values; - iface->load_values_finish = signal_load_values_finish; -} |