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