return SP_OK;
}
-enum sp_return sp_flush(struct sp_port *port)
+enum sp_return sp_flush(struct sp_port *port, enum sp_buffer buffers)
+{
+ CHECK_PORT();
+
+#ifdef _WIN32
+ DWORD flags = 0;
+ if (buffers & SP_BUF_INPUT)
+ flags |= PURGE_RXCLEAR;
+ if (buffers & SP_BUF_OUTPUT)
+ flags |= PURGE_TXCLEAR;
+
+ /* Returns non-zero upon success, 0 upon failure. */
+ if (PurgeComm(port->hdl, flags) == 0)
+ return SP_ERR_FAIL;
+#else
+ int flags = 0;
+ if (buffers & SP_BUF_BOTH)
+ flags = TCIOFLUSH;
+ else if (buffers & SP_BUF_INPUT)
+ flags = TCIFLUSH;
+ if (buffers & SP_BUF_OUTPUT)
+ flags = TCOFLUSH;
+
+ /* Returns 0 upon success, -1 upon failure. */
+ if (tcflush(port->fd, flags) < 0)
+ return SP_ERR_FAIL;
+#endif
+ 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 (PurgeComm(port->hdl, PURGE_RXCLEAR | PURGE_TXCLEAR) == 0)
+ if (FlushFileBuffers(port->hdl) == 0)
return SP_ERR_FAIL;
#else
/* Returns 0 upon success, -1 upon failure. */
- if (tcflush(port->fd, TCIOFLUSH) < 0)
+ if (tcdrain(port->fd) < 0)
return SP_ERR_FAIL;
#endif
+
return SP_OK;
}
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