Add serial settings parser to modemconf plugin
authorRyan Raasch <ryan.raasch@gmail.com>
Tue, 27 Oct 2009 12:55:16 +0000 (13:55 +0100)
committerDenis Kenzior <denkenz@gmail.com>
Wed, 28 Oct 2009 21:39:19 +0000 (16:39 -0500)
plugins/atgen.c
plugins/modemconf.c

index c0fbbb2..db59e36 100644 (file)
 #include <ofono/ussd.h>
 #include <ofono/voicecall.h>
 
+static const char *tty_opts[] =
+  {
+         "Baud",
+         "Read",
+         "Local",
+         "StopBits",
+         "DataBits",
+         "Parity",
+         "XonXoff",
+         "Rtscts",
+         NULL,
+  };
+
+static void unregister_tty_option(gpointer data)
+{
+       g_free(data);
+}
+
 static int atgen_probe(struct ofono_modem *modem)
 {
        return 0;
@@ -68,6 +86,9 @@ static int atgen_enable(struct ofono_modem *modem)
        GIOChannel *channel;
        GAtSyntax *syntax;
        const char *device;
+       const char *value;
+       GHashTable *options;
+       int i = 0;
 
        DBG("%p", modem);
 
@@ -75,23 +96,44 @@ static int atgen_enable(struct ofono_modem *modem)
        if (!device)
                return -EINVAL;
 
-       channel = g_at_tty_open(device, NULL);
-       if (!channel)
+       options = g_hash_table_new_full(g_str_hash, g_str_equal,
+                                       g_free, unregister_tty_option);
+       if (!options)
+               return -ENOMEM;
+
+       while (tty_opts[i]) {
+
+               value = ofono_modem_get_string(modem, tty_opts[i]);
+               if (value) {
+                       g_hash_table_replace(options, g_strdup(tty_opts[i]),
+                                            g_strdup(value));
+               }
+               i++;
+       };
+
+       channel = g_at_tty_open(device, options);
+       if (!channel) {
+               g_hash_table_destroy(options);
                return -EIO;
+       }
 
        syntax = g_at_syntax_new_gsmv1();
        chat = g_at_chat_new(channel, syntax);
        g_at_syntax_unref(syntax);
        g_io_channel_unref(channel);
 
-       if (!chat)
+       if (!chat) {
+               g_hash_table_destroy(options);
                return -ENOMEM;
+       }
 
        if (getenv("OFONO_AT_DEBUG"))
                g_at_chat_set_debug(chat, atgen_debug, NULL);
 
        ofono_modem_set_data(modem, chat);
 
+       g_hash_table_destroy(options);
+
        return 0;
 }
 
index 192faa6..6b317e6 100644 (file)
@@ -72,7 +72,7 @@ static int set_address(struct ofono_modem *modem,
 static int set_device(struct ofono_modem *modem,
                                        GKeyFile *keyfile, const char *group)
 {
-       char *device;
+       char *device, *value;
 
        device = g_key_file_get_string(keyfile, group, "Device", NULL);
        if (!device)
@@ -82,6 +82,63 @@ static int set_device(struct ofono_modem *modem,
 
        g_free(device);
 
+       value = g_key_file_get_string(keyfile, group, "Baud", NULL);
+       if (value) {
+               ofono_modem_set_string(modem, "Baud", value);
+               g_free(value);
+       } else
+               ofono_modem_set_string(modem, "Baud", "115200");
+
+       value = g_key_file_get_string(keyfile, group, "Read", NULL);
+       if (value) {
+               ofono_modem_set_string(modem, "Read", value);
+               g_free(value);
+       } else
+               ofono_modem_set_string(modem, "Read", "on");
+
+       value = g_key_file_get_string(keyfile, group, "Local", NULL);
+       if (value) {
+               ofono_modem_set_string(modem, "Local", value);
+               g_free(value);
+       } else
+               ofono_modem_set_string(modem, "Local", "none");
+
+       value = g_key_file_get_string(keyfile, group, "StopBits", NULL);
+       if (value) {
+               ofono_modem_set_string(modem, "StopBits", value);
+               g_free(value);
+       } else
+               ofono_modem_set_string(modem, "StopBits", "1");
+
+       value = g_key_file_get_string(keyfile, group, "DataBits", NULL);
+       if (value) {
+               ofono_modem_set_string(modem, "DataBits", value);
+               g_free(value);
+       } else
+               ofono_modem_set_string(modem, "Databits", "8");
+
+       value = g_key_file_get_string(keyfile, group, "Parity", NULL);
+       if (value) {
+               ofono_modem_set_string(modem, "Parity", value);
+               g_free(value);
+       } else
+               ofono_modem_set_string(modem, "Parity", "none");
+
+       value = g_key_file_get_string(keyfile, group, "XonXoff", NULL);
+       if (value) {
+               ofono_modem_set_string(modem, "XonXoff", value);
+               g_free(value);
+       } else
+               ofono_modem_set_string(modem, "XonXoff", "off");
+
+       value = g_key_file_get_string(keyfile, group, "Rtscts", NULL);
+       if (value) {
+               ofono_modem_set_string(modem, "Rtscts", value);
+               g_free(value);
+       } else
+               ofono_modem_set_string(modem, "Rtscts", "on");
+
+
        return 0;
 }