X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Foutput%2Fcsv.c;h=db023a476050c59ffdb88ef144c8a84377413442;hb=bee2b0168c087676c1b365861d8c2d4714afa9b9;hp=8b234424c22211a0976552a131fbb5c549a7d0e6;hpb=b93006789f5cbce740bb2cece5a87d2969076e25;p=libsigrok.git diff --git a/src/output/csv.c b/src/output/csv.c index 8b234424..db023a47 100644 --- a/src/output/csv.c +++ b/src/output/csv.c @@ -18,6 +18,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include #include #include @@ -163,24 +164,24 @@ static void init_output(GString **out, struct context *ctx, } } -static void handle_analog_frame(struct context *ctx, - const struct sr_datafeed_analog *analog) +static void handle_analog_frame(struct context *ctx, GSList *channels, + unsigned int num_samples, float *data) { unsigned int numch, nums, i, j, s; GSList *l; - numch = g_slist_length(analog->channels); - if ((unsigned int)analog->num_samples > numch) - nums = analog->num_samples / numch; + numch = g_slist_length(channels); + if (num_samples > numch) + nums = num_samples / numch; else nums = 1; s = 0; - l = analog->channels; + l = channels; for (i = 0; i < nums; i++) { for (j = 0; j < ctx->num_analog_channels; j++) { if (ctx->analog_channels[j] == l->data) - ctx->analog_vals[j] = analog->data[s++]; + ctx->analog_vals[j] = data[s++]; } l = l->next; } @@ -191,9 +192,12 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p { const struct sr_datafeed_meta *meta; const struct sr_datafeed_logic *logic; + const struct sr_datafeed_analog_old *analog_old; const struct sr_datafeed_analog *analog; const struct sr_config *src; - GSList *l; + unsigned int num_samples; + float *data; + GSList *l, *channels; struct context *ctx; int idx; uint64_t i, j, k, nums, numch; @@ -264,11 +268,28 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p g_string_append_printf(*out, "\n"); } break; + case SR_DF_ANALOG_OLD: case SR_DF_ANALOG: + analog_old = packet->payload; analog = packet->payload; + if (packet->type == SR_DF_ANALOG_OLD) { + channels = analog_old->channels; + numch = g_slist_length(channels); + num_samples = analog_old->num_samples; + data = analog_old->data; + } else { + channels = analog->meaning->channels; + numch = g_slist_length(channels); + num_samples = analog->num_samples; + data = g_malloc(sizeof(float) * num_samples * numch); + ret = sr_analog_to_float(analog, data); + if (ret != SR_OK) + return ret; + } + if (ctx->inframe) { - handle_analog_frame(ctx, analog); + handle_analog_frame(ctx, channels, num_samples, data); break; } @@ -276,9 +297,8 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p k = 0; l = NULL; - numch = g_slist_length(analog->channels); - if ((unsigned int)analog->num_samples > numch) - nums = analog->num_samples / numch; + if (num_samples > numch) + nums = num_samples / numch; else nums = 1; @@ -286,11 +306,11 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p for (j = 0; j < ctx->num_enabled_channels; j++) { if (ctx->channels[j]->type == SR_CHANNEL_ANALOG) { if (!l) - l = analog->channels; + l = channels; if (ctx->channels[j] == l->data) { g_string_append_printf(*out, - "%f", analog->data[k++]); + "%f", data[k++]); } l = l->next; @@ -301,7 +321,6 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p g_string_append_printf(*out, "\n"); } break; - /* TODO case SR_DF_ANALOG2: */ } return ret;