aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2011-06-22 15:53:37 +0200
committerAleksander Morgado <aleksander@lanedo.com>2011-06-22 15:53:37 +0200
commit39abb023ed180d03ea8324285116e228b46cd411 (patch)
tree002868cbc9e5327e7347064bc3f01f60d18d386a /src
parenteae5d6c41be6652bac384340c47d274164007ebb (diff)
serial: new property to enable RTS/CTS flow control
Diffstat (limited to 'src')
-rw-r--r--src/mm-serial-port.c21
-rw-r--r--src/mm-serial-port.h1
2 files changed, 22 insertions, 0 deletions
diff --git a/src/mm-serial-port.c b/src/mm-serial-port.c
index 70e33672..617da5a3 100644
--- a/src/mm-serial-port.c
+++ b/src/mm-serial-port.c
@@ -45,6 +45,7 @@ enum {
PROP_SEND_DELAY,
PROP_FD,
PROP_SPEW_CONTROL,
+ PROP_RTS_CTS,
LAST_PROP
};
@@ -78,6 +79,7 @@ typedef struct {
guint stopbits;
guint64 send_delay;
gboolean spew_control;
+ gboolean rts_cts;
guint queue_id;
guint watch_id;
@@ -1059,6 +1061,7 @@ get_speed (MMSerialPort *self, speed_t *speed, GError **error)
static gboolean
set_speed (MMSerialPort *self, speed_t speed, GError **error)
{
+ MMSerialPortPrivate *priv = MM_SERIAL_PORT_GET_PRIVATE (self);
struct termios options;
int fd, count = 4;
gboolean success = FALSE;
@@ -1079,6 +1082,10 @@ set_speed (MMSerialPort *self, speed_t speed, GError **error)
cfsetospeed (&options, speed);
options.c_cflag |= (CLOCAL | CREAD);
+ /* Configure flow control as well here */
+ if (priv->rts_cts)
+ options.c_cflag |= (CRTSCTS);
+
while (count-- > 0) {
if (tcsetattr (fd, TCSANOW, &options) == 0) {
success = TRUE;
@@ -1311,6 +1318,9 @@ set_property (GObject *object, guint prop_id,
case PROP_SPEW_CONTROL:
priv->spew_control = g_value_get_boolean (value);
break;
+ case PROP_RTS_CTS:
+ priv->rts_cts = g_value_get_boolean (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1345,6 +1355,9 @@ get_property (GObject *object, guint prop_id,
case PROP_SPEW_CONTROL:
g_value_set_boolean (value, priv->spew_control);
break;
+ case PROP_RTS_CTS:
+ g_value_set_boolean (value, priv->rts_cts);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1455,6 +1468,14 @@ mm_serial_port_class_init (MMSerialPortClass *klass)
FALSE,
G_PARAM_READWRITE));
+ g_object_class_install_property
+ (object_class, PROP_RTS_CTS,
+ g_param_spec_boolean (MM_SERIAL_PORT_RTS_CTS,
+ "RTSCTS",
+ "Enable RTS/CTS flow control",
+ FALSE,
+ G_PARAM_READWRITE));
+
/* Signals */
signals[BUFFER_FULL] =
g_signal_new ("buffer-full",
diff --git a/src/mm-serial-port.h b/src/mm-serial-port.h
index e9997a58..a9f34402 100644
--- a/src/mm-serial-port.h
+++ b/src/mm-serial-port.h
@@ -35,6 +35,7 @@
#define MM_SERIAL_PORT_PARITY "parity"
#define MM_SERIAL_PORT_STOPBITS "stopbits"
#define MM_SERIAL_PORT_SEND_DELAY "send-delay"
+#define MM_SERIAL_PORT_RTS_CTS "rts-cts"
#define MM_SERIAL_PORT_FD "fd" /* Construct-only */
#define MM_SERIAL_PORT_SPEW_CONTROL "spew-control" /* Construct-only */