summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Matyukevich <geomatsi@gmail.com>2021-01-15 19:25:47 +0300
committerDenis Kenzior <denkenz@gmail.com>2021-01-15 11:43:52 -0600
commit7b3840c5ce0018ae2e1a8c5b24d406884938588c (patch)
treef6d3a6e9910d4f190ab146d14746dbcd8b2b180e
parent8492b722eb90f03228eb826e4d9c3e7a733195a5 (diff)
downloadofono-7b3840c5ce0018ae2e1a8c5b24d406884938588c.tar.gz
gemalto: netmon measurements scaling
Gemalto modem reports raw measurements in dBm. Reported values may include negative numbers. Meanwhile oFono follows ETSI TS 27.007, so negative numbers do not really exist at the API level. Modify gemalto netmon driver to report measurements according to 27.007. For this purpose re-scale from what Gemalto firmware reports into something that 27.007 recommends.
-rw-r--r--drivers/gemaltomodem/netmon.c54
1 files changed, 50 insertions, 4 deletions
diff --git a/drivers/gemaltomodem/netmon.c b/drivers/gemaltomodem/netmon.c
index ddaebf1a..d7959daa 100644
--- a/drivers/gemaltomodem/netmon.c
+++ b/drivers/gemaltomodem/netmon.c
@@ -128,6 +128,50 @@ static gboolean gemalto_delayed_register(gpointer user_data)
return FALSE;
}
+static int gemalto_ecno_scale(int value)
+{
+ if (value < -24)
+ return 0;
+
+ if (value > 0)
+ return 49;
+
+ return 49 * (value + 24) / 24;
+}
+
+static int gemalto_rscp_scale(int value)
+{
+ if (value < -120)
+ return 0;
+
+ if (value > -24)
+ return 96;
+
+ return value + 120;
+}
+
+static int gemalto_rsrp_scale(int value)
+{
+ if (value < -140)
+ return 0;
+
+ if (value > -43)
+ return 97;
+
+ return value + 140;
+}
+
+static int gemalto_rsrq_scale(int value)
+{
+ if (2 * value < -39)
+ return 0;
+
+ if (2 * value > -5)
+ return 34;
+
+ return 2 * value + 39;
+}
+
static int gemalto_parse_smoni_gsm(GAtResultIter *iter,
struct req_cb_data *cbd)
{
@@ -273,13 +317,15 @@ static int gemalto_parse_smoni_umts(GAtResultIter *iter,
case SMONI_UMTS_ECN0:
if (g_at_result_iter_next_unquoted_string(iter, &str)) {
if (sscanf(str, "%f", &fnumber) == 1)
- cbd->t.umts.ecno = (int)fnumber;
+ cbd->t.umts.ecno =
+ gemalto_ecno_scale((int)fnumber);
}
break;
case SMONI_UMTS_RSCP:
if (g_at_result_iter_next_unquoted_string(iter, &str)) {
if (sscanf(str, "%d", &number) == 1)
- cbd->t.umts.rscp = number;
+ cbd->t.umts.rscp =
+ gemalto_rscp_scale(number);
}
break;
case SMONI_UMTS_MCC:
@@ -368,12 +414,12 @@ static int gemalto_parse_smoni_lte(GAtResultIter *iter,
if (g_at_result_iter_next_unquoted_string(iter, &str)) {
if (sscanf(str, "%d", &number) == 1)
- cbd->t.lte.rsrp = number;
+ cbd->t.lte.rsrp = gemalto_rsrp_scale(number);
}
if (g_at_result_iter_next_unquoted_string(iter, &str)) {
if (sscanf(str, "%d", &number) == 1)
- cbd->t.lte.rsrq = number;
+ cbd->t.lte.rsrq = gemalto_rsrq_scale(number);
}
DBG(" %-15s %s", "LTE.MCC", cbd->op.mcc);