summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSom_SP <somashekhar.puttagangaiah@intel.com>2021-10-20 22:02:06 +0200
committerAleksander Morgado <aleksander@aleksander.es>2021-10-20 22:09:18 +0200
commit925f0bae11c0b49a464237c5c98921ffd68157e2 (patch)
treef447a01ad00786c06ed16468f416aca000573b57
parent9537261651a4f44fb0d0817bb902b225abb5e5a5 (diff)
libmm-glib,mmcli: add support for the new signal 'SetupThresholds()' API
Includes updates by Aleksander Morgado to fix mostly coding style issues.
-rw-r--r--cli/mmcli-modem-signal.c197
-rw-r--r--cli/mmcli-output.c2
-rw-r--r--cli/mmcli-output.h2
-rw-r--r--docs/reference/libmm-glib/libmm-glib-sections.txt5
-rw-r--r--libmm-glib/mm-modem-signal.c163
-rw-r--r--libmm-glib/mm-modem-signal.h53
6 files changed, 360 insertions, 62 deletions
diff --git a/cli/mmcli-modem-signal.c b/cli/mmcli-modem-signal.c
index 1b9b0e49..5237938a 100644
--- a/cli/mmcli-modem-signal.c
+++ b/cli/mmcli-modem-signal.c
@@ -47,14 +47,19 @@ static Context *ctx;
/* Options */
static gboolean get_flag;
static gchar *setup_str;
+static gchar *setup_thresholds_str;
static GOptionEntry entries[] = {
{ "signal-setup", 0, 0, G_OPTION_ARG_STRING, &setup_str,
- "Setup extended signal information retrieval",
+ "Setup signal quality information polling, in seconds",
"[Rate]"
},
+ { "signal-setup-thresholds", 0, 0, G_OPTION_ARG_STRING, &setup_thresholds_str,
+ "Setup signal quality information thresholds (allowed keys: rssi-threshold, error-rate-threshold)",
+ "[\"key=value,...\"]"
+ },
{ "signal-get", 0, 0, G_OPTION_ARG_NONE, &get_flag,
- "Get all extended signal quality information",
+ "Get all signal quality information",
NULL
},
{ NULL }
@@ -85,6 +90,7 @@ mmcli_modem_signal_options_enabled (void)
return !!n_actions;
n_actions = (!!setup_str +
+ !!setup_thresholds_str +
get_flag);
if (n_actions > 1) {
@@ -139,6 +145,8 @@ print_signal_info (void)
MMSignal *signal;
gdouble value;
gchar *refresh_rate;
+ gchar *rssi_threshold;
+ gchar *error_rate_threshold;
gchar *cdma1x_rssi = NULL;
gchar *cdma1x_ecio = NULL;
gchar *cdma1x_error_rate = NULL;
@@ -163,7 +171,9 @@ print_signal_info (void)
gchar *nr5g_snr = NULL;
gchar *nr5g_error_rate = NULL;
- refresh_rate = g_strdup_printf ("%u", mm_modem_signal_get_rate (ctx->modem_signal));
+ refresh_rate = g_strdup_printf ("%u", mm_modem_signal_get_rate (ctx->modem_signal));
+ rssi_threshold = g_strdup_printf ("%u", mm_modem_signal_get_rssi_threshold (ctx->modem_signal));
+ error_rate_threshold = g_strdup_printf ("%s", mm_modem_signal_get_error_rate_threshold (ctx->modem_signal) ? "yes" : "no");
signal = mm_modem_signal_peek_cdma (ctx->modem_signal);
if (signal) {
@@ -235,33 +245,126 @@ print_signal_info (void)
nr5g_error_rate = g_strdup_printf ("%.2lf", value);
}
- mmcli_output_string_take_typed (MMC_F_SIGNAL_REFRESH_RATE, refresh_rate, "seconds");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_CDMA1X_RSSI, cdma1x_rssi, "dBm");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_CDMA1X_ECIO, cdma1x_ecio, "dBm");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_CDMA1X_ERROR_RATE, cdma1x_error_rate, "%%");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_EVDO_RSSI, evdo_rssi, "dBm");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_EVDO_ECIO, evdo_ecio, "dB");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_EVDO_SINR, evdo_sinr, "dB");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_EVDO_IO, evdo_io, "dBm");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_EVDO_ERROR_RATE, evdo_error_rate, "%%");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_GSM_RSSI, gsm_rssi, "dBm");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_GSM_ERROR_RATE, gsm_error_rate, "%%");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_UMTS_RSSI, umts_rssi, "dBm");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_UMTS_RSCP, umts_rscp, "dBm");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_UMTS_ECIO, umts_ecio, "dB");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_UMTS_ERROR_RATE, umts_error_rate, "%%");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_LTE_RSSI, lte_rssi, "dBm");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_LTE_RSRQ, lte_rsrq, "dB");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_LTE_RSRP, lte_rsrp, "dBm");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_LTE_SNR, lte_snr, "dB");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_LTE_ERROR_RATE, lte_error_rate, "%%");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_5G_RSRQ, nr5g_rsrq, "dB");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_5G_RSRP, nr5g_rsrp, "dBm");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_5G_SNR, nr5g_snr, "dB");
- mmcli_output_string_take_typed (MMC_F_SIGNAL_5G_ERROR_RATE, nr5g_error_rate, "%%");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_REFRESH_RATE, refresh_rate, "seconds");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_RSSI_THRESHOLD, rssi_threshold, "dBm");
+ mmcli_output_string_take (MMC_F_SIGNAL_ERROR_RATE_THRESHOLD, error_rate_threshold);
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_CDMA1X_RSSI, cdma1x_rssi, "dBm");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_CDMA1X_ECIO, cdma1x_ecio, "dBm");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_CDMA1X_ERROR_RATE, cdma1x_error_rate, "%%");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_EVDO_RSSI, evdo_rssi, "dBm");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_EVDO_ECIO, evdo_ecio, "dB");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_EVDO_SINR, evdo_sinr, "dB");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_EVDO_IO, evdo_io, "dBm");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_EVDO_ERROR_RATE, evdo_error_rate, "%%");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_GSM_RSSI, gsm_rssi, "dBm");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_GSM_ERROR_RATE, gsm_error_rate, "%%");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_UMTS_RSSI, umts_rssi, "dBm");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_UMTS_RSCP, umts_rscp, "dBm");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_UMTS_ECIO, umts_ecio, "dB");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_UMTS_ERROR_RATE, umts_error_rate, "%%");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_LTE_RSSI, lte_rssi, "dBm");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_LTE_RSRQ, lte_rsrq, "dB");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_LTE_RSRP, lte_rsrp, "dBm");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_LTE_SNR, lte_snr, "dB");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_LTE_ERROR_RATE, lte_error_rate, "%%");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_5G_RSRQ, nr5g_rsrq, "dB");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_5G_RSRP, nr5g_rsrp, "dBm");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_5G_SNR, nr5g_snr, "dB");
+ mmcli_output_string_take_typed (MMC_F_SIGNAL_5G_ERROR_RATE, nr5g_error_rate, "%%");
mmcli_output_dump ();
}
+typedef struct {
+ guint rssi_threshold;
+ gboolean rssi_set;
+ gboolean error_rate_threshold;
+ gboolean error_rate_set;
+ GError *error;
+} ParseKeyValueContext;
+
+static gboolean
+key_value_foreach (const gchar *key,
+ const gchar *value,
+ ParseKeyValueContext *parse_ctx)
+{
+ if (g_str_equal (key, "rssi-threshold")) {
+ if (!mm_get_uint_from_str (value, &parse_ctx->rssi_threshold)) {
+ g_set_error (&parse_ctx->error, MM_CORE_ERROR, MM_CORE_ERROR_INVALID_ARGS,
+ "invalid RSSI threshold value given: %s", value);
+ return FALSE;
+ }
+ parse_ctx->rssi_set = TRUE;
+ } else if (g_str_equal (key, "error-rate-threshold")) {
+ parse_ctx->error_rate_threshold = mm_common_get_boolean_from_string (value, &parse_ctx->error);
+ if (parse_ctx->error)
+ return FALSE;
+ parse_ctx->error_rate_set = TRUE;
+ } else {
+ g_set_error (&parse_ctx->error, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED,
+ "Invalid properties string, unsupported key '%s'", key);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static GVariant *
+setup_thresholds_build_input (const gchar *str)
+{
+ ParseKeyValueContext parse_ctx = { 0 };
+ GVariantBuilder builder;
+
+ mm_common_parse_key_value_string (setup_thresholds_str,
+ &parse_ctx.error,
+ (MMParseKeyValueForeachFn)key_value_foreach,
+ &parse_ctx);
+ /* If error, destroy the object */
+ if (parse_ctx.error) {
+ return NULL;
+ }
+
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+
+ if (parse_ctx.rssi_set)
+ g_variant_builder_add (&builder,
+ "{sv}",
+ "rssi-threshold",
+ g_variant_new_uint32 (parse_ctx.rssi_threshold));
+
+ if (parse_ctx.error_rate_set)
+ g_variant_builder_add (&builder,
+ "{sv}",
+ "error-rate-threshold",
+ g_variant_new_boolean (parse_ctx.error_rate_threshold));
+
+ return g_variant_ref_sink (g_variant_builder_end (&builder));
+}
+
+static void
+setup_thresholds_process_reply (gboolean result,
+ const GError *error)
+{
+ if (!result) {
+ g_printerr ("error: couldn't setup signal quality information thresholds: '%s'\n",
+ error ? error->message : "unknown error");
+ exit (EXIT_FAILURE);
+ }
+
+ g_print ("Successfully setup signal quality information thresholds\n");
+}
+
+static void
+setup_thresholds_ready (MMModemSignal *modem,
+ GAsyncResult *result)
+{
+ gboolean res;
+ GError *error = NULL;
+
+ res = mm_modem_signal_setup_thresholds_finish (modem, result, &error);
+ setup_thresholds_process_reply (res, error);
+
+ mmcli_async_operation_done ();
+}
+
static void
setup_process_reply (gboolean result,
const GError *error)
@@ -322,6 +425,25 @@ get_modem_ready (GObject *source,
return;
}
+ /* Request to setup threshold? */
+ if (setup_thresholds_str) {
+ g_autoptr(GVariant) dictionary = NULL;
+
+ dictionary = setup_thresholds_build_input (setup_thresholds_str);
+ if (!dictionary) {
+ g_printerr ("error: failed to parse input threshold setup settings: '%s'", setup_thresholds_str);
+ exit (EXIT_FAILURE);
+ }
+
+ g_debug ("Asynchronously setting up threshold values...");
+ mm_modem_signal_setup_thresholds (ctx->modem_signal,
+ dictionary,
+ ctx->cancellable,
+ (GAsyncReadyCallback)setup_thresholds_ready,
+ NULL);
+ return;
+ }
+
g_warn_if_reached ();
}
@@ -368,7 +490,7 @@ mmcli_modem_signal_run_synchronous (GDBusConnection *connection)
/* Request to set rate? */
if (setup_str) {
- guint rate;
+ guint rate;
gboolean result;
if (!mm_get_uint_from_str (setup_str, &rate)) {
@@ -385,6 +507,25 @@ mmcli_modem_signal_run_synchronous (GDBusConnection *connection)
return;
}
+ /* Request to setup threshold? */
+ if (setup_thresholds_str) {
+ g_autoptr(GVariant) dictionary = NULL;
+ gboolean result;
+
+ dictionary = setup_thresholds_build_input (setup_thresholds_str);
+ if (!dictionary) {
+ g_printerr ("error: failed to parse input threshold setup settings: '%s'", setup_thresholds_str);
+ exit (EXIT_FAILURE);
+ }
+
+ g_debug ("Asynchronously setting up threshold values...");
+ result = mm_modem_signal_setup_thresholds_sync (ctx->modem_signal,
+ dictionary,
+ NULL,
+ &error);
+ setup_thresholds_process_reply (result, error);
+ return;
+ }
g_warn_if_reached ();
}
diff --git a/cli/mmcli-output.c b/cli/mmcli-output.c
index 947b4074..c681d936 100644
--- a/cli/mmcli-output.c
+++ b/cli/mmcli-output.c
@@ -162,6 +162,8 @@ static FieldInfo field_infos[] = {
[MMC_F_MESSAGING_SUPPORTED_STORAGES] = { "modem.messaging.supported-storages", "supported storages", MMC_S_MODEM_MESSAGING, },
[MMC_F_MESSAGING_DEFAULT_STORAGES] = { "modem.messaging.default-storages", "default storages", MMC_S_MODEM_MESSAGING, },
[MMC_F_SIGNAL_REFRESH_RATE] = { "modem.signal.refresh.rate", "refresh rate", MMC_S_MODEM_SIGNAL, },
+ [MMC_F_SIGNAL_RSSI_THRESHOLD] = { "modem.signal.threshold.rssi", "rssi threshold", MMC_S_MODEM_SIGNAL, },
+ [MMC_F_SIGNAL_ERROR_RATE_THRESHOLD] = { "modem.signal.threshold.error-rate", "error rate threshold", MMC_S_MODEM_SIGNAL, },
[MMC_F_SIGNAL_CDMA1X_RSSI] = { "modem.signal.cdma1x.rssi", "rssi", MMC_S_MODEM_SIGNAL_CDMA1X, },
[MMC_F_SIGNAL_CDMA1X_ECIO] = { "modem.signal.cdma1x.ecio", "ecio", MMC_S_MODEM_SIGNAL_CDMA1X, },
[MMC_F_SIGNAL_CDMA1X_ERROR_RATE] = { "modem.signal.cdma1x.error-rate", "error rate", MMC_S_MODEM_SIGNAL_CDMA1X, },
diff --git a/cli/mmcli-output.h b/cli/mmcli-output.h
index 6fe045f4..5416e825 100644
--- a/cli/mmcli-output.h
+++ b/cli/mmcli-output.h
@@ -173,6 +173,8 @@ typedef enum {
MMC_F_MESSAGING_DEFAULT_STORAGES,
/* Signal section */
MMC_F_SIGNAL_REFRESH_RATE,
+ MMC_F_SIGNAL_RSSI_THRESHOLD,
+ MMC_F_SIGNAL_ERROR_RATE_THRESHOLD,
MMC_F_SIGNAL_CDMA1X_RSSI,
MMC_F_SIGNAL_CDMA1X_ECIO,
MMC_F_SIGNAL_CDMA1X_ERROR_RATE,
diff --git a/docs/reference/libmm-glib/libmm-glib-sections.txt b/docs/reference/libmm-glib/libmm-glib-sections.txt
index 45d3eb60..3bd7fd8f 100644
--- a/docs/reference/libmm-glib/libmm-glib-sections.txt
+++ b/docs/reference/libmm-glib/libmm-glib-sections.txt
@@ -987,6 +987,8 @@ MMModemSignal
mm_modem_signal_get_path
mm_modem_signal_dup_path
mm_modem_signal_get_rate
+mm_modem_signal_get_rssi_threshold
+mm_modem_signal_get_error_rate_threshold
mm_modem_signal_peek_cdma
mm_modem_signal_get_cdma
mm_modem_signal_peek_evdo
@@ -1003,6 +1005,9 @@ mm_modem_signal_get_nr5g
mm_modem_signal_setup
mm_modem_signal_setup_finish
mm_modem_signal_setup_sync
+mm_modem_signal_setup_thresholds
+mm_modem_signal_setup_thresholds_finish
+mm_modem_signal_setup_thresholds_sync
<SUBSECTION Standard>
MMModemSignalPrivate
MMModemSignalClass
diff --git a/libmm-glib/mm-modem-signal.c b/libmm-glib/mm-modem-signal.c
index 4a7574e8..b864c8ff 100644
--- a/libmm-glib/mm-modem-signal.c
+++ b/libmm-glib/mm-modem-signal.c
@@ -19,6 +19,8 @@
*
* Copyright (C) 2012 Google, Inc.
* Copyright (C) 2012 Lanedo GmbH <aleksander@lanedo.com>
+ * Copyright (C) 2013-2021 Aleksander Morgado <aleksander@aleksander.es>
+ * Copyright (C) 2021 Intel Corporation
*/
#include <gio/gio.h>
@@ -116,8 +118,8 @@ mm_modem_signal_dup_path (MMModemSignal *self)
*/
gboolean
mm_modem_signal_setup_finish (MMModemSignal *self,
- GAsyncResult *res,
- GError **error)
+ GAsyncResult *res,
+ GError **error)
{
g_return_val_if_fail (MM_IS_MODEM_SIGNAL (self), FALSE);
@@ -127,13 +129,14 @@ mm_modem_signal_setup_finish (MMModemSignal *self,
/**
* mm_modem_signal_setup:
* @self: A #MMModemSignal.
- * @rate: Rate to use when refreshing signal values.
+ * @rate: Refresh rate to set, in seconds. Use 0 to disable periodic polling.
* @cancellable: (allow-none): A #GCancellable or %NULL.
* @callback: A #GAsyncReadyCallback to call when the request is satisfied or
* %NULL.
* @user_data: User data to pass to @callback.
*
- * Asynchronously setups the extended signal quality retrieval.
+ * Asynchronously enables or disables the extended signal quality information
+ * retrieval via periodic polling.
*
* When the operation is finished, @callback will be invoked in the
* <link linkend="g-main-context-push-thread-default">thread-default main loop</link>
@@ -146,11 +149,11 @@ mm_modem_signal_setup_finish (MMModemSignal *self,
* Since: 1.2
*/
void
-mm_modem_signal_setup (MMModemSignal *self,
- guint rate,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
+mm_modem_signal_setup (MMModemSignal *self,
+ guint rate,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
g_return_if_fail (MM_IS_MODEM_SIGNAL (self));
@@ -160,11 +163,12 @@ mm_modem_signal_setup (MMModemSignal *self,
/**
* mm_modem_signal_setup_sync:
* @self: A #MMModemSignal.
- * @rate: Rate to use when refreshing signal values.
+ * @rate: Refresh rate to set, in seconds. Use 0 to disable periodic polling.
* @cancellable: (allow-none): A #GCancellable or %NULL.
* @error: Return location for error or %NULL.
*
- * Synchronously setups the extended signal quality retrieval.
+ * Synchronously enables or disables the extended signal quality information
+ * retrieval via periodic polling.
*
* The calling thread is blocked until a reply is received. See
* mm_modem_signal_setup() for the asynchronous version of this method.
@@ -174,10 +178,10 @@ mm_modem_signal_setup (MMModemSignal *self,
* Since: 1.2
*/
gboolean
-mm_modem_signal_setup_sync (MMModemSignal *self,
- guint rate,
- GCancellable *cancellable,
- GError **error)
+mm_modem_signal_setup_sync (MMModemSignal *self,
+ guint rate,
+ GCancellable *cancellable,
+ GError **error)
{
g_return_val_if_fail (MM_IS_MODEM_SIGNAL (self), FALSE);
@@ -187,6 +191,93 @@ mm_modem_signal_setup_sync (MMModemSignal *self,
/*****************************************************************************/
/**
+ * mm_modem_signal_setup_thresholds_finish:
+ * @self: A #MMModemSignal.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to
+ * mm_modem_signal_setup_thresholds().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with mm_modem_signal_setup_thresholds().
+ *
+ * Returns: %TRUE if the setup was successful, %FALSE if @error is set.
+ *
+ * Since: 1.20
+ */
+gboolean
+mm_modem_signal_setup_thresholds_finish (MMModemSignal *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ g_return_val_if_fail (MM_IS_MODEM_SIGNAL (self), FALSE);
+
+ return mm_gdbus_modem_signal_call_setup_thresholds_finish (MM_GDBUS_MODEM_SIGNAL (self), res, error);
+}
+
+/**
+ * mm_modem_signal_setup_thresholds:
+ * @self: A #MMModemSignal.
+ * @settings: Threshold values to set.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or
+ * %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously setups thresholds so that the device itself decides when to report the
+ * extended signal quality information updates.
+ *
+ * When the operation is finished, @callback will be invoked in the
+ * <link linkend="g-main-context-push-thread-default">thread-default main loop</link>
+ * of the thread you are calling this method from. You can then call
+ * mm_modem_signal_setup_thresholds_finish() to get the result of the operation.
+ *
+ * See mm_modem_signal_setup_thresholds_sync() for the synchronous, blocking version of
+ * this method.
+ *
+ * Since: 1.20
+ */
+void
+mm_modem_signal_setup_thresholds (MMModemSignal *self,
+ GVariant *settings,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_return_if_fail (MM_IS_MODEM_SIGNAL (self));
+
+ mm_gdbus_modem_signal_call_setup_thresholds (MM_GDBUS_MODEM_SIGNAL (self), settings, cancellable, callback, user_data);
+}
+
+/**
+ * mm_modem_signal_setup_thresholds_sync:
+ * @self: A #MMModemSignal.
+ * @settings: Threshold values to set.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously setups thresholds so that the device itself decides when to report the
+ * extended signal quality information updates.
+ *
+ * The calling thread is blocked until a reply is received. See
+ * mm_modem_signal_setup_thresholds() for the asynchronous version of this method.
+ *
+ * Returns: %TRUE if the setup was successful, %FALSE if @error is set.
+ *
+ * Since: 1.20
+ */
+gboolean
+mm_modem_signal_setup_thresholds_sync (MMModemSignal *self,
+ GVariant *settings,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_return_val_if_fail (MM_IS_MODEM_SIGNAL (self), FALSE);
+
+ return mm_gdbus_modem_signal_call_setup_thresholds_sync (MM_GDBUS_MODEM_SIGNAL (self), settings, cancellable, error);
+}
+
+/*****************************************************************************/
+
+/**
* mm_modem_signal_get_rate:
* @self: A #MMModemSignal.
*
@@ -207,6 +298,48 @@ mm_modem_signal_get_rate (MMModemSignal *self)
/*****************************************************************************/
/**
+ * mm_modem_signal_get_rssi_threshold:
+ * @self: A #MMModemSignal.
+ *
+ * Gets the currently configured RSSI threshold, in dBm.
+ *
+ * A value of 0 indicates the threshold is disabled.
+ *
+ * Returns: the RSSI threshold.
+ *
+ * Since: 1.20
+ */
+guint
+mm_modem_signal_get_rssi_threshold (MMModemSignal *self)
+{
+ g_return_val_if_fail (MM_IS_MODEM_SIGNAL (self), 0);
+
+ return mm_gdbus_modem_signal_get_rssi_threshold (MM_GDBUS_MODEM_SIGNAL (self));
+}
+
+/*****************************************************************************/
+
+/**
+ * mm_modem_signal_get_error_rate_threshold:
+ * @self: A #MMModemSignal.
+ *
+ * Gets whether the error rate threshold is enabled or not.
+ *
+ * Returns: %TRUE if the error rate threshold is enabled, %FALSE otherwise.
+ *
+ * Since: 1.20
+ */
+gboolean
+mm_modem_signal_get_error_rate_threshold (MMModemSignal *self)
+{
+ g_return_val_if_fail (MM_IS_MODEM_SIGNAL (self), FALSE);
+
+ return mm_gdbus_modem_signal_get_error_rate_threshold (MM_GDBUS_MODEM_SIGNAL (self));
+}
+
+/*****************************************************************************/
+
+/**
* mm_modem_signal_get_cdma:
* @self: A #MMModem.
*
diff --git a/libmm-glib/mm-modem-signal.h b/libmm-glib/mm-modem-signal.h
index 5c0cb6aa..8c859a96 100644
--- a/libmm-glib/mm-modem-signal.h
+++ b/libmm-glib/mm-modem-signal.h
@@ -17,7 +17,8 @@
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
- * Copyright (C) 2013 Aleksander Morgado <aleksander@gnu.org>
+ * Copyright (C) 2013-2021 Aleksander Morgado <aleksander@aleksander.es>
+ * Copyright (C) 2021 Intel Corporation
*/
#ifndef _MM_MODEM_SIGNAL_H_
@@ -65,24 +66,38 @@ struct _MMModemSignalClass {
GType mm_modem_signal_get_type (void);
G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMModemSignal, g_object_unref)
-const gchar *mm_modem_signal_get_path (MMModemSignal *self);
-gchar *mm_modem_signal_dup_path (MMModemSignal *self);
-guint mm_modem_signal_get_rate (MMModemSignal *self);
-
-void mm_modem_signal_setup (MMModemSignal *self,
- guint rate,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
-gboolean mm_modem_signal_setup_finish (MMModemSignal *self,
- GAsyncResult *res,
- GError **error);
-gboolean mm_modem_signal_setup_sync (MMModemSignal *self,
- guint rate,
- GCancellable *cancellable,
- GError **error);
-
-MMSignal *mm_modem_signal_get_cdma (MMModemSignal *self);
+const gchar *mm_modem_signal_get_path (MMModemSignal *self);
+gchar *mm_modem_signal_dup_path (MMModemSignal *self);
+guint mm_modem_signal_get_rate (MMModemSignal *self);
+guint mm_modem_signal_get_rssi_threshold (MMModemSignal *self);
+gboolean mm_modem_signal_get_error_rate_threshold (MMModemSignal *self);
+
+void mm_modem_signal_setup (MMModemSignal *self,
+ guint rate,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+gboolean mm_modem_signal_setup_finish (MMModemSignal *self,
+ GAsyncResult *res,
+ GError **error);
+gboolean mm_modem_signal_setup_sync (MMModemSignal *self,
+ guint rate,
+ GCancellable *cancellable,
+ GError **error);
+void mm_modem_signal_setup_thresholds (MMModemSignal *self,
+ GVariant *settings,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+gboolean mm_modem_signal_setup_thresholds_finish (MMModemSignal *self,
+ GAsyncResult *res,
+ GError **error);
+gboolean mm_modem_signal_setup_thresholds_sync (MMModemSignal *self,
+ GVariant *settings,
+ GCancellable *cancellable,
+ GError **error);
+
+MMSignal *mm_modem_signal_get_cdma (MMModemSignal *self);
MMSignal *mm_modem_signal_peek_cdma (MMModemSignal *self);
MMSignal *mm_modem_signal_get_evdo (MMModemSignal *self);