diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2010-04-12 16:19:34 -0700 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2010-04-12 16:19:34 -0700 |
commit | 5c1da8f6fc450f4b4fc13753388c0eb295a64bd9 (patch) | |
tree | 5118aa02a813bbfdb6c508716257723e8346e1d5 /gatchat/test-server.c | |
parent | 156904535ed21e974de3f7483249e0e8ff115eca (diff) | |
download | ofono-5c1da8f6fc450f4b4fc13753388c0eb295a64bd9.tar.gz |
Add basic support for emulating AT+CREG inside AT server
Diffstat (limited to 'gatchat/test-server.c')
-rw-r--r-- | gatchat/test-server.c | 75 |
1 files changed, 73 insertions, 2 deletions
diff --git a/gatchat/test-server.c b/gatchat/test-server.c index 0a18a8c5..b22cd2d7 100644 --- a/gatchat/test-server.c +++ b/gatchat/test-server.c @@ -50,6 +50,8 @@ #define DEFAULT_SOCK_PATH "./server_sock" static int modem_mode = 0; +static int modem_creg = 0; +static int network_status = 4; struct sock_server{ int server_sock; @@ -233,6 +235,24 @@ static void cpin_cb(GAtServerRequestType type, GAtResult *cmd, gpointer user) } } +static gboolean do_netreg(gpointer user) +{ + GAtServer *server = user; + char buf[32]; + + network_status = 1; + + switch (modem_creg) { + case 1: + case 2: + snprintf(buf, sizeof(buf), "+CREG: %d", network_status); + g_at_server_send_unsolicited(server, buf); + break; + } + + return FALSE; +} + static void cops_cb(GAtServerRequestType type, GAtResult *cmd, gpointer user) { GAtServer *server = user; @@ -260,9 +280,10 @@ static void cops_cb(GAtServerRequestType type, GAtResult *cmd, gpointer user) g_at_result_iter_next(&iter, "+COPS="); if (g_at_result_iter_next_number(&iter, &mode) == TRUE) { - if (mode == 0) + if (mode == 0) { + g_timeout_add_seconds(2, do_netreg, server); result = G_AT_SERVER_RESULT_OK; - else + } else result = G_AT_SERVER_RESULT_ERROR; } else result = G_AT_SERVER_RESULT_ERROR; @@ -276,6 +297,55 @@ static void cops_cb(GAtServerRequestType type, GAtResult *cmd, gpointer user) } } +static void creg_cb(GAtServerRequestType type, GAtResult *cmd, gpointer user) +{ + GAtServer *server = user; + char buf[20]; + + if (modem_mode == 0) { + g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR); + return; + } + + switch (type) { + case G_AT_SERVER_REQUEST_TYPE_SUPPORT: + g_at_server_send_info(server, "+CREG: (0-2)", TRUE); + g_at_server_send_final(server, G_AT_SERVER_RESULT_OK); + break; + case G_AT_SERVER_REQUEST_TYPE_QUERY: + snprintf(buf, sizeof(buf), "+CREG: %d,%d", + modem_creg, network_status); + g_at_server_send_info(server, buf, TRUE); + g_at_server_send_final(server, G_AT_SERVER_RESULT_OK); + break; + case G_AT_SERVER_REQUEST_TYPE_SET: + { + GAtResultIter iter; + int mode; + + g_at_result_iter_init(&iter, cmd); + g_at_result_iter_next(&iter, "+CREG="); + + if (g_at_result_iter_next_number(&iter, &mode) == FALSE) + goto error; + + if (mode != 0 && mode != 1 && mode != 2) + goto error; + + modem_creg = mode; + g_at_server_send_final(server, G_AT_SERVER_RESULT_OK); + break; + } + default: + goto error; + }; + + return; + +error: + g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR); +} + static void cimi_cb(GAtServerRequestType type, GAtResult *cmd, gpointer user) { GAtServer *server = user; @@ -457,6 +527,7 @@ static void add_handler(GAtServer *server) g_at_server_register(server, "+CFUN", cfun_cb, server, NULL); g_at_server_register(server, "+CPIN", cpin_cb, server, NULL); g_at_server_register(server, "+COPS", cops_cb, server, NULL); + g_at_server_register(server, "+CREG", creg_cb, server, NULL); g_at_server_register(server, "+CIMI", cimi_cb, server, NULL); g_at_server_register(server, "+CSMS", csms_cb, server, NULL); g_at_server_register(server, "+CMGF", cmgf_cb, server, NULL); |