From 04ab1b28637d207e0b02840164ade4ac5f78298c Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Thu, 16 Feb 2012 08:20:29 +0100 Subject: atmodem: Use CSQ based notification for IFX signal strength Since the XCIEV notifications are unclear, use XCSQ notifcations to report signal strength updates. --- drivers/atmodem/network-registration.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'drivers/atmodem/network-registration.c') diff --git a/drivers/atmodem/network-registration.c b/drivers/atmodem/network-registration.c index 5cf1a021..0ec66087 100644 --- a/drivers/atmodem/network-registration.c +++ b/drivers/atmodem/network-registration.c @@ -702,6 +702,33 @@ static void ifx_xciev_notify(GAtResult *result, gpointer user_data) */ } +static void ifx_xcsq_notify(GAtResult *result, gpointer user_data) +{ + struct ofono_netreg *netreg = user_data; + int rssi, ber, strength; + GAtResultIter iter; + + g_at_result_iter_init(&iter, result); + + if (!g_at_result_iter_next(&iter, "+XCSQ:")) + return; + + if (!g_at_result_iter_next_number(&iter, &rssi)) + return; + + if (!g_at_result_iter_next_number(&iter, &ber)) + return; + + DBG("rssi %d ber %d", rssi, ber); + + if (rssi == 99) + strength = -1; + else + strength = (rssi * 100) / 31; + + ofono_netreg_strength_notify(netreg, strength); +} + static void ciev_notify(GAtResult *result, gpointer user_data) { struct ofono_netreg *netreg = user_data; @@ -1470,6 +1497,10 @@ static void at_creg_set_cb(gboolean ok, GAtResult *result, gpointer user_data) /* Register for specific signal strength reports */ g_at_chat_register(nd->chat, "+XCIEV:", ifx_xciev_notify, FALSE, netreg, NULL); + g_at_chat_register(nd->chat, "+XCSQ:", ifx_xcsq_notify, + FALSE, netreg, NULL); + g_at_chat_send(nd->chat, "AT+XCSQ=1", none_prefix, + NULL, NULL, NULL); g_at_chat_send(nd->chat, "AT+XMER=1", none_prefix, NULL, NULL, NULL); -- cgit v1.2.3