X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fdemo%2Fprotocol.c;h=a969d02995cb661c35ff54bf2891fbc018a1f28d;hb=78d78afb572ca8fe0321cf6d5e2c3e4a5b32a04d;hp=42348a374f224d234a1bf4d6612bae45a53b43f6;hpb=a6e5d2f676d2887978f193be2e6bb451185ba36d;p=libsigrok.git diff --git a/src/hardware/demo/protocol.c b/src/hardware/demo/protocol.c index 42348a37..a969d029 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? */