diff options
author | Walter Hagstrom <walter.hagstrom@digi.com> | 2020-06-23 11:14:43 -0400 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2020-07-04 05:50:41 +0200 |
commit | 88923ffe3996fdef83dc13a7a4762855af77706d (patch) | |
tree | 38e1240a6a9db59c6f95d16a6316dba6e2ec7418 /src | |
parent | 711b17278edecbc474418ecf95e7582f515711cb (diff) |
iface-modem-signal: added 5G signal information
Extended the ModemManager Signal interface to include 5G signal
information for RSRP, RSRQ and SINR via libqmi. Also extended mmci
to print 5G signal info.
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 6 | ||||
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 54 | ||||
-rw-r--r-- | src/mm-broadband-modem.c | 4 | ||||
-rw-r--r-- | src/mm-iface-modem-signal.c | 12 | ||||
-rw-r--r-- | src/mm-iface-modem-signal.h | 1 |
5 files changed, 59 insertions, 18 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index 8954889b..4bf941d5 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -4342,6 +4342,7 @@ typedef struct { MMSignal *gsm; MMSignal *umts; MMSignal *lte; + MMSignal *nr5g; } SignalLoadValuesResult; static void @@ -4361,6 +4362,7 @@ modem_signal_load_values_finish (MMIfaceModemSignal *self, MMSignal **gsm, MMSignal **umts, MMSignal **lte, + MMSignal **nr5g, GError **error) { SignalLoadValuesResult *result; @@ -4391,6 +4393,8 @@ modem_signal_load_values_finish (MMIfaceModemSignal *self, *cdma = NULL; if (evdo) *evdo = NULL; + if (nr5g) + *nr5g = NULL; return TRUE; } @@ -4489,7 +4493,7 @@ parent_signal_load_values_ready (MMIfaceModemSignal *self, result = g_slice_new0 (SignalLoadValuesResult); if (!iface_modem_signal_parent->load_values_finish (self, res, NULL, NULL, - &result->gsm, &result->umts, &result->lte, + &result->gsm, &result->umts, &result->lte, &result->nr5g, &error)) { signal_load_values_result_free (result); g_task_return_error (task, error); diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index e3a616ae..4169fa15 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -8463,6 +8463,7 @@ typedef struct { MMSignal *gsm; MMSignal *umts; MMSignal *lte; + MMSignal *nr5g; } SignalLoadValuesResult; typedef struct { @@ -8509,14 +8510,15 @@ get_db_from_sinr_level (MMBroadbandModemQmi *self, } static gboolean -signal_load_values_finish (MMIfaceModemSignal *self, - GAsyncResult *res, - MMSignal **cdma, - MMSignal **evdo, - MMSignal **gsm, - MMSignal **umts, - MMSignal **lte, - GError **error) +signal_load_values_finish (MMIfaceModemSignal *self, + GAsyncResult *res, + MMSignal **cdma, + MMSignal **evdo, + MMSignal **gsm, + MMSignal **umts, + MMSignal **lte, + MMSignal **nr5g, + GError **error) { SignalLoadValuesResult *values_result; @@ -8529,6 +8531,7 @@ signal_load_values_finish (MMIfaceModemSignal *self, *gsm = values_result->gsm ? g_object_ref (values_result->gsm) : NULL; *umts = values_result->umts ? g_object_ref (values_result->umts) : NULL; *lte = values_result->lte ? g_object_ref (values_result->lte) : NULL; + *nr5g = values_result->nr5g ? g_object_ref (values_result->nr5g) : NULL; signal_load_values_result_free (values_result); return TRUE; } @@ -8693,15 +8696,16 @@ signal_load_values_get_signal_info_ready (QmiClientNas *client, GAsyncResult *res, GTask *task) { - MMBroadbandModemQmi *self; - SignalLoadValuesContext *ctx; - gint8 rssi; - gint16 ecio; - QmiNasEvdoSinrLevel sinr_level; - gint32 io; - gint8 rsrq; - gint16 rsrp; - gint16 snr; + MMBroadbandModemQmi *self; + SignalLoadValuesContext *ctx; + gint8 rssi; + gint16 ecio; + QmiNasEvdoSinrLevel sinr_level; + gint32 io; + gint8 rsrq; + gint16 rsrp; + gint16 snr; + gint16 rsrq_5g; g_autoptr(QmiMessageNasGetSignalInfoOutput) output = NULL; self = g_task_get_source_object (task); @@ -8774,6 +8778,22 @@ signal_load_values_get_signal_info_ready (QmiClientNas *client, mm_signal_set_snr (ctx->values_result->lte, (0.1) * ((gdouble)snr)); } + /* 5G */ + if (qmi_message_nas_get_signal_info_output_get_5g_signal_strength (output, + &rsrp, + &snr, + NULL)) { + ctx->values_result->nr5g = mm_signal_new (); + mm_signal_set_rsrp (ctx->values_result->nr5g, (gdouble)rsrp); + mm_signal_set_snr (ctx->values_result->nr5g, (gdouble)snr); + } + + if (qmi_message_nas_get_signal_info_output_get_5g_signal_strength_extended (output, + &rsrq_5g, + NULL)) { + mm_signal_set_rsrq (ctx->values_result->nr5g, (gdouble)rsrq_5g); + } + /* Keep on */ ctx->step++; signal_load_values_context_step (task); diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index 6977fe33..f3b19402 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -9981,6 +9981,7 @@ modem_signal_load_values_finish (MMIfaceModemSignal *self, MMSignal **gsm, MMSignal **umts, MMSignal **lte, + MMSignal **nr5g, GError **error) { const gchar *response; @@ -9994,6 +9995,9 @@ modem_signal_load_values_finish (MMIfaceModemSignal *self, *cdma = NULL; if (evdo) *evdo = NULL; + if (nr5g) + *nr5g = NULL; + return TRUE; } diff --git a/src/mm-iface-modem-signal.c b/src/mm-iface-modem-signal.c index 03e4ce1f..447b7cf2 100644 --- a/src/mm-iface-modem-signal.c +++ b/src/mm-iface-modem-signal.c @@ -68,6 +68,7 @@ clear_values (MMIfaceModemSignal *self) mm_gdbus_modem_signal_set_gsm (skeleton, NULL); mm_gdbus_modem_signal_set_umts (skeleton, NULL); mm_gdbus_modem_signal_set_lte (skeleton, NULL); + mm_gdbus_modem_signal_set_nr5g (skeleton, NULL); g_object_unref (skeleton); } @@ -82,6 +83,7 @@ load_values_ready (MMIfaceModemSignal *self, MMSignal *gsm = NULL; MMSignal *umts = NULL; MMSignal *lte = NULL; + MMSignal *nr5g = NULL; MmGdbusModemSignal *skeleton; if (!MM_IFACE_MODEM_SIGNAL_GET_INTERFACE (self)->load_values_finish ( @@ -92,6 +94,7 @@ load_values_ready (MMIfaceModemSignal *self, &gsm, &umts, <e, + &nr5g, &error)) { mm_obj_warn (self, "couldn't load extended signal information: %s", error->message); g_error_free (error); @@ -147,6 +150,15 @@ load_values_ready (MMIfaceModemSignal *self, } else mm_gdbus_modem_signal_set_lte (skeleton, NULL); + if (nr5g) { + dictionary = mm_signal_get_dictionary (nr5g); + mm_gdbus_modem_signal_set_nr5g (skeleton, dictionary); + g_variant_unref (dictionary); + g_object_unref (nr5g); + } else + mm_gdbus_modem_signal_set_nr5g (skeleton, NULL); + + /* Flush right away */ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (skeleton)); diff --git a/src/mm-iface-modem-signal.h b/src/mm-iface-modem-signal.h index 1d49e5f3..15874b3f 100644 --- a/src/mm-iface-modem-signal.h +++ b/src/mm-iface-modem-signal.h @@ -54,6 +54,7 @@ struct _MMIfaceModemSignal { MMSignal **gsm, MMSignal **umts, MMSignal **lte, + MMSignal **nr5g, GError **error); }; |