X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fdemo%2Fprotocol.c;h=eea3c9b8e7e622a72941ca23be952aa2e54c30e4;hb=83d14190b95707d7201555122317185520c80bd0;hp=42348a374f224d234a1bf4d6612bae45a53b43f6;hpb=a6e5d2f676d2887978f193be2e6bb451185ba36d;p=libsigrok.git diff --git a/src/hardware/demo/protocol.c b/src/hardware/demo/protocol.c index 42348a37..eea3c9b8 100644 --- a/src/hardware/demo/protocol.c +++ b/src/hardware/demo/protocol.c @@ -187,12 +187,14 @@ SR_PRIV void demo_generate_analog_pattern(struct dev_context *devc) amplitude = DEFAULT_ANALOG_AMPLITUDE; offset = DEFAULT_ANALOG_OFFSET; - /* FIXME we actually need only one period. A ringbuffer would be - * useful here. */ - /* Make sure the number of samples we put out is an integer - * multiple of our period size */ + /* + * FIXME: We actually need only one period. A ringbuffer would be + * useful here. + * Make sure the number of samples we put out is an integer + * multiple of our period size. + */ - /* PATTERN_SQUARE */ + /* PATTERN_SQUARE: */ sr_dbg("Generating %s pattern.", analog_pattern_str[PATTERN_SQUARE]); pattern = g_malloc(sizeof(struct analog_pattern)); value = amplitude; @@ -207,7 +209,7 @@ SR_PRIV void demo_generate_analog_pattern(struct dev_context *devc) pattern->num_samples = last_end; devc->analog_patterns[PATTERN_SQUARE] = pattern; - /* Readjusting num_samples for all other patterns */ + /* Readjusting num_samples for all other patterns. */ while (num_samples % ANALOG_SAMPLES_PER_PERIOD != 0) num_samples--; @@ -242,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) @@ -408,7 +425,7 @@ static void send_analog_packet(struct analog_gen *ag, ag->packet.meaning->mq = ag->mq; ag->packet.meaning->mqflags = ag->mq_flags; - /* Set a unit for the given quantity */ + /* Set a unit for the given quantity. */ if (ag->mq == SR_MQ_VOLTAGE) ag->packet.meaning->unit = SR_UNIT_VOLT; else if (ag->mq == SR_MQ_CURRENT) @@ -482,17 +499,28 @@ 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; + 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 not changed, use the fast way */ + /* Amplitude and offset unchanged, use the fast way. */ ag->packet.data = pattern->data + ag_pattern_pos; } ag->packet.num_samples = sending_now; @@ -503,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? */ @@ -678,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) { @@ -706,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;