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.

The invalid product that was removed since v2 and the missing product
that was added in v2 are now treated in the following separate patch:

hameg-hmo: Remove an invalid product model and add a valid product model

which should be applied before this patch.

The extra functionality to support 16 digital channels on the HMO3XX2
models that was previously introduced in version 2 of this patch, is
now provided by the following separate patch:

hameg-hmo: support all 16 instead of only 8 digital channels on HMO3XX2

which should be applied before the patch mentioned above and before
this patch.

This fourth version (v4) preserves the bug fix introduced in the third
version (segmentation fault when trying to acquire digital data using
the limit on the number of frames instead of the limit on the number of
samples).

Signed-off-by: Guido Trentalancia <gu...@trentalancia.com>
---
 src/hardware/hameg-hmo/api.c      |    8 ++++++++
 src/hardware/hameg-hmo/protocol.c |   20 +++++++++++++++++---
 src/hardware/hameg-hmo/protocol.h |    2 ++
 3 files changed, 27 insertions(+), 3 deletions(-)

diff -pru libsigrok-git-20102018-orig/src/hardware/hameg-hmo/api.c 
libsigrok-git-20102018-hameg-hmo-acquire-samples-v4/src/hardware/hameg-hmo/api.c
--- libsigrok-git-20102018-orig/src/hardware/hameg-hmo/api.c    2018-10-20 
13:12:30.894966966 +0200
+++ 
libsigrok-git-20102018-hameg-hmo-acquire-samples-v4/src/hardware/hameg-hmo/api.c
    2018-10-24 16:58:02.221339364 +0200
@@ -247,6 +247,10 @@ static int config_set(uint32_t key, GVar
        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;
@@ -601,6 +605,9 @@ static int dev_acquisition_start(const s
        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;
@@ -681,6 +688,7 @@ static int dev_acquisition_stop(struct s
 
        devc = sdi->priv;
 
+       devc->num_samples = 0;
        devc->num_frames = 0;
        g_slist_free(devc->enabled_channels);
        devc->enabled_channels = NULL;
diff -pru libsigrok-git-20102018-orig/src/hardware/hameg-hmo/protocol.c 
libsigrok-git-20102018-hameg-hmo-acquire-samples-v4/src/hardware/hameg-hmo/protocol.c
--- libsigrok-git-20102018-orig/src/hardware/hameg-hmo/protocol.c       
2018-10-24 16:56:19.211339785 +0200
+++ 
libsigrok-git-20102018-hameg-hmo-acquire-samples-v4/src/hardware/hameg-hmo/protocol.c
       2018-10-24 16:58:02.222339363 +0200
@@ -59,6 +59,7 @@ static const char *hameg_scpi_dialect[]
 
 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,
@@ -783,6 +784,7 @@ SR_PRIV int hmo_init_device(struct sr_de
        }
 
        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)))
@@ -838,6 +840,10 @@ SR_PRIV void hmo_queue_logic_data(struct
                *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. */
@@ -935,6 +941,9 @@ SR_PRIV int hmo_receive_data(int fd, int
 
                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;
@@ -967,6 +976,7 @@ SR_PRIV int hmo_receive_data(int fd, int
                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;
@@ -994,6 +1004,9 @@ SR_PRIV int hmo_receive_data(int fd, int
                        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);
@@ -1002,6 +1015,7 @@ SR_PRIV int hmo_receive_data(int fd, int
                        hmo_queue_logic_data(devc, group, data);
                }
 
+               devc->num_samples = data->len / devc->pod_count;
                g_byte_array_free(data, TRUE);
                data = NULL;
                break;
@@ -1035,10 +1049,10 @@ SR_PRIV int hmo_receive_data(int fd, int
 
        /*
         * 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 {
Solo in 
libsigrok-git-20102018-hameg-hmo-acquire-samples-v4/src/hardware/hameg-hmo: 
protocol.c.orig
diff -pru libsigrok-git-20102018-orig/src/hardware/hameg-hmo/protocol.h 
libsigrok-git-20102018-hameg-hmo-acquire-samples-v4/src/hardware/hameg-hmo/protocol.h
--- libsigrok-git-20102018-orig/src/hardware/hameg-hmo/protocol.h       
2018-10-20 13:12:30.895966966 +0200
+++ 
libsigrok-git-20102018-hameg-hmo-acquire-samples-v4/src/hardware/hameg-hmo/protocol.h
       2018-10-24 16:58:02.223339363 +0200
@@ -102,8 +102,10 @@ struct dev_context {
 
        GSList *enabled_channels;
        GSList *current_channel;
+       uint64_t num_samples;
        uint64_t num_frames;
 
+       uint64_t samples_limit;
        uint64_t frame_limit;
 
        size_t pod_count;


_______________________________________________
sigrok-devel mailing list
sigrok-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sigrok-devel

Reply via email to