X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fdemo%2Fprotocol.c;h=eea3c9b8e7e622a72941ca23be952aa2e54c30e4;hb=dc90146ef360d8f4e7bdf8df5b46b40e9eef3197;hp=05be1d31682a309b1514957bacfee4941877e522;hpb=6449b2e035b8d6ceaa7120c36b69a5be15113ab1;p=libsigrok.git diff --git a/src/hardware/demo/protocol.c b/src/hardware/demo/protocol.c index 05be1d31..eea3c9b8 100644 --- a/src/hardware/demo/protocol.c +++ b/src/hardware/demo/protocol.c @@ -244,6 +244,21 @@ SR_PRIV void demo_generate_analog_pattern(struct dev_context *devc) } pattern->num_samples = last_end; devc->analog_patterns[PATTERN_SAWTOOTH] = pattern; + + /* PATTERN_ANALOG_RANDOM */ + /* Data not filled here, will be generated in send_analog_packet(). */ + pattern = g_malloc(sizeof(struct analog_pattern)); + pattern->num_samples = last_end; + devc->analog_patterns[PATTERN_ANALOG_RANDOM] = pattern; +} + +SR_PRIV void demo_free_analog_pattern(struct dev_context *devc) +{ + g_free(devc->analog_patterns[PATTERN_SQUARE]); + g_free(devc->analog_patterns[PATTERN_SINE]); + g_free(devc->analog_patterns[PATTERN_TRIANGLE]); + g_free(devc->analog_patterns[PATTERN_SAWTOOTH]); + g_free(devc->analog_patterns[PATTERN_ANALOG_RANDOM]); } static uint64_t encode_number_to_gray(uint64_t nr) @@ -484,14 +499,26 @@ static void send_analog_packet(struct analog_gen *ag, ag_pattern_pos = analog_pos % pattern->num_samples; sending_now = MIN(analog_todo, pattern->num_samples - ag_pattern_pos); if (ag->amplitude != DEFAULT_ANALOG_AMPLITUDE || - ag->offset != DEFAULT_ANALOG_OFFSET) { - - /* Amplitude or offset changed, modify each sample. */ - amplitude = ag->amplitude / DEFAULT_ANALOG_AMPLITUDE; - offset = ag->offset - DEFAULT_ANALOG_OFFSET; + ag->offset != DEFAULT_ANALOG_OFFSET || + ag->pattern == PATTERN_ANALOG_RANDOM) { + /* + * Amplitude or offset changed (or we are generating + * random data), modify each sample. + */ + if (ag->pattern == PATTERN_ANALOG_RANDOM) { + amplitude = ag->amplitude / 500.0; + offset = ag->offset - DEFAULT_ANALOG_OFFSET - ag->amplitude; + } else { + amplitude = ag->amplitude / DEFAULT_ANALOG_AMPLITUDE; + offset = ag->offset - DEFAULT_ANALOG_OFFSET; + } data = ag->packet.data; - for (i = 0; i < sending_now; i++) - data[i] = pattern->data[ag_pattern_pos + i] * amplitude + offset; + for (i = 0; i < sending_now; i++) { + if (ag->pattern == PATTERN_ANALOG_RANDOM) + data[i] = (rand() % 1000) * amplitude + offset; + else + data[i] = pattern->data[ag_pattern_pos + i] * amplitude + offset; + } } else { /* Amplitude and offset unchanged, use the fast way. */ ag->packet.data = pattern->data + ag_pattern_pos; @@ -504,11 +531,19 @@ static void send_analog_packet(struct analog_gen *ag, } else { ag_pattern_pos = analog_pos % pattern->num_samples; to_avg = MIN(analog_todo, pattern->num_samples - ag_pattern_pos); - amplitude = ag->amplitude / DEFAULT_ANALOG_AMPLITUDE; - offset = ag->offset - DEFAULT_ANALOG_OFFSET; + if (ag->pattern == PATTERN_ANALOG_RANDOM) { + amplitude = ag->amplitude / 500.0; + offset = ag->offset - DEFAULT_ANALOG_OFFSET - ag->amplitude; + } else { + amplitude = ag->amplitude / DEFAULT_ANALOG_AMPLITUDE; + offset = ag->offset - DEFAULT_ANALOG_OFFSET; + } for (i = 0; i < to_avg; i++) { - value = *(pattern->data + ag_pattern_pos + i) * amplitude + offset; + if (ag->pattern == PATTERN_ANALOG_RANDOM) + value = (rand() % 1000) * amplitude + offset; + else + value = *(pattern->data + ag_pattern_pos + i) * amplitude + offset; ag->avg_val = (ag->avg_val + value) / 2; ag->num_avgs++; /* Time to send averaged data? */ @@ -679,7 +714,7 @@ SR_PRIV int demo_prepare_data(int fd, int revents, void *cb_data) devc->spent_us += todo_us; if (devc->limit_frames && devc->sent_frame_samples >= SAMPLES_PER_FRAME) { - std_session_send_frame_end(sdi); + std_session_send_df_frame_end(sdi); devc->sent_frame_samples = 0; devc->limit_frames--; if (!devc->limit_frames) { @@ -707,7 +742,7 @@ SR_PRIV int demo_prepare_data(int fd, int revents, void *cb_data) sr_dev_acquisition_stop(sdi); } else if (devc->limit_frames) { if (devc->sent_frame_samples == 0) - std_session_send_frame_begin(sdi); + std_session_send_df_frame_begin(sdi); } return G_SOURCE_CONTINUE;