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.

This second version (v2) of the patch has been tested not only with 8
digital (logic) channels (only 1 POD), but also with 16 digital (logic)
channels (2 PODs).

Also, this second version (v2) takes care of removing an invalid product
model (HMO2522) and adds a missing product model (HMO3522), thus
extending the number of supported oscilloscope models.

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/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/src/hardware/hameg-hmo/api.c 2018-10-22 
00:59:11.952617966 +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/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/src/hardware/hameg-hmo/protocol.c    2018-10-22 
15:40:31.531275932 +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->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 (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 (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/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/src/hardware/hameg-hmo/protocol.h    2018-10-21 
23:15:32.813642035 +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