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 after the patch mentioned above and before this patch. The 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). This fifth version (v5) simply corrects the patch ordering comment above and removes an unneeded diff line. 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 { 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