]> sigrok.org Git - libserialport.git/blobdiff - serialport.c
Add sp_get_signals() function.
[libserialport.git] / serialport.c
index 92156b476471cdf73f3a3efefe05bba69aff6795..522cafa5e014eebb705bce00da23653a31232d44 100644 (file)
@@ -535,6 +535,23 @@ enum sp_return sp_flush(struct sp_port *port, enum sp_buffer buffers)
        return SP_OK;
 }
 
+enum sp_return sp_drain(struct sp_port *port)
+{
+       CHECK_PORT();
+
+#ifdef _WIN32
+       /* Returns non-zero upon success, 0 upon failure. */
+       if (FlushFileBuffers(port->hdl) == 0)
+               return SP_ERR_FAIL;
+#else
+       /* Returns 0 upon success, -1 upon failure. */
+       if (tcdrain(port->fd) < 0)
+               return SP_ERR_FAIL;
+#endif
+
+       return SP_OK;
+}
+
 enum sp_return sp_write(struct sp_port *port, const void *buf, size_t count)
 {
        CHECK_PORT();
@@ -1281,6 +1298,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