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. */
* @{
*/
+/**
+ * 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.
*
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();