1
0
mirror of git://sigrok.org/libserialport synced 2023-08-10 21:13:24 +03:00

Add sp_get_signals() function.

This commit is contained in:
Martin Ling 2013-11-20 18:56:35 +00:00 committed by Bert Vermeulen
parent 90cc3ee62b
commit 8cf7c6978f
2 changed files with 64 additions and 0 deletions

View 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.
*

View 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();