]> sigrok.org Git - libsigrok.git/commitdiff
hameg-hmo: Add SR_CONF_LIMIT_SAMPLES support.
authorGuido Trentalancia <redacted>
Fri, 16 Nov 2018 17:41:30 +0000 (18:41 +0100)
committerUwe Hermann <redacted>
Thu, 25 Jul 2019 22:11:07 +0000 (00:11 +0200)
At the moment only the maximum number of frames to be acquired can be
configured for the Hameg/Rohde&Schwarz HMO mixed-signal oscilloscope
series driver (hameg-hmo).

This patch adds support to configure the number of samples to acquire
in both analog and digital (logic) mode.

src/hardware/hameg-hmo/api.c
src/hardware/hameg-hmo/protocol.c
src/hardware/hameg-hmo/protocol.h

index 1274b919bf61dd20d8f837e4c47da0aad21e9c3b..bf46a3bbfaf8308b923c63ba55f85525ebfd5ddb 100644 (file)
@@ -247,6 +247,10 @@ static int config_set(uint32_t key, GVariant *data,
        update_sample_rate = FALSE;
 
        switch (key) {
        update_sample_rate = FALSE;
 
        switch (key) {
+       case SR_CONF_LIMIT_SAMPLES:
+               devc->samples_limit = g_variant_get_uint64(data);
+               ret = SR_OK;
+               break;
        case SR_CONF_LIMIT_FRAMES:
                devc->frame_limit = g_variant_get_uint64(data);
                ret = SR_OK;
        case SR_CONF_LIMIT_FRAMES:
                devc->frame_limit = g_variant_get_uint64(data);
                ret = SR_OK;
@@ -601,6 +605,9 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
        scpi = sdi->conn;
        devc = sdi->priv;
 
        scpi = sdi->conn;
        devc = sdi->priv;
 
+       devc->num_samples = 0;
+       devc->num_frames = 0;
+
        /* Preset empty results. */
        for (group = 0; group < ARRAY_SIZE(digital_added); group++)
                digital_added[group] = FALSE;
        /* Preset empty results. */
        for (group = 0; group < ARRAY_SIZE(digital_added); group++)
                digital_added[group] = FALSE;
@@ -681,6 +688,7 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi)
 
        devc = sdi->priv;
 
 
        devc = sdi->priv;
 
+       devc->num_samples = 0;
        devc->num_frames = 0;
        g_slist_free(devc->enabled_channels);
        devc->enabled_channels = NULL;
        devc->num_frames = 0;
        g_slist_free(devc->enabled_channels);
        devc->enabled_channels = NULL;
index 3406f2df5fb9bf3326c5253123bcc50621dc38e8..41b14d48b71aa5b10fe01cec522b23a5ae6c5333 100644 (file)
@@ -59,6 +59,7 @@ static const char *hameg_scpi_dialect[] = {
 
 static const uint32_t devopts[] = {
        SR_CONF_OSCILLOSCOPE,
 
 static const uint32_t devopts[] = {
        SR_CONF_OSCILLOSCOPE,
+       SR_CONF_LIMIT_SAMPLES | SR_CONF_GET | SR_CONF_SET,
        SR_CONF_LIMIT_FRAMES | SR_CONF_GET | SR_CONF_SET,
        SR_CONF_SAMPLERATE | SR_CONF_GET,
        SR_CONF_TIMEBASE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
        SR_CONF_LIMIT_FRAMES | SR_CONF_GET | SR_CONF_SET,
        SR_CONF_SAMPLERATE | SR_CONF_GET,
        SR_CONF_TIMEBASE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
@@ -783,6 +784,7 @@ SR_PRIV int hmo_init_device(struct sr_dev_inst *sdi)
        }
 
        devc->model_config = &scope_models[model_index];
        }
 
        devc->model_config = &scope_models[model_index];
+       devc->samples_limit = 0;
        devc->frame_limit = 0;
 
        if (!(devc->model_state = scope_state_new(devc->model_config)))
        devc->frame_limit = 0;
 
        if (!(devc->model_state = scope_state_new(devc->model_config)))
@@ -821,8 +823,6 @@ SR_PRIV void hmo_queue_logic_data(struct dev_context *devc,
        } else {
                store = devc->logic_data;
                size = store->len / devc->pod_count;
        } else {
                store = devc->logic_data;
                size = store->len / devc->pod_count;
-               if (size != pod_data->len)
-                       return;
                if (group >= devc->pod_count)
                        return;
        }
                if (group >= devc->pod_count)
                        return;
        }
@@ -838,6 +838,10 @@ SR_PRIV void hmo_queue_logic_data(struct dev_context *devc,
                *logic_data = pod_data->data[idx];
                logic_data += logic_step;
        }
                *logic_data = pod_data->data[idx];
                logic_data += logic_step;
        }
+
+       /* Truncate acquisition if a smaller number of samples has been requested. */
+       if (devc->samples_limit > 0 && devc->logic_data->len > devc->samples_limit * devc->pod_count)
+               devc->logic_data->len = devc->samples_limit * devc->pod_count;
 }
 
 /* Submit data for all channels, after the individual groups got collected. */
 }
 
 /* Submit data for all channels, after the individual groups got collected. */
@@ -934,6 +938,9 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data)
 
                analog.data = data->data;
                analog.num_samples = data->len / sizeof(float);
 
                analog.data = data->data;
                analog.num_samples = data->len / sizeof(float);
+               /* Truncate acquisition if a smaller number of samples has been requested. */
+               if (devc->samples_limit > 0 && analog.num_samples > devc->samples_limit)
+                       analog.num_samples = devc->samples_limit;
                analog.encoding = &encoding;
                analog.meaning = &meaning;
                analog.spec = &spec;
                analog.encoding = &encoding;
                analog.meaning = &meaning;
                analog.spec = &spec;
@@ -966,6 +973,7 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data)
                spec.spec_digits = 2;
                packet.payload = &analog;
                sr_session_send(sdi, &packet);
                spec.spec_digits = 2;
                packet.payload = &analog;
                sr_session_send(sdi, &packet);
+               devc->num_samples = data->len / sizeof(float);
                g_slist_free(meaning.channels);
                g_byte_array_free(data, TRUE);
                data = NULL;
                g_slist_free(meaning.channels);
                g_byte_array_free(data, TRUE);
                data = NULL;
@@ -994,6 +1002,9 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data)
                        packet.type = SR_DF_LOGIC;
                        logic.data = data->data;
                        logic.length = data->len;
                        packet.type = SR_DF_LOGIC;
                        logic.data = data->data;
                        logic.length = data->len;
+                       /* Truncate acquisition if a smaller number of samples has been requested. */
+                       if (devc->samples_limit > 0 && logic.length > devc->samples_limit)
+                               logic.length = devc->samples_limit;
                        logic.unitsize = 1;
                        packet.payload = &logic;
                        sr_session_send(sdi, &packet);
                        logic.unitsize = 1;
                        packet.payload = &logic;
                        sr_session_send(sdi, &packet);
@@ -1002,6 +1013,7 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data)
                        hmo_queue_logic_data(devc, group, data);
                }
 
                        hmo_queue_logic_data(devc, group, data);
                }
 
+               devc->num_samples = data->len / devc->pod_count;
                g_byte_array_free(data, TRUE);
                data = NULL;
                break;
                g_byte_array_free(data, TRUE);
                data = NULL;
                break;
@@ -1035,10 +1047,10 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data)
 
        /*
         * End of frame was reached. Stop acquisition after the specified
 
        /*
         * End of frame was reached. Stop acquisition after the specified
-        * number of frames, or continue reception by starting over at
-        * the first enabled channel.
+        * number of frames or after the specified number of samples, or
+        * continue reception by starting over at the first enabled channel.
         */
         */
-       if (++devc->num_frames == devc->frame_limit) {
+       if (++devc->num_frames >= devc->frame_limit || devc->num_samples >= devc->samples_limit) {
                sr_dev_acquisition_stop(sdi);
                hmo_cleanup_logic_data(devc);
        } else {
                sr_dev_acquisition_stop(sdi);
                hmo_cleanup_logic_data(devc);
        } else {
index 43220dd789a78c6f2ce10a9981af29a3bb34844c..8620dedc632ed55d760c98299e88673e635d7ffe 100644 (file)
@@ -102,8 +102,10 @@ struct dev_context {
 
        GSList *enabled_channels;
        GSList *current_channel;
 
        GSList *enabled_channels;
        GSList *current_channel;
+       uint64_t num_samples;
        uint64_t num_frames;
 
        uint64_t num_frames;
 
+       uint64_t samples_limit;
        uint64_t frame_limit;
 
        size_t pod_count;
        uint64_t frame_limit;
 
        size_t pod_count;