From: Gerhard Sittig Date: Thu, 3 May 2018 19:26:07 +0000 (+0200) Subject: demo: make frame generation (and maximum frame count) a runtime option X-Git-Url: https://sigrok.org/gitweb/?a=commitdiff_plain;h=fb193945b6188ffdb44b64f29b36c91f03f7f011;p=libsigrok.git demo: make frame generation (and maximum frame count) a runtime option The previous implementation supported the generation of frames as a compile time option. This change lets users adjust the feature at runtime. In the absence of a frame count limit no frame begin/end markers get sent (the default behaviour of the previous implementation). When a frame count limit is specified, the respective number of frames gets sent and acquisition stops. The fixed amount of 1000 samples per frame is an arbitrary choice. This compile time option is easily adjusted in the source code. --- diff --git a/src/hardware/demo/api.c b/src/hardware/demo/api.c index d0abe4ff..052878da 100644 --- a/src/hardware/demo/api.c +++ b/src/hardware/demo/api.c @@ -62,6 +62,7 @@ static const uint32_t devopts[] = { SR_CONF_CONTINUOUS, SR_CONF_LIMIT_SAMPLES | SR_CONF_GET | SR_CONF_SET, SR_CONF_LIMIT_MSEC | SR_CONF_GET | SR_CONF_SET, + SR_CONF_LIMIT_FRAMES | SR_CONF_GET | SR_CONF_SET, SR_CONF_SAMPLERATE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, SR_CONF_AVERAGING | SR_CONF_GET | SR_CONF_SET, SR_CONF_AVG_SAMPLES | SR_CONF_GET | SR_CONF_SET, @@ -223,6 +224,9 @@ static int config_get(uint32_t key, GVariant **data, case SR_CONF_LIMIT_MSEC: *data = g_variant_new_uint64(devc->limit_msec); break; + case SR_CONF_LIMIT_FRAMES: + *data = g_variant_new_uint64(devc->limit_frames); + break; case SR_CONF_AVERAGING: *data = g_variant_new_boolean(devc->avg); break; @@ -284,6 +288,9 @@ static int config_set(uint32_t key, GVariant *data, devc->limit_msec = g_variant_get_uint64(data); devc->limit_samples = 0; break; + case SR_CONF_LIMIT_FRAMES: + devc->limit_frames = g_variant_get_uint64(data); + break; case SR_CONF_AVERAGING: devc->avg = g_variant_get_boolean(data); sr_dbg("%s averaging", devc->avg ? "Enabling" : "Disabling"); @@ -458,7 +465,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) std_session_send_df_header(sdi); - if (SAMPLES_PER_FRAME > 0) + if (devc->limit_frames > 0) std_session_send_frame_begin(sdi); /* We use this timestamp to decide how many more samples to send. */ @@ -471,9 +478,12 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) static int dev_acquisition_stop(struct sr_dev_inst *sdi) { + struct dev_context *devc; + sr_session_source_remove(sdi->session, -1); - if (SAMPLES_PER_FRAME > 0) + devc = sdi->priv; + if (devc->limit_frames > 0) std_session_send_frame_end(sdi); std_session_send_df_end(sdi); diff --git a/src/hardware/demo/protocol.c b/src/hardware/demo/protocol.c index 05f3f9d3..4358d290 100644 --- a/src/hardware/demo/protocol.c +++ b/src/hardware/demo/protocol.c @@ -493,12 +493,13 @@ SR_PRIV int demo_prepare_data(int fd, int revents, void *cb_data) if (samples_todo == 0) return G_SOURCE_CONTINUE; -#if (SAMPLES_PER_FRAME > 0) /* Avoid "comparison < 0 always false" warning. */ - /* Never send more samples than a frame can fit... */ - samples_todo = MIN(samples_todo, SAMPLES_PER_FRAME); - /* ...or than we need to finish the current frame. */ - samples_todo = MIN(samples_todo, SAMPLES_PER_FRAME - devc->sent_frame_samples); -#endif + if (devc->limit_frames) { + /* Never send more samples than a frame can fit... */ + samples_todo = MIN(samples_todo, SAMPLES_PER_FRAME); + /* ...or than we need to finish the current frame. */ + samples_todo = MIN(samples_todo, + SAMPLES_PER_FRAME - devc->sent_frame_samples); + } /* Calculate the actual time covered by this run back from the sample * count, rounded towards zero. This avoids getting stuck on a too-low @@ -553,12 +554,15 @@ SR_PRIV int demo_prepare_data(int fd, int revents, void *cb_data) devc->sent_frame_samples += samples_todo; devc->spent_us += todo_us; -#if (SAMPLES_PER_FRAME > 0) /* Avoid "comparison >= 0 always true" warning. */ - if (devc->sent_frame_samples >= SAMPLES_PER_FRAME) { + if (devc->limit_frames && devc->sent_frame_samples >= SAMPLES_PER_FRAME) { std_session_send_frame_end(sdi); devc->sent_frame_samples = 0; + devc->limit_frames--; + if (!devc->limit_frames) { + sr_dbg("Requested number of frames reached."); + sr_dev_acquisition_stop(sdi); + } } -#endif if ((devc->limit_samples > 0 && devc->sent_samples >= devc->limit_samples) || (limit_us > 0 && devc->spent_us >= limit_us)) { @@ -577,11 +581,9 @@ SR_PRIV int demo_prepare_data(int fd, int revents, void *cb_data) } sr_dbg("Requested number of samples reached."); sr_dev_acquisition_stop(sdi); - } else { -#if (SAMPLES_PER_FRAME > 0) + } else if (devc->limit_frames) { if (devc->sent_frame_samples == 0) std_session_send_frame_begin(sdi); -#endif } return G_SOURCE_CONTINUE; diff --git a/src/hardware/demo/protocol.h b/src/hardware/demo/protocol.h index 285a127d..c61d0ee6 100644 --- a/src/hardware/demo/protocol.h +++ b/src/hardware/demo/protocol.h @@ -34,7 +34,7 @@ /* Size of the analog pattern space per channel. */ #define ANALOG_BUFSIZE 4096 /* This is a development feature: it starts a new frame every n samples. */ -#define SAMPLES_PER_FRAME 0 +#define SAMPLES_PER_FRAME 1000UL /* Logic patterns we can generate. */ enum logic_pattern_type { @@ -94,6 +94,7 @@ struct dev_context { uint64_t cur_samplerate; uint64_t limit_samples; uint64_t limit_msec; + uint64_t limit_frames; uint64_t sent_samples; uint64_t sent_frame_samples; /* Number of samples that were sent for current frame. */ int64_t start_us;