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.
This commit is contained in:
Walter Hagstrom
2020-07-04 05:50:41 +02:00
committed by Aleksander Morgado
parent 711b17278e
commit 88923ffe39
16 changed files with 198 additions and 20 deletions
+5 -1
View File
@@ -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);
+37 -17
View File
@@ -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);
+4
View File
@@ -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;
}
+12
View File
@@ -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,
&lte,
&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));
+1
View File
@@ -54,6 +54,7 @@ struct _MMIfaceModemSignal {
MMSignal **gsm,
MMSignal **umts,
MMSignal **lte,
MMSignal **nr5g,
GError **error);
};