aboutsummaryrefslogtreecommitdiff
path: root/src/mm-port-serial.c
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2017-03-25 18:18:46 +0100
committerAleksander Morgado <aleksander@aleksander.es>2017-04-18 18:08:57 +0200
commit580c113c5a4c9c8b74edce3808f0c6f0b43e2025 (patch)
tree11d5bad84c895fd49997944045dd4ac94c8111b1 /src/mm-port-serial.c
parent3223b56ba9f61c4339d74829748ae6937cffc196 (diff)
port-serial: new method to explicitly set flow control settings
Diffstat (limited to 'src/mm-port-serial.c')
-rw-r--r--src/mm-port-serial.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/mm-port-serial.c b/src/mm-port-serial.c
index f2b97a02..e55f9062 100644
--- a/src/mm-port-serial.c
+++ b/src/mm-port-serial.c
@@ -1778,6 +1778,56 @@ mm_port_serial_flash (MMPortSerial *self,
/*****************************************************************************/
+gboolean
+mm_port_serial_set_flow_control (MMPortSerial *self,
+ MMFlowControl flow_control,
+ GError **error)
+{
+ struct termios options;
+ gboolean had_xon_xoff;
+ gboolean had_rts_cts;
+
+ /* retrieve current settings */
+ memset (&options, 0, sizeof (struct termios));
+ if (tcgetattr (self->priv->fd, &options) != 0) {
+ g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "couldn't get serial port attributes: %s", g_strerror (errno));
+ return FALSE;
+ }
+
+ /* clear all flow control flags */
+
+ had_xon_xoff = !!(options.c_iflag & (IXON | IXOFF));
+ options.c_iflag &= ~(IXON | IXOFF | IXANY);
+
+ had_rts_cts = !!(options.c_cflag & (CRTSCTS));
+ options.c_cflag &= ~(CRTSCTS);
+
+ /* setup the requested flags */
+ switch (flow_control) {
+ case MM_FLOW_CONTROL_XON_XOFF:
+ mm_dbg ("(%s): enabling XON/XOFF flow control", mm_port_get_device (MM_PORT (self)));
+ options.c_iflag |= (IXON | IXOFF | IXANY);
+ break;
+ case MM_FLOW_CONTROL_RTS_CTS:
+ mm_dbg ("(%s): enabling RTS/CTS flow control", mm_port_get_device (MM_PORT (self)));
+ options.c_cflag |= (CRTSCTS);
+ break;
+ case MM_FLOW_CONTROL_NONE:
+ if (had_xon_xoff)
+ mm_dbg ("(%s): disabling XON/XOFF flow control", mm_port_get_device (MM_PORT (self)));
+ if (had_rts_cts)
+ mm_dbg ("(%s): disabling RTS/CTS flow control", mm_port_get_device (MM_PORT (self)));
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+
+ return internal_tcsetattr (self, self->priv->fd, &options, error);
+}
+
+/*****************************************************************************/
+
MMPortSerial *
mm_port_serial_new (const char *name, MMPortType ptype)
{