#include <unistd.h>
#include <string.h>
#include <glib.h>
-#include "libsigrok.h"
+#include <libsigrok/libsigrok.h>
#include "libsigrok-internal.h"
/** @cond PRIVATE */
static int sr_session_iteration(struct sr_session *session, gboolean block)
{
unsigned int i;
- int ret;
+ int ret, timeout;
+#ifdef HAVE_LIBUSB_1_0
+ int usb_timeout;
+ struct timeval tv;
+#endif
- ret = g_poll(session->pollfds, session->num_sources,
- block ? session->source_timeout : 0);
+ timeout = block ? session->source_timeout : 0;
+
+#ifdef HAVE_LIBUSB_1_0
+ if (session->ctx->usb_source_present) {
+ timeout = block ? 0 : session->source_timeout;
+ ret = libusb_get_next_timeout(session->ctx->libusb_ctx, &tv);
+ if (ret < 0) {
+ sr_err("Error getting libusb timeout: %s",
+ libusb_error_name(ret));
+ return SR_ERR;
+ } else if (ret == 1) {
+ usb_timeout = tv.tv_sec * 1000 + tv.tv_usec / 1000;
+ timeout = MIN(timeout, usb_timeout);
+ }
+ }
+#endif
+
+ ret = g_poll(session->pollfds, session->num_sources, timeout);
for (i = 0; i < session->num_sources; i++) {
if (session->pollfds[i].revents > 0 || (ret == 0
&& session->source_timeout == session->sources[i].timeout)) {
const struct sr_datafeed_analog *analog;
const struct sr_datafeed_analog2 *analog2;
+ /* Please use the same order as in libsigrok.h. */
switch (packet->type) {
case SR_DF_HEADER:
sr_dbg("bus: Received SR_DF_HEADER packet.");
break;
- case SR_DF_TRIGGER:
- sr_dbg("bus: Received SR_DF_TRIGGER packet.");
+ case SR_DF_END:
+ sr_dbg("bus: Received SR_DF_END packet.");
break;
case SR_DF_META:
sr_dbg("bus: Received SR_DF_META packet.");
break;
+ case SR_DF_TRIGGER:
+ sr_dbg("bus: Received SR_DF_TRIGGER packet.");
+ break;
case SR_DF_LOGIC:
logic = packet->payload;
sr_dbg("bus: Received SR_DF_LOGIC packet (%" PRIu64 " bytes, "
sr_dbg("bus: Received SR_DF_ANALOG packet (%d samples).",
analog->num_samples);
break;
- case SR_DF_ANALOG2:
- analog2 = packet->payload;
- sr_dbg("bus: Received SR_DF_ANALOG2 packet (%d samples).",
- analog2->num_samples);
- break;
- case SR_DF_END:
- sr_dbg("bus: Received SR_DF_END packet.");
- break;
case SR_DF_FRAME_BEGIN:
sr_dbg("bus: Received SR_DF_FRAME_BEGIN packet.");
break;
case SR_DF_FRAME_END:
sr_dbg("bus: Received SR_DF_FRAME_END packet.");
break;
+ case SR_DF_ANALOG2:
+ analog2 = packet->payload;
+ sr_dbg("bus: Received SR_DF_ANALOG2 packet (%d samples).",
+ analog2->num_samples);
+ break;
default:
sr_dbg("bus: Received unknown packet type: %d.", packet->type);
break;
packet_in = packet_out;
}
}
+ packet = packet_in;
/*
* If the last transform did output a packet, pass it to all datafeed