aboutsummaryrefslogtreecommitdiff
path: root/src/mm-at-serial-port.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mm-at-serial-port.c')
-rw-r--r--src/mm-at-serial-port.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/mm-at-serial-port.c b/src/mm-at-serial-port.c
index 840f38a0..5215ab24 100644
--- a/src/mm-at-serial-port.c
+++ b/src/mm-at-serial-port.c
@@ -31,6 +31,8 @@ G_DEFINE_TYPE (MMAtSerialPort, mm_at_serial_port, MM_TYPE_SERIAL_PORT)
enum {
PROP_0,
PROP_REMOVE_ECHO,
+ PROP_INIT_SEQUENCE_ENABLED,
+ PROP_INIT_SEQUENCE,
LAST_PROP
};
@@ -44,7 +46,10 @@ typedef struct {
MMAtPortFlag flags;
+ /* Properties */
gboolean remove_echo;
+ guint init_sequence_enabled;
+ gchar **init_sequence;
} MMAtSerialPortPrivate;
/*****************************************************************************/
@@ -417,6 +422,40 @@ mm_at_serial_port_get_flags (MMAtSerialPort *self)
/*****************************************************************************/
+void
+mm_at_serial_port_run_init_sequence (MMAtSerialPort *self)
+{
+ MMAtSerialPortPrivate *priv = MM_AT_SERIAL_PORT_GET_PRIVATE (self);
+ guint i;
+
+ if (!priv->init_sequence)
+ return;
+
+ mm_dbg ("(%s): running init sequence...", mm_port_get_device (MM_PORT (self)));
+
+ /* Just queue the init commands, don't wait for reply */
+ for (i = 0; priv->init_sequence[i]; i++) {
+ mm_at_serial_port_queue_command (self,
+ priv->init_sequence[i],
+ 3,
+ FALSE,
+ NULL,
+ NULL,
+ NULL);
+ }
+}
+
+static void
+config (MMSerialPort *self)
+{
+ MMAtSerialPortPrivate *priv = MM_AT_SERIAL_PORT_GET_PRIVATE (self);
+
+ if (priv->init_sequence_enabled)
+ mm_at_serial_port_run_init_sequence (MM_AT_SERIAL_PORT (self));
+}
+
+/*****************************************************************************/
+
MMAtSerialPort *
mm_at_serial_port_new (const char *name)
{
@@ -434,6 +473,8 @@ mm_at_serial_port_init (MMAtSerialPort *self)
/* By default, remove echo */
priv->remove_echo = TRUE;
+ /* By default, run init sequence during first port opening */
+ priv->init_sequence_enabled = TRUE;
}
static void
@@ -446,6 +487,13 @@ set_property (GObject *object, guint prop_id,
case PROP_REMOVE_ECHO:
priv->remove_echo = g_value_get_boolean (value);
break;
+ case PROP_INIT_SEQUENCE_ENABLED:
+ priv->init_sequence_enabled = g_value_get_boolean (value);
+ break;
+ case PROP_INIT_SEQUENCE:
+ g_strfreev (priv->init_sequence);
+ priv->init_sequence = g_value_dup_boxed (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -462,6 +510,12 @@ get_property (GObject *object, guint prop_id,
case PROP_REMOVE_ECHO:
g_value_set_boolean (value, priv->remove_echo);
break;
+ case PROP_INIT_SEQUENCE_ENABLED:
+ g_value_set_boolean (value, priv->init_sequence_enabled);
+ break;
+ case PROP_INIT_SEQUENCE:
+ g_value_set_boxed (value, priv->init_sequence);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -509,6 +563,7 @@ mm_at_serial_port_class_init (MMAtSerialPortClass *klass)
port_class->parse_response = parse_response;
port_class->handle_response = handle_response;
port_class->debug_log = debug_log;
+ port_class->config = config;
g_object_class_install_property
(object_class, PROP_REMOVE_ECHO,
@@ -517,4 +572,20 @@ mm_at_serial_port_class_init (MMAtSerialPortClass *klass)
"Built-in echo removal should be applied",
TRUE,
G_PARAM_READWRITE));
+
+ g_object_class_install_property
+ (object_class, PROP_INIT_SEQUENCE_ENABLED,
+ g_param_spec_boolean (MM_AT_SERIAL_PORT_INIT_SEQUENCE_ENABLED,
+ "Init sequence enabled",
+ "Whether the initialization sequence should be run",
+ TRUE,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property
+ (object_class, PROP_INIT_SEQUENCE,
+ g_param_spec_boxed (MM_AT_SERIAL_PORT_INIT_SEQUENCE,
+ "Init sequence",
+ "Initialization sequence",
+ G_TYPE_STRV,
+ G_PARAM_READWRITE));
}