]> sigrok.org Git - libsigrok.git/commitdiff
sr: change input/output modules to use struct sr_dev_inst *
authorBert Vermeulen <redacted>
Fri, 20 Jul 2012 19:37:36 +0000 (21:37 +0200)
committerBert Vermeulen <redacted>
Fri, 3 Aug 2012 09:27:31 +0000 (11:27 +0200)
input/binary.c
input/chronovu_la8.c
libsigrok.h
output/chronovu_la8.c
output/csv.c
output/float.c
output/gnuplot.c
output/ols.c
output/text/text.c
output/vcd.c

index 53c0ebb5bf2339793834df4e0c607ed181c0ca8d..8348ea82dd9870a6aa223c6fcc804dc5fe4ad0c2 100644 (file)
@@ -44,6 +44,7 @@ static int format_match(const char *filename)
 
 static int init(struct sr_input *in)
 {
+       struct sr_probe *probe;
        int num_probes, i;
        char name[SR_MAX_PROBENAME_LEN + 1];
        char *param;
@@ -73,13 +74,15 @@ static int init(struct sr_input *in)
        }
 
        /* Create a virtual device. */
-       in->vdev = sr_dev_new(NULL, 0);
+       in->sdi = sr_dev_inst_new(0, SR_ST_ACTIVE, NULL, NULL, NULL);
        in->internal = ctx;
 
        for (i = 0; i < num_probes; i++) {
                snprintf(name, SR_MAX_PROBENAME_LEN, "%d", i);
                /* TODO: Check return value. */
-               sr_dev_probe_add(in->vdev, name);
+               if (!(probe = sr_probe_new(i, SR_PROBE_LOGIC, TRUE, name)))
+                       return SR_ERR;
+               in->sdi->probes = g_slist_append(in->sdi->probes, probe);
        }
 
        return SR_OK;
@@ -100,21 +103,21 @@ static int loadfile(struct sr_input *in, const char *filename)
        if ((fd = open(filename, O_RDONLY)) == -1)
                return SR_ERR;
 
-       num_probes = g_slist_length(in->vdev->probes);
+       num_probes = g_slist_length(in->sdi->probes);
 
        /* send header */
        header.feed_version = 1;
        gettimeofday(&header.starttime, NULL);
        packet.type = SR_DF_HEADER;
        packet.payload = &header;
-       sr_session_send(in->vdev, &packet);
+       sr_session_send(in->sdi, &packet);
 
        /* Send metadata about the SR_DF_LOGIC packets to come. */
        packet.type = SR_DF_META_LOGIC;
        packet.payload = &meta;
        meta.samplerate = ctx->samplerate;
        meta.num_probes = num_probes;
-       sr_session_send(in->vdev, &packet);
+       sr_session_send(in->sdi, &packet);
 
        /* chop up the input file into chunks and feed it into the session bus */
        packet.type = SR_DF_LOGIC;
@@ -123,13 +126,13 @@ static int loadfile(struct sr_input *in, const char *filename)
        logic.data = buffer;
        while ((size = read(fd, buffer, CHUNKSIZE)) > 0) {
                logic.length = size;
-               sr_session_send(in->vdev, &packet);
+               sr_session_send(in->sdi, &packet);
        }
        close(fd);
 
        /* end of stream */
        packet.type = SR_DF_END;
-       sr_session_send(in->vdev, &packet);
+       sr_session_send(in->sdi, &packet);
 
        g_free(ctx);
        in->internal = NULL;
index 681b812df4d03e759b4e61dc0fe6476875eb5119..c4b3b403be3f3ceb94c5c5a0fcb05a6e56f0e1b4 100644 (file)
@@ -94,6 +94,7 @@ static int format_match(const char *filename)
 
 static int init(struct sr_input *in)
 {
+       struct sr_probe *probe;
        int num_probes, i;
        char name[SR_MAX_PROBENAME_LEN + 1];
        char *param;
@@ -112,12 +113,14 @@ static int init(struct sr_input *in)
        }
 
        /* Create a virtual device. */
-       in->vdev = sr_dev_new(NULL, 0);
+       in->sdi = sr_dev_inst_new(0, SR_ST_ACTIVE, NULL, NULL, NULL);
 
        for (i = 0; i < num_probes; i++) {
                snprintf(name, SR_MAX_PROBENAME_LEN, "%d", i);
                /* TODO: Check return value. */
-               sr_dev_probe_add(in->vdev, name);
+               if (!(probe = sr_probe_new(i, SR_PROBE_LOGIC, TRUE, name)))
+                       return SR_ERR;
+               in->sdi->probes = g_slist_append(in->sdi->probes, probe);
        }
 
        return SR_OK;
@@ -139,7 +142,7 @@ static int loadfile(struct sr_input *in, const char *filename)
                return SR_ERR;
        }
 
-       num_probes = g_slist_length(in->vdev->probes);
+       num_probes = g_slist_length(in->sdi->probes);
 
        /* Seek to the end of the file, and read the divcount byte. */
        divcount = 0x00; /* TODO: Don't hardcode! */
@@ -158,14 +161,14 @@ static int loadfile(struct sr_input *in, const char *filename)
        packet.payload = &header;
        header.feed_version = 1;
        gettimeofday(&header.starttime, NULL);
-       sr_session_send(in->vdev, &packet);
+       sr_session_send(in->sdi, &packet);
 
        /* Send metadata about the SR_DF_LOGIC packets to come. */
        packet.type = SR_DF_META_LOGIC;
        packet.payload = &meta;
        meta.samplerate = samplerate;
        meta.num_probes = num_probes;
-       sr_session_send(in->vdev, &packet);
+       sr_session_send(in->sdi, &packet);
 
        /* TODO: Handle trigger point. */
 
@@ -181,7 +184,7 @@ static int loadfile(struct sr_input *in, const char *filename)
                /* TODO: Handle errors, handle incomplete reads. */
                size = read(fd, buf, PACKET_SIZE);
                logic.length = size;
-               sr_session_send(in->vdev, &packet);
+               sr_session_send(in->sdi, &packet);
        }
        close(fd); /* FIXME */
 
@@ -189,7 +192,7 @@ static int loadfile(struct sr_input *in, const char *filename)
        sr_dbg("la8 in: %s: sending SR_DF_END", __func__);
        packet.type = SR_DF_END;
        packet.payload = NULL;
-       sr_session_send(in->vdev, &packet);
+       sr_session_send(in->sdi, &packet);
 
        return SR_OK;
 }
index 9a6ec097efdf0d6a61e3d3483bef1240d3f4820a..911319a9b8c398892b376ab5fb7af94570e321b5 100644 (file)
@@ -194,7 +194,7 @@ struct sr_datafeed_analog {
 struct sr_input {
        struct sr_input_format *format;
        GHashTable *param;
-       struct sr_dev *vdev;
+       struct sr_dev_inst *sdi;
        void *internal;
 };
 
@@ -208,7 +208,7 @@ struct sr_input_format {
 
 struct sr_output {
        struct sr_output_format *format;
-       struct sr_dev *dev;
+       struct sr_dev_inst *sdi;
        char *param;
        void *internal;
 };
index 345a6545a8b4e9eb2709894abce61143acd525f0..688e1b54bd3f521e962a6c97036294d431d7bc1c 100644 (file)
@@ -86,20 +86,20 @@ static int init(struct sr_output *o)
        struct context *ctx;
        struct sr_probe *probe;
        GSList *l;
-       uint64_t samplerate;
+       uint64_t *samplerate;
 
        if (!o) {
                sr_warn("la8 out: %s: o was NULL", __func__);
                return SR_ERR_ARG;
        }
 
-       if (!o->dev) {
-               sr_warn("la8 out: %s: o->dev was NULL", __func__);
+       if (!o->sdi) {
+               sr_warn("la8 out: %s: o->sdi was NULL", __func__);
                return SR_ERR_ARG;
        }
 
-       if (!o->dev->driver) {
-               sr_warn("la8 out: %s: o->dev->driver was NULL", __func__);
+       if (!o->sdi->driver) {
+               sr_warn("la8 out: %s: o->sdi->driver was NULL", __func__);
                return SR_ERR_ARG;
        }
 
@@ -111,8 +111,7 @@ static int init(struct sr_output *o)
        o->internal = ctx;
 
        /* Get the probe names and the unitsize. */
-       /* TODO: Error handling. */
-       for (l = o->dev->probes; l; l = l->next) {
+       for (l = o->sdi->probes; l; l = l->next) {
                probe = l->data;
                if (!probe->enabled)
                        continue;
@@ -121,16 +120,14 @@ static int init(struct sr_output *o)
        ctx->probelist[ctx->num_enabled_probes] = 0;
        ctx->unitsize = (ctx->num_enabled_probes + 7) / 8;
 
-       if (sr_dev_has_hwcap(o->dev, SR_HWCAP_SAMPLERATE)) {
-               samplerate = *((uint64_t *) o->dev->driver->dev_info_get(
-                               o->dev->driver_index, SR_DI_CUR_SAMPLERATE));
-               /* TODO: Error checks. */
-       } else {
-               samplerate = 0; /* TODO: Error or set some value? */
-       }
-       ctx->samplerate = samplerate;
+       if (sr_dev_has_hwcap(o->sdi, SR_HWCAP_SAMPLERATE)) {
+               o->sdi->driver->info_get(SR_DI_CUR_SAMPLERATE,
+                               (const void **)&samplerate, o->sdi);
+               ctx->samplerate = *samplerate;
+       } else
+               ctx->samplerate = 0;
 
-       return 0; /* TODO: SR_OK? */
+       return SR_OK;
 }
 
 static int event(struct sr_output *o, int event_type, uint8_t **data_out,
index 6091711d4dae22b58cfc87bf9748cfec35eab40f..31e4d8d9c78eef6d874b3d41ccf3115fd1973fbc 100644 (file)
@@ -52,7 +52,7 @@ static int init(struct sr_output *o)
        struct sr_probe *probe;
        GSList *l;
        int num_probes;
-       uint64_t samplerate;
+       uint64_t *samplerate;
        time_t t;
        unsigned int i;
 
@@ -61,13 +61,13 @@ static int init(struct sr_output *o)
                return SR_ERR_ARG;
        }
 
-       if (!o->dev) {
-               sr_err("csv out: %s: o->dev was NULL", __func__);
+       if (!o->sdi) {
+               sr_err("csv out: %s: o->sdi was NULL", __func__);
                return SR_ERR_ARG;
        }
 
-       if (!o->dev->driver) {
-               sr_err("csv out: %s: o->dev->driver was NULL", __func__);
+       if (!o->sdi->driver) {
+               sr_err("csv out: %s: o->sdi->driver was NULL", __func__);
                return SR_ERR_ARG;
        }
 
@@ -79,8 +79,7 @@ static int init(struct sr_output *o)
        o->internal = ctx;
 
        /* Get the number of probes, their names, and the unitsize. */
-       /* TODO: Error handling. */
-       for (l = o->dev->probes; l; l = l->next) {
+       for (l = o->sdi->probes; l; l = l->next) {
                probe = l->data;
                if (!probe->enabled)
                        continue;
@@ -89,19 +88,16 @@ static int init(struct sr_output *o)
        ctx->probelist[ctx->num_enabled_probes] = 0;
        ctx->unitsize = (ctx->num_enabled_probes + 7) / 8;
 
-       num_probes = g_slist_length(o->dev->probes);
+       num_probes = g_slist_length(o->sdi->probes);
 
-       if (sr_dev_has_hwcap(o->dev, SR_HWCAP_SAMPLERATE)) {
-               samplerate = *((uint64_t *) o->dev->driver->dev_info_get(
-                               o->dev->driver_index, SR_DI_CUR_SAMPLERATE));
-               /* TODO: Error checks. */
-       } else {
-               samplerate = 0; /* TODO: Error or set some value? */
-       }
-       ctx->samplerate = samplerate;
+       if (sr_dev_has_hwcap(o->sdi, SR_HWCAP_SAMPLERATE)) {
+               o->sdi->driver->info_get(SR_DI_CUR_SAMPLERATE,
+                               (const void **)&samplerate, o->sdi);
+               ctx->samplerate = *samplerate;
+       } else
+               ctx->samplerate = 0;
 
        ctx->separator = ',';
-
        ctx->header = g_string_sized_new(512);
 
        t = time(NULL);
@@ -119,7 +115,7 @@ static int init(struct sr_output *o)
                g_string_append_printf(ctx->header, "%s, ", ctx->probelist[i]);
        g_string_append_printf(ctx->header, "\n");
 
-       return 0; /* TODO: SR_OK? */
+       return SR_OK;
 }
 
 static int event(struct sr_output *o, int event_type, uint8_t **data_out,
index e0622ceb6e60e39b91e779bc889c8b81f8be7b8c..650decc793532d0cd92310bba7db5e180b32a5f7 100644 (file)
@@ -38,10 +38,10 @@ static int init(struct sr_output *o)
        if (!o)
                return SR_ERR_ARG;
 
-       if (!o->dev)
+       if (!o->sdi)
                return SR_ERR_ARG;
 
-       if (!o->dev->driver)
+       if (!o->sdi->driver)
                return SR_ERR_ARG;
 
        if (!(ctx = g_try_malloc0(sizeof(struct context))))
@@ -51,7 +51,7 @@ static int init(struct sr_output *o)
 
        /* Get the number of probes and their names. */
        ctx->probelist = g_ptr_array_new();
-       for (l = o->dev->probes; l; l = l->next) {
+       for (l = o->sdi->probes; l; l = l->next) {
                probe = l->data;
                if (!probe || !probe->enabled)
                        continue;
index 765f84eb744981e9490b34a7afbe3de08dd15321..a2124bb16e0218d29add9f1e7612297de2e33add 100644 (file)
@@ -54,7 +54,7 @@ static int init(struct sr_output *o)
        struct context *ctx;
        struct sr_probe *probe;
        GSList *l;
-       uint64_t samplerate;
+       uint64_t *samplerate;
        unsigned int i;
        int b, num_probes;
        char *c, *frequency_s;
@@ -66,13 +66,13 @@ static int init(struct sr_output *o)
                return SR_ERR_ARG;
        }
 
-       if (!o->dev) {
-               sr_err("gnuplot out: %s: o->dev was NULL", __func__);
+       if (!o->sdi) {
+               sr_err("gnuplot out: %s: o->sdi was NULL", __func__);
                return SR_ERR_ARG;
        }
 
-       if (!o->dev->driver) {
-               sr_err("gnuplot out: %s: o->dev->driver was NULL", __func__);
+       if (!o->sdi->driver) {
+               sr_err("gnuplot out: %s: o->sdi->driver was NULL", __func__);
                return SR_ERR_ARG;
        }
 
@@ -89,7 +89,7 @@ static int init(struct sr_output *o)
 
        o->internal = ctx;
        ctx->num_enabled_probes = 0;
-       for (l = o->dev->probes; l; l = l->next) {
+       for (l = o->sdi->probes; l; l = l->next) {
                probe = l->data; /* TODO: Error checks. */
                if (!probe->enabled)
                        continue;
@@ -98,12 +98,12 @@ static int init(struct sr_output *o)
        ctx->probelist[ctx->num_enabled_probes] = 0;
        ctx->unitsize = (ctx->num_enabled_probes + 7) / 8;
 
-       num_probes = g_slist_length(o->dev->probes);
+       num_probes = g_slist_length(o->sdi->probes);
        comment[0] = '\0';
-       if (sr_dev_has_hwcap(o->dev, SR_HWCAP_SAMPLERATE)) {
-               samplerate = *((uint64_t *) o->dev->driver->dev_info_get(
-                               o->dev->driver_index, SR_DI_CUR_SAMPLERATE));
-               if (!(frequency_s = sr_samplerate_string(samplerate))) {
+       if (sr_dev_has_hwcap(o->sdi, SR_HWCAP_SAMPLERATE)) {
+               o->sdi->driver->info_get(SR_DI_CUR_SAMPLERATE,
+                               (const void **)&samplerate, o->sdi);
+               if (!(frequency_s = sr_samplerate_string(*samplerate))) {
                        sr_err("gnuplot out: %s: sr_samplerate_string failed",
                               __func__);
                        g_free(ctx->header);
@@ -122,7 +122,7 @@ static int init(struct sr_output *o)
                sprintf(c, "# %d\t\t%s\n", i + 1, ctx->probelist[i]);
        }
 
-       if (!(frequency_s = sr_period_string(samplerate))) {
+       if (!(frequency_s = sr_period_string(*samplerate))) {
                sr_err("gnuplot out: %s: sr_period_string failed", __func__);
                g_free(ctx->header);
                g_free(ctx);
index 6ba384a9bcd679dbaee67a9c67831df73ef08c0b..df6752742a38dd2d94d773c44a00d8afc58a7ee8 100644 (file)
@@ -42,7 +42,7 @@ static int init(struct sr_output *o)
        struct context *ctx;
        struct sr_probe *probe;
        GSList *l;
-       uint64_t samplerate;
+       uint64_t *samplerate, tmp;
        int num_enabled_probes;
 
        if (!(ctx = g_try_malloc(sizeof(struct context)))) {
@@ -53,21 +53,23 @@ static int init(struct sr_output *o)
 
        ctx->num_samples = 0;
        num_enabled_probes = 0;
-       for (l = o->dev->probes; l; l = l->next) {
+       for (l = o->sdi->probes; l; l = l->next) {
                probe = l->data;
                if (probe->enabled)
                        num_enabled_probes++;
        }
        ctx->unitsize = (num_enabled_probes + 7) / 8;
 
-       if (o->dev->driver && sr_dev_has_hwcap(o->dev, SR_HWCAP_SAMPLERATE))
-               samplerate = *((uint64_t *) o->dev->driver->dev_info_get(
-                               o->dev->driver_index, SR_DI_CUR_SAMPLERATE));
-       else
-               samplerate = 0;
+       if (o->sdi->driver && sr_dev_has_hwcap(o->sdi, SR_HWCAP_SAMPLERATE))
+               o->sdi->driver->info_get(SR_DI_CUR_SAMPLERATE,
+                               (const void **)&samplerate, o->sdi);
+       else {
+               tmp = 0;
+               samplerate = &tmp;
+       }
 
        ctx->header = g_string_sized_new(512);
-       g_string_append_printf(ctx->header, ";Rate: %"PRIu64"\n", samplerate);
+       g_string_append_printf(ctx->header, ";Rate: %"PRIu64"\n", *samplerate);
        g_string_append_printf(ctx->header, ";Channels: %d\n", num_enabled_probes);
        g_string_append_printf(ctx->header, ";EnabledChannels: -1\n");
        g_string_append_printf(ctx->header, ";Compressed: true\n");
index c48743218991f3c533b99e25237c23b8a96ae43b..41f88356c10eea015e1614f5aecebb23cacc587c 100644 (file)
@@ -70,8 +70,8 @@ SR_PRIV int init(struct sr_output *o, int default_spl, enum outputmode mode)
        struct context *ctx;
        struct sr_probe *probe;
        GSList *l;
-       uint64_t samplerate;
-       int num_probes;
+       uint64_t *samplerate;
+       int num_probes, ret;
        char *samplerate_s;
 
        if (!(ctx = g_try_malloc0(sizeof(struct context)))) {
@@ -82,7 +82,7 @@ SR_PRIV int init(struct sr_output *o, int default_spl, enum outputmode mode)
        o->internal = ctx;
        ctx->num_enabled_probes = 0;
 
-       for (l = o->dev->probes; l; l = l->next) {
+       for (l = o->sdi->probes; l; l = l->next) {
                probe = l->data;
                if (!probe->enabled)
                        continue;
@@ -98,26 +98,29 @@ SR_PRIV int init(struct sr_output *o, int default_spl, enum outputmode mode)
 
        if (o->param && o->param[0]) {
                ctx->samples_per_line = strtoul(o->param, NULL, 10);
-               if (ctx->samples_per_line < 1)
-                       return SR_ERR;
+               if (ctx->samples_per_line < 1) {
+                       ret = SR_ERR;
+                       goto err;
+               }
        } else
                ctx->samples_per_line = default_spl;
 
        if (!(ctx->header = g_try_malloc0(512))) {
-               g_free(ctx);
                sr_err("text out: %s: ctx->header malloc failed", __func__);
-               return SR_ERR_MALLOC;
+               ret = SR_ERR_MALLOC;
+               goto err;
        }
 
        snprintf(ctx->header, 511, "%s\n", PACKAGE_STRING);
-       num_probes = g_slist_length(o->dev->probes);
-       if (o->dev->driver || sr_dev_has_hwcap(o->dev, SR_HWCAP_SAMPLERATE)) {
-               samplerate = *((uint64_t *) o->dev->driver->dev_info_get(
-                               o->dev->driver_index, SR_DI_CUR_SAMPLERATE));
-               if (!(samplerate_s = sr_samplerate_string(samplerate))) {
-                       g_free(ctx->header);
-                       g_free(ctx);
-                       return SR_ERR;
+       num_probes = g_slist_length(o->sdi->probes);
+       if (o->sdi->driver || sr_dev_has_hwcap(o->sdi, SR_HWCAP_SAMPLERATE)) {
+               ret = o->sdi->driver->info_get(SR_DI_CUR_SAMPLERATE,
+                               (const void **)&samplerate, o->sdi);
+               if (ret != SR_OK)
+                       goto err;
+               if (!(samplerate_s = sr_samplerate_string(*samplerate))) {
+                       ret = SR_ERR;
+                       goto err;
                }
                snprintf(ctx->header + strlen(ctx->header),
                         511 - strlen(ctx->header),
@@ -128,19 +131,23 @@ SR_PRIV int init(struct sr_output *o, int default_spl, enum outputmode mode)
 
        ctx->linebuf_len = ctx->samples_per_line * 2 + 4;
        if (!(ctx->linebuf = g_try_malloc0(num_probes * ctx->linebuf_len))) {
-               g_free(ctx->header);
-               g_free(ctx);
                sr_err("text out: %s: ctx->linebuf malloc failed", __func__);
-               return SR_ERR_MALLOC;
+               ret = SR_ERR_MALLOC;
+               goto err;
        }
+
        if (!(ctx->linevalues = g_try_malloc0(num_probes))) {
+               sr_err("text out: %s: ctx->linevalues malloc failed", __func__);
+               ret = SR_ERR_MALLOC;
+       }
+
+err:
+       if (ret != SR_OK) {
                g_free(ctx->header);
                g_free(ctx);
-               sr_err("text out: %s: ctx->linevalues malloc failed", __func__);
-               return SR_ERR_MALLOC;
        }
 
-       return SR_OK;
+       return ret;
 }
 
 SR_PRIV int event(struct sr_output *o, int event_type, uint8_t **data_out,
index 7f7342795e139c670b89a5e57b16342a6913bcb8..3a2114c8d3a991aa006240e039c954f961b628f7 100644 (file)
@@ -45,6 +45,7 @@ static int init(struct sr_output *o)
        struct context *ctx;
        struct sr_probe *probe;
        GSList *l;
+       uint64_t *samplerate;
        int num_probes, i;
        char *samplerate_s, *frequency_s, *timestamp;
        time_t t;
@@ -57,7 +58,7 @@ static int init(struct sr_output *o)
        o->internal = ctx;
        ctx->num_enabled_probes = 0;
 
-       for (l = o->dev->probes; l; l = l->next) {
+       for (l = o->sdi->probes; l; l = l->next) {
                probe = l->data;
                if (!probe->enabled)
                        continue;
@@ -71,7 +72,7 @@ static int init(struct sr_output *o)
        ctx->probelist[ctx->num_enabled_probes] = 0;
        ctx->unitsize = (ctx->num_enabled_probes + 7) / 8;
        ctx->header = g_string_sized_new(512);
-       num_probes = g_slist_length(o->dev->probes);
+       num_probes = g_slist_length(o->sdi->probes);
 
        /* timestamp */
        t = time(NULL);
@@ -84,9 +85,10 @@ static int init(struct sr_output *o)
        g_string_append_printf(ctx->header, "$version %s %s $end\n",
                        PACKAGE, PACKAGE_VERSION);
 
-       if (o->dev->driver && sr_dev_has_hwcap(o->dev, SR_HWCAP_SAMPLERATE)) {
-               ctx->samplerate = *((uint64_t *) o->dev->driver->dev_info_get(
-                               o->dev->driver_index, SR_DI_CUR_SAMPLERATE));
+       if (o->sdi->driver && sr_dev_has_hwcap(o->sdi, SR_HWCAP_SAMPLERATE)) {
+               o->sdi->driver->info_get(SR_DI_CUR_SAMPLERATE,
+                               (const void **)&samplerate, o->sdi);
+               ctx->samplerate = *samplerate;
                if (!((samplerate_s = sr_samplerate_string(ctx->samplerate)))) {
                        g_string_free(ctx->header, TRUE);
                        g_free(ctx);