#include <unistd.h>
#include <string.h>
#include <glib.h>
-#include <sigrok.h>
-#include <sigrok-internal.h>
+#include "sigrok.h"
+#include "sigrok-internal.h"
/* demo.c */
extern GIOChannel channels[2];
};
/* There can only be one session at a time. */
+/* 'session' is not static, it's used elsewhere (via 'extern'). */
struct sr_session *session;
-int num_sources = 0;
-
-struct source *sources = NULL;
-int source_timeout = -1;
+static int num_sources = 0;
+static struct source *sources = NULL;
+static int source_timeout = -1;
struct sr_session *sr_session_new(void)
{
void sr_session_destroy(void)
{
-
g_slist_free(session->devices);
/* TODO: Loop over protocol decoders and free them. */
* or if the poll timeout out and this source
* asked for that timeout.
*/
- sources[i].cb(fds[i].fd, fds[i].revents,
- sources[i].user_data);
+ if (!sources[i].cb(fds[i].fd, fds[i].revents,
+ sources[i].user_data))
+ sr_session_source_remove(sources[i].fd);
}
}
}
free(fds);
-
}
int sr_session_start(void)
void sr_session_run(void)
{
-
sr_info("session: running");
session->running = TRUE;
else
/* real sources, use g_poll() main loop */
sr_session_run_poll();
-
}
void sr_session_halt(void)
{
-
sr_info("session: halting");
session->running = FALSE;
-
}
void sr_session_stop(void)
if (device->plugin && device->plugin->stop_acquisition)
device->plugin->stop_acquisition(device->plugin_index, device);
}
+}
+static void datafeed_dump(struct sr_datafeed_packet *packet)
+{
+ struct sr_datafeed_logic *logic;
+
+ switch (packet->type) {
+ case SR_DF_HEADER:
+ sr_dbg("bus: received SR_DF_HEADER");
+ break;
+ case SR_DF_TRIGGER:
+ sr_dbg("bus: received SR_DF_TRIGGER at %lu ms",
+ packet->timeoffset / 1000000);
+ break;
+ case SR_DF_LOGIC:
+ logic = packet->payload;
+ sr_dbg("bus: received SR_DF_LOGIC at %f ms duration %f ms, %"PRIu64" bytes",
+ packet->timeoffset / 1000000.0, packet->duration / 1000000.0,
+ logic->length);
+ break;
+ case SR_DF_END:
+ sr_dbg("bus: received SR_DF_END");
+ break;
+ default:
+ sr_dbg("bus: received unknown packet type %d", packet->type);
+ }
}
void sr_session_bus(struct sr_device *device, struct sr_datafeed_packet *packet)
*/
for (l = session->datafeed_callbacks; l; l = l->next) {
cb = l->data;
+ datafeed_dump(packet);
cb(device, packet);
}
}
return;
new_sources = calloc(1, sizeof(struct source) * num_sources);
- for (old = 0; old < num_sources; old++)
+ for (old = 0, new = 0; old < num_sources; old++)
if (sources[old].fd != fd)
memcpy(&new_sources[new++], &sources[old],
sizeof(struct source));
free(new_sources);
}
}
-