]> sigrok.org Git - libsigrok.git/blobdiff - src/output/csv.c
output/csv: Drop support for SR_DF_ANALOG_OLD.
[libsigrok.git] / src / output / csv.c
index 5f0d647c3d5605be98cc1c883b85be2a29b377ef..00265870be0b35ffcb2a022f8808daf372c4dc04 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
  */
 
+#include <config.h>
 #include <stdlib.h>
 #include <string.h>
 #include <glib.h>
-#include "config.h" /* Needed for PACKAGE_STRING and others. */
-#include "libsigrok.h"
+#include <libsigrok/libsigrok.h>
 #include "libsigrok-internal.h"
 
 #define LOG_PREFIX "output/csv"
@@ -118,8 +118,8 @@ static GString *gen_header(const struct sr_output *o)
 
        /* Some metadata */
        t = time(NULL);
-       g_string_append_printf(header, "; CSV, generated by %s on %s",
-                       PACKAGE_STRING, ctime(&t));
+       g_string_append_printf(header, "; CSV, generated by %s %s on %s",
+                       PACKAGE_NAME, SR_PACKAGE_VERSION_STRING, ctime(&t));
 
        /* Columns / channels */
        num_channels = g_slist_length(o->sdi->channels);
@@ -164,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;
        }
@@ -194,7 +194,9 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p
        const struct sr_datafeed_logic *logic;
        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;
@@ -224,7 +226,7 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p
                 */
                memset(ctx->analog_vals, 0, sizeof(float) * ctx->num_analog_channels);
                ctx->inframe = TRUE;
-               ret = SR_OK_CONTINUE;
+               ret = SR_OK;
                break;
        case SR_DF_FRAME_END:
                /*
@@ -267,10 +269,16 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p
                break;
        case SR_DF_ANALOG:
                analog = packet->payload;
+               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);
-                       ret = SR_OK_CONTINUE;
+                       handle_analog_frame(ctx, channels, num_samples, data);
                        break;
                }
 
@@ -278,9 +286,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;
 
@@ -288,11 +295,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;
@@ -303,7 +310,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;