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;
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--;
}
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)
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)
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;
} 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? */
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) {
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;