X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;ds=inline;f=src%2Fserial.c;h=27244da34b6513c6e0cc4b9461fd4d417b3f652b;hb=e91d4ce2b2a2b34fe4cabb3082a2c325941de1f9;hp=6d33b3bf9f9e543dbed815cccae6a5ad8ec77b1d;hpb=f3f19d1131025b68d29a11273b627c83d748e7ea;p=libsigrok.git
diff --git a/src/serial.c b/src/serial.c
index 6d33b3bf..27244da3 100644
--- a/src/serial.c
+++ b/src/serial.c
@@ -20,13 +20,17 @@
* along with this program. If not, see .
*/
+#include
#include
#include
#include
#include
#include
-#include "libsigrok.h"
+#include
#include "libsigrok-internal.h"
+#ifdef G_OS_WIN32
+#include /* for HANDLE */
+#endif
/** @cond PRIVATE */
#define LOG_PREFIX "serial"
@@ -264,7 +268,7 @@ static int _serial_write(struct sr_serial_dev_inst *serial,
return SR_ERR;
}
- sr_spew("Wrote %d/%d bytes.", ret, count);
+ sr_spew("Wrote %zd/%zu bytes.", ret, count);
return ret;
}
@@ -342,7 +346,7 @@ static int _serial_read(struct sr_serial_dev_inst *serial, void *buf,
}
if (ret > 0)
- sr_spew("Read %d/%d bytes.", ret, count);
+ sr_spew("Read %zd/%zu bytes.", ret, count);
return ret;
}
@@ -516,13 +520,13 @@ SR_PRIV int serial_set_paramstr(struct sr_serial_dev_inst *serial,
if ((mstr = g_match_info_fetch(match, 3))) {
switch (mstr[0]) {
case 'n':
- parity = SERIAL_PARITY_NONE;
+ parity = SP_PARITY_NONE;
break;
case 'e':
- parity = SERIAL_PARITY_EVEN;
+ parity = SP_PARITY_EVEN;
break;
case 'o':
- parity = SERIAL_PARITY_ODD;
+ parity = SP_PARITY_ODD;
break;
}
}
@@ -680,7 +684,7 @@ SR_PRIV int serial_stream_detect(struct sr_serial_dev_inst *serial,
{
uint64_t start, time, byte_delay_us;
size_t ibuf, i, maxlen;
- int len;
+ ssize_t len;
maxlen = *buflen;
@@ -693,7 +697,7 @@ SR_PRIV int serial_stream_detect(struct sr_serial_dev_inst *serial,
}
/* Assume 8n1 transmission. That is 10 bits for every byte. */
- byte_delay_us = 10 * (1000000 / baudrate);
+ byte_delay_us = 10 * ((1000 * 1000) / baudrate);
start = g_get_monotonic_time();
i = ibuf = len = 0;
@@ -713,12 +717,12 @@ SR_PRIV int serial_stream_detect(struct sr_serial_dev_inst *serial,
if ((ibuf - i) >= packet_size) {
/* We have at least a packet's worth of data. */
if (is_valid(&buf[i])) {
- sr_spew("Found valid %d-byte packet after "
+ sr_spew("Found valid %zu-byte packet after "
"%" PRIu64 "ms.", (ibuf - i), time);
*buflen = ibuf;
return SR_OK;
} else {
- sr_spew("Got %d bytes, but not a valid "
+ sr_spew("Got %zu bytes, but not a valid "
"packet.", (ibuf - i));
}
/* Not a valid packet. Continue searching. */
@@ -726,7 +730,7 @@ SR_PRIV int serial_stream_detect(struct sr_serial_dev_inst *serial,
}
if (time >= timeout_ms) {
/* Timeout */
- sr_dbg("Detection timed out after %dms.", time);
+ sr_dbg("Detection timed out after %" PRIu64 "ms.", time);
break;
}
if (len < 1)
@@ -735,7 +739,7 @@ SR_PRIV int serial_stream_detect(struct sr_serial_dev_inst *serial,
*buflen = ibuf;
- sr_err("Didn't find a valid packet (read %d bytes).", *buflen);
+ sr_err("Didn't find a valid packet (read %zu bytes).", *buflen);
return SR_ERR;
}
@@ -784,7 +788,7 @@ SR_PRIV int sr_serial_extract_options(GSList *options, const char **serial_devic
}
/** @cond PRIVATE */
-#ifdef _WIN32
+#ifdef G_OS_WIN32
typedef HANDLE event_handle;
#else
typedef int event_handle;
@@ -796,10 +800,17 @@ SR_PRIV int serial_source_add(struct sr_session *session,
struct sr_serial_dev_inst *serial, int events, int timeout,
sr_receive_data_callback cb, void *cb_data)
{
+ struct sp_event_set *event_set;
+ gintptr poll_fd;
+ unsigned int poll_events;
enum sp_event mask = 0;
- unsigned int i;
- if (sp_new_event_set(&serial->event_set) != SP_OK)
+ if ((events & (G_IO_IN|G_IO_ERR)) && (events & G_IO_OUT)) {
+ sr_err("Cannot poll input/error and output simultaneously.");
+ return SR_ERR_ARG;
+ }
+
+ if (sp_new_event_set(&event_set) != SP_OK)
return SR_ERR;
if (events & G_IO_IN)
@@ -809,51 +820,44 @@ SR_PRIV int serial_source_add(struct sr_session *session,
if (events & G_IO_ERR)
mask |= SP_EVENT_ERROR;
- if (sp_add_port_events(serial->event_set, serial->data, mask) != SP_OK) {
- sp_free_event_set(serial->event_set);
+ if (sp_add_port_events(event_set, serial->data, mask) != SP_OK) {
+ sp_free_event_set(event_set);
return SR_ERR;
}
-
- serial->pollfds = (GPollFD *) g_malloc0(sizeof(GPollFD) * serial->event_set->count);
-
- for (i = 0; i < serial->event_set->count; i++) {
-
- serial->pollfds[i].fd = ((event_handle *) serial->event_set->handles)[i];
-
- mask = serial->event_set->masks[i];
-
- if (mask & SP_EVENT_RX_READY)
- serial->pollfds[i].events |= G_IO_IN;
- if (mask & SP_EVENT_TX_READY)
- serial->pollfds[i].events |= G_IO_OUT;
- if (mask & SP_EVENT_ERROR)
- serial->pollfds[i].events |= G_IO_ERR;
-
- if (sr_session_source_add_pollfd(session, &serial->pollfds[i],
- timeout, cb, cb_data) != SR_OK)
- return SR_ERR;
+ if (event_set->count != 1) {
+ sr_err("Unexpected number (%u) of event handles to poll.",
+ event_set->count);
+ sp_free_event_set(event_set);
+ return SR_ERR;
}
- return SR_OK;
+ poll_fd = (gintptr) ((event_handle *)event_set->handles)[0];
+ mask = event_set->masks[0];
+
+ sp_free_event_set(event_set);
+
+ poll_events = 0;
+ if (mask & SP_EVENT_RX_READY)
+ poll_events |= G_IO_IN;
+ if (mask & SP_EVENT_TX_READY)
+ poll_events |= G_IO_OUT;
+ if (mask & SP_EVENT_ERROR)
+ poll_events |= G_IO_ERR;
+ /*
+ * Using serial->data as the key for the event source is not quite
+ * proper, as it makes it impossible to create another event source
+ * for the same serial port. However, these fixed keys will soon be
+ * removed from the API anyway, so this is OK for now.
+ */
+ return sr_session_fd_source_add(session, serial->data,
+ poll_fd, poll_events, timeout, cb, cb_data);
}
/** @private */
SR_PRIV int serial_source_remove(struct sr_session *session,
struct sr_serial_dev_inst *serial)
{
- unsigned int i;
-
- for (i = 0; i < serial->event_set->count; i++)
- if (sr_session_source_remove_pollfd(session, &serial->pollfds[i]) != SR_OK)
- return SR_ERR;
-
- g_free(serial->pollfds);
- sp_free_event_set(serial->event_set);
-
- serial->pollfds = NULL;
- serial->event_set = NULL;
-
- return SR_OK;
+ return sr_session_source_remove_internal(session, serial->data);
}
/**