]> sigrok.org Git - libserialport.git/commitdiff
Add sp_get_signals() function.
authorMartin Ling <redacted>
Wed, 20 Nov 2013 18:56:35 +0000 (18:56 +0000)
committerBert Vermeulen <redacted>
Fri, 22 Nov 2013 01:11:40 +0000 (02:11 +0100)
libserialport.h.in
serialport.c

index 704ffed02fb8e02f9f3b5685f9c1640137687d5e..79babac9a70b21fa49f1ab0b12a63cb2af378125 100644 (file)
@@ -201,6 +201,18 @@ enum sp_flowcontrol {
        SP_FLOWCONTROL_DTRDSR = 3,
 };
 
+/** Input signals. */
+enum sp_signal {
+       /** Clear to send. */
+       SP_SIG_CTS = 1,
+       /** Data set ready. */
+       SP_SIG_DSR = 2,
+       /** Data carrier detect. */
+       SP_SIG_DCD = 4,
+       /** Ring indicator. */
+       SP_SIG_RI = 8,
+};
+
 /** A serial port. */
 struct sp_port {
        /** Name used to open the port. */
@@ -540,6 +552,22 @@ enum sp_return sp_drain(struct sp_port *port);
  * @{
  */
 
+/**
+ * Gets the status of the control signals for the specified port.
+ *
+ * The user should allocate a variable of type "enum sp_signal" and pass a
+ * pointer to this variable to receive the result. The result is a bitmask
+ * in which individual signals can be checked by bitwise OR with values of
+ * the sp_signal enum.
+ *
+ * @param port Pointer to port structure.
+ * @param signals Pointer to variable to receive result.
+ *
+ * @return SP_OK on success, SP_ERR_FAIL on failure, or SP_ERR_ARG
+ *         if an an invalid port or pointer is passed.
+ */
+enum sp_return sp_get_signals(struct sp_port *port, enum sp_signal *signals);
+
 /**
  * Put the port transmit line into the break state.
  *
index ab1baa76df2cadd5a8af15e5807c6e55c2a80e80..522cafa5e014eebb705bce00da23653a31232d44 100644 (file)
@@ -1298,6 +1298,42 @@ 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();