flags = TCIOFLUSH;
else if (buffers & SP_BUF_INPUT)
flags = TCIFLUSH;
- if (buffers & SP_BUF_OUTPUT)
+ else if (buffers & SP_BUF_OUTPUT)
flags = TCOFLUSH;
/* Returns 0 upon success, -1 upon failure. */
/* Non-standard baud rate */
if (i == NUM_STD_BAUDRATES) {
#ifdef __APPLE__
- /* Set "dummy" baud rate */
+ /* Set "dummy" baud rate. */
if (cfsetspeed(&data->term, B9600) < 0)
return SP_ERR_FAIL;
baud_nonstd = config->baudrate;
#ifdef USE_TERMIOX
data->flow &= ~(RTS_FLOW | CTS_FLOW);
switch (config->rts) {
- case SP_RTS_OFF:
- case SP_RTS_ON:
- controlbits = TIOCM_RTS;
- if (ioctl(port->fd, config->rts == SP_RTS_ON ? TIOCMBIS : TIOCMBIC,
- &controlbits) < 0)
- return SP_ERR_FAIL;
- break;
- case SP_RTS_FLOW_CONTROL:
- data->flow |= RTS_FLOW;
- break;
- default:
- break;
+ case SP_RTS_OFF:
+ case SP_RTS_ON:
+ controlbits = TIOCM_RTS;
+ if (ioctl(port->fd, config->rts == SP_RTS_ON ? TIOCMBIS : TIOCMBIC, &controlbits) < 0)
+ return SP_ERR_FAIL;
+ break;
+ case SP_RTS_FLOW_CONTROL:
+ data->flow |= RTS_FLOW;
+ break;
+ default:
+ break;
}
if (config->cts == SP_CTS_FLOW_CONTROL)
data->flow |= CTS_FLOW;
#ifdef USE_TERMIOX
data->flow &= ~(DTR_FLOW | DSR_FLOW);
switch (config->dtr) {
- case SP_DTR_OFF:
- case SP_DTR_ON:
- controlbits = TIOCM_DTR;
- if (ioctl(port->fd, config->dtr == SP_DTR_ON ? TIOCMBIS : TIOCMBIC,
- &controlbits) < 0)
- return SP_ERR_FAIL;
- break;
- case SP_DTR_FLOW_CONTROL:
- data->flow |= DTR_FLOW;
- break;
- default:
- break;
+ case SP_DTR_OFF:
+ case SP_DTR_ON:
+ controlbits = TIOCM_DTR;
+ if (ioctl(port->fd, config->dtr == SP_DTR_ON ? TIOCMBIS : TIOCMBIC, &controlbits) < 0)
+ return SP_ERR_FAIL;
+ break;
+ case SP_DTR_FLOW_CONTROL:
+ data->flow |= DTR_FLOW;
+ break;
+ default:
+ break;
}
if (config->dsr == SP_DSR_FLOW_CONTROL)
data->flow |= DSR_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();
+#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