demo: Only send average result data when averaging is active

After the requested number of samples was sent, another session df
packet was emitted with one sample for the analog channels, which
contained the most recent result of averaging. Make this emission
depend on the "averaging requested?" flag.

This fixes bug #930.
This commit is contained in:
Gerhard Sittig 2017-06-17 19:23:35 +02:00 committed by Uwe Hermann
parent d91d0b1250
commit d114464551
1 changed files with 8 additions and 3 deletions

View File

@ -353,6 +353,7 @@ static void send_analog_packet(struct analog_gen *ag,
ag->packet.data = ag->pattern_data + ag_pattern_pos;
ag->packet.num_samples = sending_now;
sr_session_send(sdi, &packet);
sr_dbg("DBG: %s() sending now: %lu", __func__, (unsigned long)sending_now);
/* Whichever channel group gets there first. */
*analog_sent = MAX(*analog_sent, sending_now);
@ -429,12 +430,14 @@ SR_PRIV int demo_prepare_data(int fd, int revents, void *cb_data)
/* How many samples are outstanding since the last round? */
samples_todo = (todo_us * devc->cur_samplerate + G_USEC_PER_SEC - 1)
/ G_USEC_PER_SEC;
sr_dbg("DBG: %s() samples_todo before adjustment: %lu", __func__, (unsigned long)samples_todo);
if (devc->limit_samples > 0) {
if (devc->limit_samples < devc->sent_samples)
samples_todo = 0;
else if (devc->limit_samples - devc->sent_samples < samples_todo)
samples_todo = devc->limit_samples - devc->sent_samples;
}
sr_dbg("DBG: %s() samples_todo after adjustment: %lu", __func__, (unsigned long)samples_todo);
/* Calculate the actual time covered by this run back from the sample
* count, rounded towards zero. This avoids getting stuck on a too-low
* time delta with no samples being sent due to round-off.
@ -468,8 +471,10 @@ SR_PRIV int demo_prepare_data(int fd, int revents, void *cb_data)
send_analog_packet(value, sdi, &analog_sent,
devc->sent_samples + analog_done,
samples_todo - analog_done);
sr_dbg("DBG: %s() analog_sent: %lu", __func__, (unsigned long)analog_sent);
}
analog_done += analog_sent;
sr_dbg("DBG: %s() analog_done: %lu", __func__, (unsigned long)analog_done);
}
}
/* At this point, both logic_done and analog_done should be
@ -486,7 +491,7 @@ SR_PRIV int demo_prepare_data(int fd, int revents, void *cb_data)
|| (limit_us > 0 && devc->spent_us >= limit_us)) {
/* If we're averaging everything - now is the time to send data */
if (devc->avg_samples == 0) {
if (devc->avg && devc->avg_samples == 0) {
g_hash_table_iter_init(&iter, devc->ch_ag);
while (g_hash_table_iter_next(&iter, NULL, &value)) {
ag = value;