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 second version (v2) of this patch introduced the support for 16
digital (logic) channels for the following oscilloscope models: HMO3032,
HMO3042, HMO3052 and HMO3522 (previously only 8 digital channels were
supported, i.e. only 1 POD).

Also, such version had been tested not only with 8 digital (logic)
channels (i.e. with 1 POD) as in the first version, but also with 16
digital (logic) channels (i.e. with 2 PODs).

Finally, the previous version (v2) took care of removing an invalid
product model (HMO2522) and added a missing product model (HMO3522),
thus extending the number of supported oscilloscope models.

This third version (v3) fixes a bug in the previous (v2) version that
was causing a 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 |   90 +++++++++++++++++++++++++++++++-------
 src/hardware/hameg-hmo/protocol.h |    2 
 3 files changed, 85 insertions(+), 15 deletions(-)

diff -pru libsigrok-git-20102018-orig/src/hardware/hameg-hmo/api.c 
libsigrok-git-20102018-hameg-hmo-acquire-samples/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/src/hardware/hameg-hmo/api.c   
    2018-10-23 23:04:30.718160975 +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/src/hardware/hameg-hmo/protocol.c
--- libsigrok-git-20102018-orig/src/hardware/hameg-hmo/protocol.c       
2018-10-20 13:12:30.895966966 +0200
+++ 
libsigrok-git-20102018-hameg-hmo-acquire-samples/src/hardware/hameg-hmo/protocol.c
  2018-10-23 23:05:33.738160718 +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,
@@ -88,19 +89,30 @@ static const char *scope_trigger_slopes[
        "EITH",
 };
 
-static const char *compact2_trigger_sources[] = {
+/* HMO compact2 */
+static const char *an2_dig8_trigger_sources[] = {
        "CH1", "CH2",
        "LINE", "EXT", "PATT", "BUS1", "BUS2",
        "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
 };
 
-static const char *compact4_trigger_sources[] = {
+/* HMO xxx2 */
+static const char *an2_dig16_trigger_sources[] = {
+        "CH1", "CH2",
+        "LINE", "EXT", "PATT", "BUS1", "BUS2",
+        "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
+        "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15",
+};
+
+/* HMO compact4 */
+static const char *an4_dig8_trigger_sources[] = {
        "CH1", "CH2", "CH3", "CH4",
        "LINE", "EXT", "PATT", "BUS1", "BUS2",
        "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
 };
 
-static const char *compact4_dig16_trigger_sources[] = {
+/* HMO xxx4 */
+static const char *an4_dig16_trigger_sources[] = {
        "CH1", "CH2", "CH3", "CH4",
        "LINE", "EXT", "PATT", "BUS1", "BUS2",
        "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
@@ -177,9 +189,8 @@ static const char *scope_digital_channel
 
 static const struct scope_config scope_models[] = {
        {
-               /* HMO2522/3032/3042/3052 support 16 digital channels but 
they're not supported yet. */
-               .name = {"HMO1002", "HMO722", "HMO1022", "HMO1522", "HMO2022", 
"HMO2522",
-                               "HMO3032", "HMO3042", "HMO3052", NULL},
+               /* HMO722/1002/1022/1522/2022 support only 8 digital channels. 
*/
+               .name = {"HMO1002", "HMO722", "HMO1022", "HMO1522", "HMO2022", 
NULL},
                .analog_channels = 2,
                .digital_channels = 8,
                .digital_pods = 1,
@@ -196,8 +207,44 @@ static const struct scope_config scope_m
                .coupling_options = &coupling_options,
                .num_coupling_options = ARRAY_SIZE(coupling_options),
 
-               .trigger_sources = &compact2_trigger_sources,
-               .num_trigger_sources = ARRAY_SIZE(compact2_trigger_sources),
+               .trigger_sources = &an2_dig8_trigger_sources,
+               .num_trigger_sources = ARRAY_SIZE(an2_dig8_trigger_sources),
+
+               .trigger_slopes = &scope_trigger_slopes,
+               .num_trigger_slopes = ARRAY_SIZE(scope_trigger_slopes),
+
+               .timebases = &timebases,
+               .num_timebases = ARRAY_SIZE(timebases),
+
+               .vdivs = &vdivs,
+               .num_vdivs = ARRAY_SIZE(vdivs),
+
+               .num_xdivs = 12,
+               .num_ydivs = 8,
+
+               .scpi_dialect = &hameg_scpi_dialect,
+       },
+       {
+               /* HMO3032/3042/3052/3522 support 16 digital channels. */
+               .name = {"HMO3032", "HMO3042", "HMO3052", "3522", NULL},
+               .analog_channels = 2,
+               .digital_channels = 16,
+               .digital_pods = 2,
+
+               .analog_names = &scope_analog_channel_names,
+               .digital_names = &scope_digital_channel_names,
+
+               .devopts = &devopts,
+               .num_devopts = ARRAY_SIZE(devopts),
+
+               .devopts_cg_analog = &devopts_cg_analog,
+               .num_devopts_cg_analog = ARRAY_SIZE(devopts_cg_analog),
+
+               .coupling_options = &coupling_options,
+               .num_coupling_options = ARRAY_SIZE(coupling_options),
+
+               .trigger_sources = &an2_dig16_trigger_sources,
+               .num_trigger_sources = ARRAY_SIZE(an2_dig16_trigger_sources),
 
                .trigger_slopes = &scope_trigger_slopes,
                .num_trigger_slopes = ARRAY_SIZE(scope_trigger_slopes),
@@ -231,8 +278,8 @@ static const struct scope_config scope_m
                .coupling_options = &coupling_options,
                .num_coupling_options = ARRAY_SIZE(coupling_options),
 
-               .trigger_sources = &compact4_trigger_sources,
-               .num_trigger_sources = ARRAY_SIZE(compact4_trigger_sources),
+               .trigger_sources = &an4_dig8_trigger_sources,
+               .num_trigger_sources = ARRAY_SIZE(an4_dig8_trigger_sources),
 
                .trigger_slopes = &scope_trigger_slopes,
                .num_trigger_slopes = ARRAY_SIZE(scope_trigger_slopes),
@@ -266,8 +313,8 @@ static const struct scope_config scope_m
                .coupling_options = &coupling_options,
                .num_coupling_options = ARRAY_SIZE(coupling_options),
 
-               .trigger_sources = &compact4_dig16_trigger_sources,
-               .num_trigger_sources = 
ARRAY_SIZE(compact4_dig16_trigger_sources),
+               .trigger_sources = &an4_dig16_trigger_sources,
+               .num_trigger_sources = ARRAY_SIZE(an4_dig16_trigger_sources),
 
                .trigger_slopes = &scope_trigger_slopes,
                .num_trigger_slopes = ARRAY_SIZE(scope_trigger_slopes),
@@ -737,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)))
@@ -792,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. */
@@ -889,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;
@@ -921,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;
@@ -948,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);
@@ -956,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;
@@ -989,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 {
diff -pru libsigrok-git-20102018-orig/src/hardware/hameg-hmo/protocol.h 
libsigrok-git-20102018-hameg-hmo-acquire-samples/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/src/hardware/hameg-hmo/protocol.h
  2018-10-23 23:04:30.724160975 +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