From: Guido Trentalancia Date: Fri, 16 Nov 2018 17:41:30 +0000 (+0100) Subject: hameg-hmo: Add SR_CONF_LIMIT_SAMPLES support. X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=d779dcacb70ffcfed190612e39a3ac5df62b31e0;p=libsigrok.git hameg-hmo: Add SR_CONF_LIMIT_SAMPLES support. 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. --- diff --git a/src/hardware/hameg-hmo/api.c b/src/hardware/hameg-hmo/api.c index 1274b919..bf46a3bb 100644 --- a/src/hardware/hameg-hmo/api.c +++ b/src/hardware/hameg-hmo/api.c @@ -247,6 +247,10 @@ static int config_set(uint32_t key, GVariant *data, 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 struct sr_dev_inst *sdi) 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 sr_dev_inst *sdi) devc = sdi->priv; + devc->num_samples = 0; devc->num_frames = 0; g_slist_free(devc->enabled_channels); devc->enabled_channels = NULL; diff --git a/src/hardware/hameg-hmo/protocol.c b/src/hardware/hameg-hmo/protocol.c index 3406f2df..41b14d48 100644 --- a/src/hardware/hameg-hmo/protocol.c +++ b/src/hardware/hameg-hmo/protocol.c @@ -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_dev_inst *sdi) } 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))) @@ -821,8 +823,6 @@ SR_PRIV void hmo_queue_logic_data(struct dev_context *devc, } else { store = devc->logic_data; size = store->len / devc->pod_count; - if (size != pod_data->len) - return; if (group >= devc->pod_count) return; } @@ -838,6 +838,10 @@ SR_PRIV void hmo_queue_logic_data(struct dev_context *devc, *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. */ @@ -934,6 +938,9 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data) 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; @@ -966,6 +973,7 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data) 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 +1002,9 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data) 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 +1013,7 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data) 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 +1047,10 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data) /* * 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 --git a/src/hardware/hameg-hmo/protocol.h b/src/hardware/hameg-hmo/protocol.h index 43220dd7..8620dedc 100644 --- a/src/hardware/hameg-hmo/protocol.h +++ b/src/hardware/hameg-hmo/protocol.h @@ -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;