diff options
author | Denis Kenzior <denis.kenzior@intel.com> | 2009-10-29 12:50:52 -0500 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2009-10-29 14:18:58 -0500 |
commit | 7ac963a26fd3c251bee1291daec2d5d1f4a601e9 (patch) | |
tree | bab5131cb7b47c2b655be21c5ec94392c696e85c | |
parent | 8fed5a97fe9a2f602326274e194a95e9fc780d77 (diff) | |
download | ofono-7ac963a26fd3c251bee1291daec2d5d1f4a601e9.tar.bz2 |
Refactor: Make MBM driver actually use EMRDY
-rw-r--r-- | plugins/mbm.c | 64 |
1 files changed, 60 insertions, 4 deletions
diff --git a/plugins/mbm.c b/plugins/mbm.c index 6cac0e36..24e5f3da 100644 --- a/plugins/mbm.c +++ b/plugins/mbm.c @@ -51,6 +51,9 @@ #include <ofono/gprs-context.h> #include <ofono/log.h> +static const char *cfun_prefix[] = { "+CFUN:", NULL }; +static const char *none_prefix[] = { NULL }; + struct mbm_data { GAtChat *chat; }; @@ -89,11 +92,62 @@ static void mbm_debug(const char *str, void *user_data) static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data) { struct ofono_modem *modem = user_data; + struct mbm_data *data = ofono_modem_get_data(modem); DBG(""); - if (ok) - ofono_modem_set_powered(modem, TRUE); + if (!ok) + ofono_modem_set_powered(modem, FALSE); + + ofono_modem_set_powered(modem, TRUE); +} + +static void cfun_query(gboolean ok, GAtResult *result, gpointer user_data) +{ + struct ofono_modem *modem = user_data; + struct mbm_data *data = ofono_modem_get_data(modem); + GAtResultIter iter; + int status; + + DBG(""); + + g_at_result_iter_init(&iter, result); + + if (g_at_result_iter_next(&iter, "+CFUN:") == FALSE) + return; + + g_at_result_iter_next_number(&iter, &status); + + if (status == 4) { + g_at_chat_send(data->chat, "AT+CFUN=1", none_prefix, + cfun_enable, modem, NULL); + return; + } + + ofono_modem_set_powered(modem, TRUE); +} + +static void emrdy_notifier(GAtResult *result, gpointer user_data) +{ + struct ofono_modem *modem = user_data; + struct mbm_data *data = ofono_modem_get_data(modem); + GAtResultIter iter; + int status; + + DBG(""); + + g_at_result_iter_init(&iter, result); + + if (g_at_result_iter_next(&iter, "*EMRDY:") == FALSE) + return; + + g_at_result_iter_next_number(&iter, &status); + + if (status != 1) + return; + + g_at_chat_send(data->chat, "AT+CFUN?", cfun_prefix, + cfun_query, modem, NULL); } static int mbm_enable(struct ofono_modem *modem) @@ -127,10 +181,12 @@ static int mbm_enable(struct ofono_modem *modem) if (getenv("OFONO_AT_DEBUG")) g_at_chat_set_debug(data->chat, mbm_debug, NULL); + g_at_chat_register(data->chat, "*EMRDY:", emrdy_notifier, + FALSE, modem, NULL); + g_at_chat_send(data->chat, "AT&F E0 V1 X4 &C1 +CMEE=1", NULL, NULL, NULL, NULL); - g_at_chat_send(data->chat, "AT+CFUN=1", NULL, - cfun_enable, modem, NULL); + g_at_chat_send(data->chat, "AT*EMRDY?", none_prefix, NULL, NULL, NULL); return -EINPROGRESS; } |