]> sigrok.org Git - libsigrok.git/commitdiff
input/csv: unbreak assignment of zero values to analog channels
authorGerhard Sittig <redacted>
Sat, 3 Dec 2022 06:49:47 +0000 (07:49 +0100)
committerGerhard Sittig <redacted>
Sat, 3 Dec 2022 06:49:47 +0000 (07:49 +0100)
Unconditionally assign the value of 0.0 to the current sample's position
of analog data for the session feed. Not assigning that zero value could
result in old data from previous chunks to transpire through, yielding
invalid output from CSV import when analog data is involved.

This amends commit 43bdef263420 which introduced support for analog
channels in the CSV input module. And phrased the implementation for
similarity with logic data's code paths, where bit manipulation is
more complex, and only high bits get applied to a previously cleared
sample memory. Which introduced that zero value ignoring issue.

Depending on software versions which used single or double precision
data types, either requires 2^20 or 2^19 samples to reproduce.

  input file content:

    CH1
    5.1
    5.2
    5.3
    5
    ... 524280 more "5" values ...
    5
    0
    0
    0 ; last 0.0 sample 2^19 correctly imported as 0.0
    0 ; wrongly imported as 5.1 (first sample from beginning)
    0 ; wrongly imported as 5.2 (second sample from beginning)
    0 ; wrongly imported as 5.3 (third sample from beginning)
    5
    5
    5

  command invocation:

    $ sigrok-cli -i example.csv -I csv:column_formats=a | tail

  incorrect output data:

    CH1: 5.000
    CH1: 0.000
    CH1: 0.000
    CH1: 0.000
    CH1: 5.100
    CH1: 5.200
    CH1: 5.300
    CH1: 5.000
    CH1: 5.000
    CH1: 5.000

Reported-By: Markus Heidelberg <redacted>
src/input/csv.c

index 4dcc77b8eaeb19e13999324e230786d8da19ef9f..0750a4eb5d6e8a8a88ade9c4a20d09c03b20ed20 100644 (file)
@@ -379,8 +379,6 @@ static void set_analog_value(struct context *inc, size_t ch_idx, csv_analog_t va
 {
        if (ch_idx >= inc->analog_channels)
                return;
-       if (!value)
-               return;
        inc->analog_sample_buffer[ch_idx * inc->analog_datafeed_buf_size] = value;
 }