at-serial-port: new property to control whether echo removal should be applied
This commit is contained in:
@@ -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))
|
#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 {
|
typedef struct {
|
||||||
/* Response parser data */
|
/* Response parser data */
|
||||||
MMAtSerialResponseParserFn response_parser_fn;
|
MMAtSerialResponseParserFn response_parser_fn;
|
||||||
@@ -36,8 +42,9 @@ typedef struct {
|
|||||||
GDestroyNotify response_parser_notify;
|
GDestroyNotify response_parser_notify;
|
||||||
GSList *unsolicited_msg_handlers;
|
GSList *unsolicited_msg_handlers;
|
||||||
MMAtPortFlags flags;
|
MMAtPortFlags flags;
|
||||||
} MMAtSerialPortPrivate;
|
|
||||||
|
|
||||||
|
gboolean remove_echo;
|
||||||
|
} MMAtSerialPortPrivate;
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
@@ -90,7 +97,8 @@ parse_response (MMSerialPort *port, GByteArray *response, GError **error)
|
|||||||
g_return_val_if_fail (priv->response_parser_fn != NULL, FALSE);
|
g_return_val_if_fail (priv->response_parser_fn != NULL, FALSE);
|
||||||
|
|
||||||
/* Remove echo */
|
/* Remove echo */
|
||||||
mm_at_serial_port_remove_echo (response);
|
if (priv->remove_echo)
|
||||||
|
mm_at_serial_port_remove_echo (response);
|
||||||
|
|
||||||
/* Construct the string that AT-parsing functions expect */
|
/* Construct the string that AT-parsing functions expect */
|
||||||
string = g_string_sized_new (response->len + 1);
|
string = g_string_sized_new (response->len + 1);
|
||||||
@@ -184,7 +192,8 @@ parse_unsolicited (MMSerialPort *port, GByteArray *response)
|
|||||||
GSList *iter;
|
GSList *iter;
|
||||||
|
|
||||||
/* Remove echo */
|
/* Remove echo */
|
||||||
mm_at_serial_port_remove_echo (response);
|
if (priv->remove_echo)
|
||||||
|
mm_at_serial_port_remove_echo (response);
|
||||||
|
|
||||||
for (iter = priv->unsolicited_msg_handlers; iter; iter = iter->next) {
|
for (iter = priv->unsolicited_msg_handlers; iter; iter = iter->next) {
|
||||||
MMAtUnsolicitedMsgHandler *handler = (MMAtUnsolicitedMsgHandler *) iter->data;
|
MMAtUnsolicitedMsgHandler *handler = (MMAtUnsolicitedMsgHandler *) iter->data;
|
||||||
@@ -360,6 +369,42 @@ mm_at_serial_port_new (const char *name)
|
|||||||
static void
|
static void
|
||||||
mm_at_serial_port_init (MMAtSerialPort *self)
|
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
|
static void
|
||||||
@@ -395,10 +440,20 @@ mm_at_serial_port_class_init (MMAtSerialPortClass *klass)
|
|||||||
g_type_class_add_private (object_class, sizeof (MMAtSerialPortPrivate));
|
g_type_class_add_private (object_class, sizeof (MMAtSerialPortPrivate));
|
||||||
|
|
||||||
/* Virtual methods */
|
/* Virtual methods */
|
||||||
|
object_class->set_property = set_property;
|
||||||
|
object_class->get_property = get_property;
|
||||||
object_class->finalize = finalize;
|
object_class->finalize = finalize;
|
||||||
|
|
||||||
port_class->parse_unsolicited = parse_unsolicited;
|
port_class->parse_unsolicited = parse_unsolicited;
|
||||||
port_class->parse_response = parse_response;
|
port_class->parse_response = parse_response;
|
||||||
port_class->handle_response = handle_response;
|
port_class->handle_response = handle_response;
|
||||||
port_class->debug_log = debug_log;
|
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));
|
||||||
}
|
}
|
||||||
|
@@ -63,6 +63,8 @@ typedef void (*MMAtSerialResponseFn) (MMAtSerialPort *port,
|
|||||||
GError *error,
|
GError *error,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
|
|
||||||
|
#define MM_AT_SERIAL_PORT_REMOVE_ECHO "remove-echo"
|
||||||
|
|
||||||
struct _MMAtSerialPort {
|
struct _MMAtSerialPort {
|
||||||
MMSerialPort parent;
|
MMSerialPort parent;
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user