]> sigrok.org Git - libsigrok.git/commitdiff
demo: make frame generation (and maximum frame count) a runtime option
authorGerhard Sittig <redacted>
Thu, 3 May 2018 19:26:07 +0000 (21:26 +0200)
committerGerhard Sittig <redacted>
Sun, 13 May 2018 18:03:21 +0000 (20:03 +0200)
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.

src/hardware/demo/api.c
src/hardware/demo/protocol.c
src/hardware/demo/protocol.h

index d0abe4ff92e053f111c6cb44b7cc9e66f9aa0f50..052878da292849ab1e9b0b9dff2ea54316c3f754 100644 (file)
@@ -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);
index 05f3f9d33fd3f62715d83e674b3f6f829d1d0de0..4358d290ce1250a4d3c80b5385f7fa41515f54c9 100644 (file)
@@ -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;
index 285a127dd02f6fef7a1aea3bc4be98cb6c53e37a..c61d0ee65a900c27e0a16c1a573f35c634c1c277 100644 (file)
@@ -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;