From 72ae3b9a86f567399e14b3dd67a3766606463487 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Sat, 2 Oct 2010 16:58:30 +0200 Subject: [PATCH] Add a function to query the state of the serial lines. --- src/serial.h | 9 +++++++++ src/serial_posix.c | 29 +++++++++++++++++++++++++++++ src/serial_win32.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/src/serial.h b/src/serial.h index f0107c3..34e7560 100644 --- a/src/serial.h +++ b/src/serial.h @@ -46,6 +46,13 @@ typedef enum serial_queue_t { SERIAL_QUEUE_BOTH = SERIAL_QUEUE_INPUT | SERIAL_QUEUE_OUTPUT } serial_queue_t; +typedef enum serial_line_t { + SERIAL_LINE_DCD, // Data carrier detect + SERIAL_LINE_CTS, // Clear to send + SERIAL_LINE_DSR, // Data set ready + SERIAL_LINE_RNG, // Ring indicator +} serial_line_t; + int serial_errcode (void); const char* serial_errmsg (void); @@ -96,6 +103,8 @@ int serial_set_rts (serial_t *device, int level); int serial_get_received (serial_t *device); int serial_get_transmitted (serial_t *device); +int serial_get_line (serial_t *device, int line); + int serial_sleep (unsigned long timeout /* milliseconds */); int serial_timer (void); diff --git a/src/serial_posix.c b/src/serial_posix.c index 2f013cf..5ba5018 100644 --- a/src/serial_posix.c +++ b/src/serial_posix.c @@ -670,6 +670,35 @@ serial_get_transmitted (serial_t *device) } +int +serial_get_line (serial_t *device, int line) +{ + if (device == NULL) + return -1; // EINVAL (Invalid argument) + + int status = 0; + if (ioctl (device->fd, TIOCMGET, &status) != 0) { + TRACE ("ioctl"); + return -1; + } + + switch (line) { + case SERIAL_LINE_DCD: + return (status & TIOCM_CAR) == TIOCM_CAR; + case SERIAL_LINE_CTS: + return (status & TIOCM_CTS) == TIOCM_CTS; + case SERIAL_LINE_DSR: + return (status & TIOCM_DSR) == TIOCM_DSR; + case SERIAL_LINE_RNG: + return (status & TIOCM_RNG) == TIOCM_RNG; + default: + return -1; + } + + return 0; +} + + int serial_sleep (unsigned long timeout) { diff --git a/src/serial_win32.c b/src/serial_win32.c index 00ab15a..bddd9d8 100644 --- a/src/serial_win32.c +++ b/src/serial_win32.c @@ -529,6 +529,35 @@ serial_get_transmitted (serial_t *device) } +int +serial_get_line (serial_t *device, int line) +{ + if (device == NULL) + return -1; // ERROR_INVALID_PARAMETER (The parameter is incorrect) + + DWORD stats = 0; + if (!GetCommModemStatus (device->hFile, &stats)) { + TRACE ("GetCommModemStatus"); + return -1; + } + + switch (line) { + case SERIAL_LINE_DCD: + return (stats & MS_RLSD_ON) == MS_RLSD_ON; + case SERIAL_LINE_CTS: + return (stats & MS_CTS_ON) == MS_CTS_ON; + case SERIAL_LINE_DSR: + return (stats & MS_DSR_ON) == MS_DSR_ON; + case SERIAL_LINE_RNG: + return (stats & MS_RING_ON) == MS_RING_ON; + default: + return -1; + } + + return 0; +} + + int serial_sleep (unsigned long timeout) {