From 1390a6393381bc7912673fd614ca441d01aee224 Mon Sep 17 00:00:00 2001 From: Zhenhua Zhang Date: Wed, 31 Mar 2010 17:50:36 +0800 Subject: [PATCH] Add implementation for ATE and other basic command --- gatchat/gatserver.c | 162 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 158 insertions(+), 4 deletions(-) diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c index 7d5c3c71..5206a126 100644 --- a/gatchat/gatserver.c +++ b/gatchat/gatserver.c @@ -260,10 +260,10 @@ static gboolean get_result_value(GAtServer *server, GAtResult *result, int val; char prefix[10]; - if (command[0] != 'S') - return FALSE; - - sprintf(prefix, "%s=", command); + if (command[0] == 'S') + sprintf(prefix, "%s=", command); + else + strcpy(prefix, command); g_at_result_iter_init(&iter, result); @@ -376,6 +376,154 @@ static void at_s5_cb(GAtServerRequestType type, GAtResult *result, s_template_cb(type, result, user_data, "S5", 0, 127); } +static void set_v250_value(GAtServer *server, const char *prefix, int val) +{ + if (prefix[0] == '&') { + switch (prefix[1]) { + case 'C': + server->v250.c109 = val; + break; + case 'D': + server->v250.c108 = val; + break; + default: + break; + } + } else { + switch (prefix[0]) { + case 'E': + server->v250.echo = val; + break; + case 'Q': + server->v250.quiet = val; + break; + case 'V': + server->v250.is_v1 = val; + break; + case 'X': + server->v250.res_format = val; + break; + } + } +} + +static int get_v250_value(GAtServer *server, const char *prefix) +{ + int val = 0; + + if (prefix[0] == '&') { + switch (prefix[1]) { + case 'C': + val = server->v250.c109; + break; + case 'D': + val = server->v250.c108; + break; + default: + break; + } + } else { + switch (prefix[0]) { + case 'E': + val = server->v250.echo; + break; + case 'Q': + val = server->v250.quiet; + break; + case 'V': + val = server->v250.is_v1; + break; + case 'X': + val = server->v250.res_format; + break; + default: + break; + } + } + + return val; +} + +static void at_template_cb(GAtServerRequestType type, GAtResult *result, + gpointer user_data, const char *prefix, + int min, int max, int deftval) +{ + GAtServer *server = user_data; + char buf[20]; + int val; + + switch (type) { + case G_AT_SERVER_REQUEST_TYPE_SET: + if (!get_result_value(server, result, prefix, min, max, &val)) { + g_at_server_send_final(server, + G_AT_SERVER_RESULT_ERROR); + return; + } + + set_v250_value(server, prefix, val); + g_at_server_send_final(server, G_AT_SERVER_RESULT_OK); + break; + + case G_AT_SERVER_REQUEST_TYPE_QUERY: + val = get_v250_value(server, prefix); + sprintf(buf, "%s: %d", prefix, val); + 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_SUPPORT: + sprintf(buf, "%s: (%d-%d)", prefix, min, max); + 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_COMMAND_ONLY: + set_v250_value(server, prefix, deftval); + g_at_server_send_final(server, G_AT_SERVER_RESULT_OK); + break; + + default: + g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR); + break; + } +} + +static void at_e_cb(GAtServerRequestType type, GAtResult *result, + gpointer user_data) +{ + at_template_cb(type, result, user_data, "E", 0, 1, 1); +} + +static void at_q_cb(GAtServerRequestType type, GAtResult *result, + gpointer user_data) +{ + at_template_cb(type, result, user_data, "Q", 0, 1, 0); +} + +static void at_v_cb(GAtServerRequestType type, GAtResult *result, + gpointer user_data) +{ + at_template_cb(type, result, user_data, "V", 0, 1, 1); +} + +static void at_x_cb(GAtServerRequestType type, GAtResult *result, + gpointer user_data) +{ + at_template_cb(type, result, user_data, "X", 0, 4, 4); +} + +static void at_c109_cb(GAtServerRequestType type, GAtResult *result, + gpointer user_data) +{ + at_template_cb(type, result, user_data, "&C", 0, 1, 1); +} + +static void at_c108_cb(GAtServerRequestType type, GAtResult *result, + gpointer user_data) +{ + at_template_cb(type, result, user_data, "&D", 0, 2, 2); +} + static inline gboolean is_extended_command_prefix(const char c) { switch (c) { @@ -1076,6 +1224,12 @@ static void basic_command_register(GAtServer *server) g_at_server_register(server, "S3", at_s3_cb, server, NULL); g_at_server_register(server, "S4", at_s4_cb, server, NULL); g_at_server_register(server, "S5", at_s5_cb, server, NULL); + g_at_server_register(server, "E", at_e_cb, server, NULL); + g_at_server_register(server, "Q", at_q_cb, server, NULL); + g_at_server_register(server, "V", at_v_cb, server, NULL); + g_at_server_register(server, "X", at_x_cb, server, NULL); + g_at_server_register(server, "&C", at_c109_cb, server, NULL); + g_at_server_register(server, "&D", at_c108_cb, server, NULL); } GAtServer *g_at_server_new(GIOChannel *io)