]> sigrok.org Git - libsigrok.git/commitdiff
vcd: Fix output for more than 8 channels.
authorDaniel Elstner <redacted>
Thu, 30 Jan 2014 19:49:36 +0000 (20:49 +0100)
committerUwe Hermann <redacted>
Thu, 30 Jan 2014 20:23:26 +0000 (21:23 +0100)
(receive): Use probe index for sample byte selection too, not just
for bit selection.  Also simplify the indexing expressions a bit.
This fixes the problem of incorrect output for probes indices 8 to
31.
Also, use double rather than float in the timestamp calculation,
and format the result directly as floating point number rather than
converting it back to uint64_t.
Additionally, make sure that the state of all signals is written
for the very first sample in the stream.  This fixes the problem
that signals would be displayed as indeterminate until the first
change.
(context.samplecount): Make the sample counter part of the context
struct, rather than keeping it as a global static.

output/vcd.c

index 44a12dec37a8c2e2265ea499d4410d61443d5ac3..ffc753281a53f0f0b45c1bea8f2a53ae95da4546 100644 (file)
@@ -35,6 +35,7 @@ struct context {
        uint8_t *prevsample;
        int period;
        uint64_t samplerate;
+       uint64_t samplecount;
        unsigned int unitsize;
 };
 
@@ -155,7 +156,6 @@ static int receive(struct sr_output *o, const struct sr_dev_inst *sdi,
        unsigned int i;
        int p, curbit, prevbit, index;
        uint8_t *sample;
-       static uint64_t samplecount = 0;
 
        (void)sdi;
 
@@ -174,31 +174,31 @@ static int receive(struct sr_output *o, const struct sr_dev_inst *sdi,
                /* The header is still here, this must be the first packet. */
                *out = ctx->header;
                ctx->header = NULL;
+               ctx->samplecount = 0;
        } else {
                *out = g_string_sized_new(512);
        }
 
        logic = packet->payload;
        for (i = 0; i <= logic->length - logic->unitsize; i += logic->unitsize) {
-               samplecount++;
-
                sample = logic->data + i;
 
                for (p = 0; p < ctx->num_enabled_probes; p++) {
                        index = g_array_index(ctx->probeindices, int, p);
-                       curbit = (sample[p / 8] & (((uint8_t) 1) << index)) >> index;
-                       prevbit = (ctx->prevsample[p / 8] & (((uint8_t) 1) << index)) >> index;
+                       curbit = ((unsigned)sample[index / 8] >> (index % 8)) & 1;
+                       prevbit = ((unsigned)ctx->prevsample[index / 8] >> (index % 8)) & 1;
 
                        /* VCD only contains deltas/changes of signals. */
-                       if (prevbit == curbit)
+                       if (prevbit == curbit && ctx->samplecount > 0)
                                continue;
 
                        /* Output which signal changed to which value. */
-                       g_string_append_printf(*out, "#%" PRIu64 "\n%i%c\n",
-                                       (uint64_t)(((float)samplecount / ctx->samplerate)
-                                       * ctx->period), curbit, (char)('!' + p));
+                       g_string_append_printf(*out, "#%.0f\n%i%c\n",
+                               (double)ctx->samplecount / ctx->samplerate * ctx->period,
+                               curbit, (char)('!' + p));
                }
 
+               ctx->samplecount++;
                memcpy(ctx->prevsample, sample, ctx->unitsize);
        }