at-serial-port: new property to control whether echo removal should be applied

This commit is contained in:
Aleksander Morgado
2012-03-13 19:02:03 +01:00
parent 7c9ba7faf2
commit 791e097ab5
2 changed files with 60 additions and 3 deletions

View File

@@ -29,6 +29,12 @@ G_DEFINE_TYPE (MMAtSerialPort, mm_at_serial_port, MM_TYPE_SERIAL_PORT)
#define MM_AT_SERIAL_PORT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MM_TYPE_AT_SERIAL_PORT, MMAtSerialPortPrivate))
enum {
PROP_0,
PROP_REMOVE_ECHO,
LAST_PROP
};
typedef struct {
/* Response parser data */
MMAtSerialResponseParserFn response_parser_fn;
@@ -36,8 +42,9 @@ typedef struct {
GDestroyNotify response_parser_notify;
GSList *unsolicited_msg_handlers;
MMAtPortFlags flags;
} MMAtSerialPortPrivate;
gboolean remove_echo;
} MMAtSerialPortPrivate;
/*****************************************************************************/
@@ -90,6 +97,7 @@ parse_response (MMSerialPort *port, GByteArray *response, GError **error)
g_return_val_if_fail (priv->response_parser_fn != NULL, FALSE);
/* Remove echo */
if (priv->remove_echo)
mm_at_serial_port_remove_echo (response);
/* Construct the string that AT-parsing functions expect */
@@ -184,6 +192,7 @@ parse_unsolicited (MMSerialPort *port, GByteArray *response)
GSList *iter;
/* Remove echo */
if (priv->remove_echo)
mm_at_serial_port_remove_echo (response);
for (iter = priv->unsolicited_msg_handlers; iter; iter = iter->next) {
@@ -360,6 +369,42 @@ mm_at_serial_port_new (const char *name)
static void
mm_at_serial_port_init (MMAtSerialPort *self)
{
MMAtSerialPortPrivate *priv = MM_AT_SERIAL_PORT_GET_PRIVATE (self);
/* By default, remove echo */
priv->remove_echo = TRUE;
}
static void
set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec)
{
MMAtSerialPortPrivate *priv = MM_AT_SERIAL_PORT_GET_PRIVATE (object);
switch (prop_id) {
case PROP_REMOVE_ECHO:
priv->remove_echo = g_value_get_boolean (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec)
{
MMAtSerialPortPrivate *priv = MM_AT_SERIAL_PORT_GET_PRIVATE (object);
switch (prop_id) {
case PROP_REMOVE_ECHO:
g_value_set_boolean (value, priv->remove_echo);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
@@ -395,10 +440,20 @@ mm_at_serial_port_class_init (MMAtSerialPortClass *klass)
g_type_class_add_private (object_class, sizeof (MMAtSerialPortPrivate));
/* Virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
port_class->parse_unsolicited = parse_unsolicited;
port_class->parse_response = parse_response;
port_class->handle_response = handle_response;
port_class->debug_log = debug_log;
g_object_class_install_property
(object_class, PROP_REMOVE_ECHO,
g_param_spec_boolean (MM_AT_SERIAL_PORT_REMOVE_ECHO,
"Remove echo",
"Built-in echo removal should be applied",
TRUE,
G_PARAM_READWRITE));
}

View File

@@ -63,6 +63,8 @@ typedef void (*MMAtSerialResponseFn) (MMAtSerialPort *port,
GError *error,
gpointer user_data);
#define MM_AT_SERIAL_PORT_REMOVE_ECHO "remove-echo"
struct _MMAtSerialPort {
MMSerialPort parent;
};