- switch (event_type) {
- case SR_DF_TRIGGER:
- sr_dbg("%s: SR_DF_TRIGGER event", __func__);
- /* TODO */
- *data_out = NULL;
- *length_out = 0;
- break;
- case SR_DF_END:
- sr_dbg("%s: SR_DF_END event", __func__);
- /* TODO */
- *data_out = NULL;
- *length_out = 0;
- g_free(o->internal);
- o->internal = NULL;
- break;
- default:
- sr_err("%s: unsupported event type: %d", __func__, event_type);
- *data_out = NULL;
- *length_out = 0;
+ switch (packet->type) {
+ case SR_DF_LOGIC:
+ logic = packet->payload;
+ if (ctx->header) {
+ /*
+ * First data packet: prime the output with the
+ * previously prepared header.
+ */
+ *out = ctx->header;
+ ctx->header = NULL;
+ } else {
+ *out = g_string_sized_new(512);
+ }
+
+ for (i = 0; i <= logic->length - logic->unitsize; i += logic->unitsize) {
+ for (j = 0; j < ctx->num_enabled_channels; j++) {
+ idx = ctx->channel_index[j];
+ p = logic->data + i + idx / 8;
+ c = *p & (1 << (idx % 8));
+ g_string_append_c(*out, c ? '1' : '0');
+ g_string_append_c(*out, ctx->separator);
+ }
+ if (j) {
+ /* Drop last separator. */
+ g_string_truncate(*out, (*out)->len - 1);
+ }
+ g_string_append_printf(*out, "\n");
+ }