X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fserial.c;h=27244da34b6513c6e0cc4b9461fd4d417b3f652b;hb=refs%2Fheads%2Flibsigrok-0.4.x;hp=25e2b97b3ce63ef30e04317e50c9e3b7303462f2;hpb=2634b7781242796352616a571b794700f409baf7;p=libsigrok.git diff --git a/src/serial.c b/src/serial.c index 25e2b97b..27244da3 100644 --- a/src/serial.c +++ b/src/serial.c @@ -20,6 +20,7 @@ * along with this program. If not, see . */ +#include #include #include #include @@ -27,6 +28,9 @@ #include #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; @@ -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,54 +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; - - if (!serial->event_set) - return SR_OK; - - 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); } /**