]> sigrok.org Git - libserialport.git/blobdiff - serialport.c
Minor cosmetics.
[libserialport.git] / serialport.c
index 6104f241a17cb34db7638ef00ac9cebaff4529ce..5e776072b2d580b206af740fe6df969d094bc413 100644 (file)
@@ -525,7 +525,7 @@ enum sp_return sp_flush(struct sp_port *port, enum sp_buffer buffers)
                flags = TCIOFLUSH;
        else if (buffers & SP_BUF_INPUT)
                flags = TCIFLUSH;
-       if (buffers & SP_BUF_OUTPUT)
+       else if (buffers & SP_BUF_OUTPUT)
                flags = TCOFLUSH;
 
        /* Returns 0 upon success, -1 upon failure. */
@@ -1028,7 +1028,7 @@ static enum sp_return set_config(struct sp_port *port, struct port_data *data,
                /* Non-standard baud rate */
                if (i == NUM_STD_BAUDRATES) {
 #ifdef __APPLE__
-                       /* Set "dummy" baud rate */
+                       /* Set "dummy" baud rate. */
                        if (cfsetspeed(&data->term, B9600) < 0)
                                return SP_ERR_FAIL;
                        baud_nonstd = config->baudrate;
@@ -1096,18 +1096,17 @@ static enum sp_return set_config(struct sp_port *port, struct port_data *data,
 #ifdef USE_TERMIOX
                data->flow &= ~(RTS_FLOW | CTS_FLOW);
                switch (config->rts) {
-                       case SP_RTS_OFF:
-                       case SP_RTS_ON:
-                               controlbits = TIOCM_RTS;
-                               if (ioctl(port->fd, config->rts == SP_RTS_ON ? TIOCMBIS : TIOCMBIC,
-                                               &controlbits) < 0)
-                                       return SP_ERR_FAIL;
-                               break;
-                       case SP_RTS_FLOW_CONTROL:
-                               data->flow |= RTS_FLOW;
-                               break;
-                       default:
-                               break;
+               case SP_RTS_OFF:
+               case SP_RTS_ON:
+                       controlbits = TIOCM_RTS;
+                       if (ioctl(port->fd, config->rts == SP_RTS_ON ? TIOCMBIS : TIOCMBIC, &controlbits) < 0)
+                               return SP_ERR_FAIL;
+                       break;
+               case SP_RTS_FLOW_CONTROL:
+                       data->flow |= RTS_FLOW;
+                       break;
+               default:
+                       break;
                }
                if (config->cts == SP_CTS_FLOW_CONTROL)
                        data->flow |= CTS_FLOW;
@@ -1152,18 +1151,17 @@ static enum sp_return set_config(struct sp_port *port, struct port_data *data,
 #ifdef USE_TERMIOX
                data->flow &= ~(DTR_FLOW | DSR_FLOW);
                switch (config->dtr) {
-                       case SP_DTR_OFF:
-                       case SP_DTR_ON:
-                               controlbits = TIOCM_DTR;
-                               if (ioctl(port->fd, config->dtr == SP_DTR_ON ? TIOCMBIS : TIOCMBIC,
-                                               &controlbits) < 0)
-                                       return SP_ERR_FAIL;
-                               break;
-                       case SP_DTR_FLOW_CONTROL:
-                               data->flow |= DTR_FLOW;
-                               break;
-                       default:
-                               break;
+               case SP_DTR_OFF:
+               case SP_DTR_ON:
+                       controlbits = TIOCM_DTR;
+                       if (ioctl(port->fd, config->dtr == SP_DTR_ON ? TIOCMBIS : TIOCMBIC, &controlbits) < 0)
+                               return SP_ERR_FAIL;
+                       break;
+               case SP_DTR_FLOW_CONTROL:
+                       data->flow |= DTR_FLOW;
+                       break;
+               default:
+                       break;
                }
                if (config->dsr == SP_DSR_FLOW_CONTROL)
                        data->flow |= DSR_FLOW;
@@ -1298,6 +1296,70 @@ enum sp_return sp_set_flowcontrol(struct sp_port *port, enum sp_flowcontrol flow
        return SP_OK;
 }
 
+enum sp_return sp_get_signals(struct sp_port *port, enum sp_signal *signals)
+{
+       CHECK_PORT();
+
+       if (!signals)
+               return SP_ERR_ARG;
+
+       *signals = 0;
+#ifdef _WIN32
+       DWORD bits;
+       if (GetCommModemStatus(port->hdl, &bits) == 0)
+               return SP_ERR_FAIL;
+       if (bits & MS_CTS_ON)
+               *signals |= SP_SIG_CTS;
+       if (bits & MS_DSR_ON)
+               *signals |= SP_SIG_DSR;
+       if (bits & MS_RING_ON)
+               *signals |= SP_SIG_DCD;
+       if (bits & MS_RLSD_ON)
+               *signals |= SP_SIG_RI;
+#else
+       int bits;
+       if (ioctl(port->fd, TIOCMGET, &bits) < 0)
+               return SP_ERR_FAIL;
+       if (bits & TIOCM_CTS)
+               *signals |= SP_SIG_CTS;
+       if (bits & TIOCM_DSR)
+               *signals |= SP_SIG_DSR;
+       if (bits & TIOCM_CAR)
+               *signals |= SP_SIG_DCD;
+       if (bits & TIOCM_RNG)
+               *signals |= SP_SIG_RI;
+#endif
+       return SP_OK;
+}
+
+enum sp_return sp_start_break(struct sp_port *port)
+{
+       CHECK_PORT();
+#ifdef _WIN32
+       if (SetCommBreak(port->hdl) == 0)
+               return SP_ERR_FAIL;
+#else
+       if (ioctl(port->fd, TIOCSBRK, 1) < 0)
+               return SP_ERR_FAIL;
+#endif
+
+       return SP_OK;
+}
+
+enum sp_return sp_end_break(struct sp_port *port)
+{
+       CHECK_PORT();
+#ifdef _WIN32
+       if (ClearCommBreak(port->hdl) == 0)
+               return SP_ERR_FAIL;
+#else
+       if (ioctl(port->fd, TIOCCBRK, 1) < 0)
+               return SP_ERR_FAIL;
+#endif
+
+       return SP_OK;
+}
+
 int sp_last_error_code(void)
 {
 #ifdef _WIN32