X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Finput%2Fvcd.c;h=26cce118e2f17240ac7a89dbd369c032dea3fa76;hb=cdb134eb19e23528ec9c9dd89805087ea3edb9b6;hp=1f20033095e30066e46a9716a78f6f7a3c17e61c;hpb=d9251a2c9f1ca4380c27240ccca90c9f9ed46d3f;p=libsigrok.git diff --git a/src/input/vcd.c b/src/input/vcd.c index 1f200330..26cce118 100644 --- a/src/input/vcd.c +++ b/src/input/vcd.c @@ -26,7 +26,7 @@ * * skip: Allows skipping until given timestamp in the file. * This can speed up analyzing of long captures. - * + * * Value < 0: Skip until first timestamp listed in * the file. (default) * @@ -67,11 +67,12 @@ #define LOG_PREFIX "input/vcd" -#define CHUNKSIZE (1024 * 1024) +#define CHUNK_SIZE (4 * 1024 * 1024) struct context { gboolean started; gboolean got_header; + uint64_t prev_timestamp; uint64_t samplerate; unsigned int maxchannels; unsigned int channelcount; @@ -318,7 +319,7 @@ static void add_samples(const struct sr_input *in, size_t count) uint8_t *p; inc = in->priv; - samples_per_chunk = CHUNKSIZE / inc->bytes_per_sample; + samples_per_chunk = CHUNK_SIZE / inc->bytes_per_sample; while (count) { space_left = samples_per_chunk - inc->samples_in_buffer; @@ -367,12 +368,11 @@ static void process_bit(struct context *inc, char *identifier, unsigned int bit) static void parse_contents(const struct sr_input *in, char *data) { struct context *inc; - uint64_t timestamp, prev_timestamp; + uint64_t timestamp; unsigned int bit, i; char **tokens; inc = in->priv; - prev_timestamp = 0; /* Read one space-delimited token at a time. */ tokens = g_strsplit_set(data, " \t\r\n", 0); @@ -399,22 +399,22 @@ static void parse_contents(const struct sr_input *in, char *data) */ if (inc->skip < 0) { inc->skip = timestamp; - prev_timestamp = timestamp; + inc->prev_timestamp = timestamp; } else if (inc->skip > 0 && timestamp < (uint64_t)inc->skip) { - prev_timestamp = inc->skip; - } else if (timestamp == prev_timestamp) { + inc->prev_timestamp = inc->skip; + } else if (timestamp == inc->prev_timestamp) { /* Ignore repeated timestamps (e.g. sigrok outputs these) */ } else { - if (inc->compress != 0 && timestamp - prev_timestamp > inc->compress) { + if (inc->compress != 0 && timestamp - inc->prev_timestamp > inc->compress) { /* Compress long idle periods */ - prev_timestamp = timestamp - inc->compress; + inc->prev_timestamp = timestamp - inc->compress; } sr_dbg("New timestamp: %" PRIu64, timestamp); /* Generate samples from prev_timestamp up to timestamp - 1. */ - add_samples(in, timestamp - prev_timestamp); - prev_timestamp = timestamp; + add_samples(in, timestamp - inc->prev_timestamp); + inc->prev_timestamp = timestamp; } } else if (tokens[i][0] == '$' && tokens[i][1] != '\0') { /* @@ -498,7 +498,7 @@ static int init(struct sr_input *in, GHashTable *options) in->sdi = g_malloc0(sizeof(struct sr_dev_inst)); in->priv = inc; - inc->buffer = g_malloc(CHUNKSIZE); + inc->buffer = g_malloc(CHUNK_SIZE); return SR_OK; } @@ -625,10 +625,11 @@ static int reset(struct sr_input *in) } static struct sr_option options[] = { - { "numchannels", "Number of channels", "Number of channels", NULL, NULL }, - { "skip", "Skip", "Skip until timestamp", NULL, NULL }, - { "downsample", "Downsample", "Divide samplerate by factor", NULL, NULL }, - { "compress", "Compress", "Compress idle periods longer than this value", NULL, NULL }, + { "numchannels", "Number of logic channels", "The number of (logic) channels in the data", NULL, NULL }, + { "skip", "Skip samples until timestamp", "Skip samples until the specified timestamp; " + "< 0: Skip until first timestamp listed; 0: Don't skip", NULL, NULL }, + { "downsample", "Downsampling factor", "Downsample, i.e. divide the samplerate by the specified factor", NULL, NULL }, + { "compress", "Compress idle periods", "Compress idle periods longer than the specified value", NULL, NULL }, ALL_ZERO }; @@ -647,7 +648,7 @@ static const struct sr_option *get_options(void) SR_PRIV struct sr_input_module input_vcd = { .id = "vcd", .name = "VCD", - .desc = "Value Change Dump", + .desc = "Value Change Dump data", .exts = (const char*[]){"vcd", NULL}, .metadata = { SR_INPUT_META_HEADER | SR_INPUT_META_REQUIRED }, .options = get_options,