diff options
author | Pavan Holla <pholla@chromium.org> | 2022-08-12 15:29:06 +0000 |
---|---|---|
committer | Aleksander Morgado <aleksandermj@chromium.org> | 2022-11-04 13:12:57 +0000 |
commit | 15331121824b4e0d108a2fb09ebdb0f5d8a90110 (patch) | |
tree | d0f1343b0e2afa6795d17d01b23763fa1a90b199 | |
parent | ec5eb6c3ac6effb368ee7bc6992577464a3c9a8f (diff) |
iface-modem-signal: print signal quality under INFO verbosity
-rw-r--r-- | libmm-glib/mm-signal.c | 29 | ||||
-rw-r--r-- | libmm-glib/mm-signal.h | 2 | ||||
-rw-r--r-- | src/mm-iface-modem-signal.c | 45 |
3 files changed, 72 insertions, 4 deletions
diff --git a/libmm-glib/mm-signal.c b/libmm-glib/mm-signal.c index 38142afd..e71cd24b 100644 --- a/libmm-glib/mm-signal.c +++ b/libmm-glib/mm-signal.c @@ -364,6 +364,35 @@ mm_signal_set_error_rate (MMSignal *self, self->priv->error_rate = value; } +/** + * mm_signal_get_string: (skip) + */ +gchar * +mm_signal_get_string (MMSignal *self) +{ + GString *printable; + + printable = g_string_new (""); + if (self->priv->ecio != MM_SIGNAL_UNKNOWN) + g_string_append_printf (printable, "Ec/Io: %3.0e dB", self->priv->ecio); + if (self->priv->error_rate != MM_SIGNAL_UNKNOWN) + g_string_append_printf (printable, "%serror rate: %f %%", printable->len ? ", " : "", self->priv->error_rate); + if (self->priv->rscp != MM_SIGNAL_UNKNOWN) + g_string_append_printf (printable, "%sRSCP: %f dBm", printable->len ? ", " : "", self->priv->rscp); + if (self->priv->rscp != MM_SIGNAL_UNKNOWN) + g_string_append_printf (printable, "%sRSRP: %f dBm", printable->len ? ", " : "", self->priv->rsrp); + if (self->priv->rsrq != MM_SIGNAL_UNKNOWN) + g_string_append_printf (printable, "%sRSRQ: %f dB", printable->len ? ", " : "", self->priv->rsrq); + if (self->priv->rssi != MM_SIGNAL_UNKNOWN) + g_string_append_printf (printable, "%sRSSI: %f dBm", printable->len ? ", " : "", self->priv->rssi); + if (self->priv->sinr != MM_SIGNAL_UNKNOWN) + g_string_append_printf (printable, "%sSINR: %f dB", printable->len ? ", " : "", self->priv->sinr); + if (self->priv->snr != MM_SIGNAL_UNKNOWN) + g_string_append_printf (printable, "%sSNR: %f dB", printable->len ? ", " : "", self->priv->snr); + + return g_string_free (printable, FALSE); +} + /*****************************************************************************/ /** diff --git a/libmm-glib/mm-signal.h b/libmm-glib/mm-signal.h index 161e28e9..084d7468 100644 --- a/libmm-glib/mm-signal.h +++ b/libmm-glib/mm-signal.h @@ -106,6 +106,8 @@ void mm_signal_set_rsrp (MMSignal *self, gdouble value); void mm_signal_set_snr (MMSignal *self, gdouble value); void mm_signal_set_error_rate (MMSignal *self, gdouble value); +gchar *mm_signal_get_string (MMSignal *self); + #endif G_END_DECLS diff --git a/src/mm-iface-modem-signal.c b/src/mm-iface-modem-signal.c index 11160573..225513fb 100644 --- a/src/mm-iface-modem-signal.c +++ b/src/mm-iface-modem-signal.c @@ -43,11 +43,15 @@ typedef struct { /* threshold-based reporting */ guint rssi_threshold; gboolean error_rate_threshold; + /* info logging control */ + GTimer *info_log_timer; } Private; static void private_free (Private *priv) { + if (priv->info_log_timer) + g_timer_destroy (priv->info_log_timer); if (priv->timeout_source) g_source_remove (priv->timeout_source); g_slice_free (Private, priv); @@ -80,6 +84,35 @@ mm_iface_modem_signal_bind_simple_status (MMIfaceModemSignal *self, /*****************************************************************************/ +/* Even if the signal refresh rate is higher than 300s, don't pollute the INFO + * level log with so many updates, force a reduction of the rate to once every + * 300s */ +#define SIGNAL_QUALITY_PRINT_RATE_SECS 300 + +static void +info_log_signal_quality (MMIfaceModemSignal *self, + MMSignal *info, + const gchar *rat) +{ + Private *priv = NULL; + g_autofree gchar *printable = NULL; + g_autoptr(GDateTime) current_time = NULL; + + priv = get_private (self); + + if (G_UNLIKELY (!priv->info_log_timer)) + priv->info_log_timer = g_timer_new (); + + if (g_timer_elapsed (priv->info_log_timer, NULL) < SIGNAL_QUALITY_PRINT_RATE_SECS) + return; + g_timer_reset (priv->info_log_timer); + + printable = mm_signal_get_string (info); + mm_obj_info (self, "%s: %s", rat, printable); +}; + +/*****************************************************************************/ + static void internal_signal_update (MMIfaceModemSignal *self, MMSignal *cdma, @@ -119,24 +152,28 @@ internal_signal_update (MMIfaceModemSignal *self, if (gsm) { mm_obj_dbg (self, "gsm extended signal information updated"); + info_log_signal_quality (self, gsm, "gsm"); dict_gsm = mm_signal_get_dictionary (gsm); } mm_gdbus_modem_signal_set_gsm (MM_GDBUS_MODEM_SIGNAL (skeleton), dict_gsm); if (umts) { mm_obj_dbg (self, "umts extended signal information updated"); + info_log_signal_quality (self, umts, "umts"); dict_umts = mm_signal_get_dictionary (umts); } mm_gdbus_modem_signal_set_umts (MM_GDBUS_MODEM_SIGNAL (skeleton), dict_umts); if (lte) { mm_obj_dbg (self, "lte extended signal information updated"); + info_log_signal_quality (self, lte, "lte"); dict_lte = mm_signal_get_dictionary (lte); } mm_gdbus_modem_signal_set_lte (MM_GDBUS_MODEM_SIGNAL (skeleton), dict_lte); if (nr5g) { mm_obj_dbg (self, "5gnr extended signal information updated"); + info_log_signal_quality (self, nr5g, "5gnr"); dict_nr5g = mm_signal_get_dictionary (nr5g); } mm_gdbus_modem_signal_set_nr5g (MM_GDBUS_MODEM_SIGNAL (skeleton), dict_nr5g); @@ -232,10 +269,10 @@ polling_restart (MMIfaceModemSignal *self) priv = get_private (self); polling_setup = (priv->enabled && priv->rate); - mm_obj_dbg (self, "%s extended signal information polling: interface %s, rate %u seconds", - polling_setup ? "setting up" : "cleaning up", - priv->enabled ? "enabled" : "disabled", - priv->rate); + if (polling_setup) + mm_obj_info (self, "setting up extended signal information polling: rate %u seconds", priv->rate); + else + mm_obj_dbg (self, "cleaning up extended signal information polling"); /* Stop polling */ if (!polling_setup) { |