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.
This commit is contained in:
parent
6d0f3508f7
commit
d779dcacb7
|
@ -247,6 +247,10 @@ static int config_set(uint32_t key, GVariant *data,
|
||||||
update_sample_rate = FALSE;
|
update_sample_rate = FALSE;
|
||||||
|
|
||||||
switch (key) {
|
switch (key) {
|
||||||
|
case SR_CONF_LIMIT_SAMPLES:
|
||||||
|
devc->samples_limit = g_variant_get_uint64(data);
|
||||||
|
ret = SR_OK;
|
||||||
|
break;
|
||||||
case SR_CONF_LIMIT_FRAMES:
|
case SR_CONF_LIMIT_FRAMES:
|
||||||
devc->frame_limit = g_variant_get_uint64(data);
|
devc->frame_limit = g_variant_get_uint64(data);
|
||||||
ret = SR_OK;
|
ret = SR_OK;
|
||||||
|
@ -601,6 +605,9 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
|
||||||
scpi = sdi->conn;
|
scpi = sdi->conn;
|
||||||
devc = sdi->priv;
|
devc = sdi->priv;
|
||||||
|
|
||||||
|
devc->num_samples = 0;
|
||||||
|
devc->num_frames = 0;
|
||||||
|
|
||||||
/* Preset empty results. */
|
/* Preset empty results. */
|
||||||
for (group = 0; group < ARRAY_SIZE(digital_added); group++)
|
for (group = 0; group < ARRAY_SIZE(digital_added); group++)
|
||||||
digital_added[group] = FALSE;
|
digital_added[group] = FALSE;
|
||||||
|
@ -681,6 +688,7 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi)
|
||||||
|
|
||||||
devc = sdi->priv;
|
devc = sdi->priv;
|
||||||
|
|
||||||
|
devc->num_samples = 0;
|
||||||
devc->num_frames = 0;
|
devc->num_frames = 0;
|
||||||
g_slist_free(devc->enabled_channels);
|
g_slist_free(devc->enabled_channels);
|
||||||
devc->enabled_channels = NULL;
|
devc->enabled_channels = NULL;
|
||||||
|
|
|
@ -59,6 +59,7 @@ static const char *hameg_scpi_dialect[] = {
|
||||||
|
|
||||||
static const uint32_t devopts[] = {
|
static const uint32_t devopts[] = {
|
||||||
SR_CONF_OSCILLOSCOPE,
|
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_LIMIT_FRAMES | SR_CONF_GET | SR_CONF_SET,
|
||||||
SR_CONF_SAMPLERATE | SR_CONF_GET,
|
SR_CONF_SAMPLERATE | SR_CONF_GET,
|
||||||
SR_CONF_TIMEBASE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
|
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->model_config = &scope_models[model_index];
|
||||||
|
devc->samples_limit = 0;
|
||||||
devc->frame_limit = 0;
|
devc->frame_limit = 0;
|
||||||
|
|
||||||
if (!(devc->model_state = scope_state_new(devc->model_config)))
|
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 {
|
} else {
|
||||||
store = devc->logic_data;
|
store = devc->logic_data;
|
||||||
size = store->len / devc->pod_count;
|
size = store->len / devc->pod_count;
|
||||||
if (size != pod_data->len)
|
|
||||||
return;
|
|
||||||
if (group >= devc->pod_count)
|
if (group >= devc->pod_count)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -838,6 +838,10 @@ SR_PRIV void hmo_queue_logic_data(struct dev_context *devc,
|
||||||
*logic_data = pod_data->data[idx];
|
*logic_data = pod_data->data[idx];
|
||||||
logic_data += logic_step;
|
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. */
|
/* 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.data = data->data;
|
||||||
analog.num_samples = data->len / sizeof(float);
|
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.encoding = &encoding;
|
||||||
analog.meaning = &meaning;
|
analog.meaning = &meaning;
|
||||||
analog.spec = &spec;
|
analog.spec = &spec;
|
||||||
|
@ -966,6 +973,7 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data)
|
||||||
spec.spec_digits = 2;
|
spec.spec_digits = 2;
|
||||||
packet.payload = &analog;
|
packet.payload = &analog;
|
||||||
sr_session_send(sdi, &packet);
|
sr_session_send(sdi, &packet);
|
||||||
|
devc->num_samples = data->len / sizeof(float);
|
||||||
g_slist_free(meaning.channels);
|
g_slist_free(meaning.channels);
|
||||||
g_byte_array_free(data, TRUE);
|
g_byte_array_free(data, TRUE);
|
||||||
data = NULL;
|
data = NULL;
|
||||||
|
@ -994,6 +1002,9 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data)
|
||||||
packet.type = SR_DF_LOGIC;
|
packet.type = SR_DF_LOGIC;
|
||||||
logic.data = data->data;
|
logic.data = data->data;
|
||||||
logic.length = data->len;
|
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;
|
logic.unitsize = 1;
|
||||||
packet.payload = &logic;
|
packet.payload = &logic;
|
||||||
sr_session_send(sdi, &packet);
|
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);
|
hmo_queue_logic_data(devc, group, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
devc->num_samples = data->len / devc->pod_count;
|
||||||
g_byte_array_free(data, TRUE);
|
g_byte_array_free(data, TRUE);
|
||||||
data = NULL;
|
data = NULL;
|
||||||
break;
|
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
|
* End of frame was reached. Stop acquisition after the specified
|
||||||
* number of frames, or continue reception by starting over at
|
* number of frames or after the specified number of samples, or
|
||||||
* the first enabled channel.
|
* 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);
|
sr_dev_acquisition_stop(sdi);
|
||||||
hmo_cleanup_logic_data(devc);
|
hmo_cleanup_logic_data(devc);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -102,8 +102,10 @@ struct dev_context {
|
||||||
|
|
||||||
GSList *enabled_channels;
|
GSList *enabled_channels;
|
||||||
GSList *current_channel;
|
GSList *current_channel;
|
||||||
|
uint64_t num_samples;
|
||||||
uint64_t num_frames;
|
uint64_t num_frames;
|
||||||
|
|
||||||
|
uint64_t samples_limit;
|
||||||
uint64_t frame_limit;
|
uint64_t frame_limit;
|
||||||
|
|
||||||
size_t pod_count;
|
size_t pod_count;
|
||||||
|
|
Loading…
Reference in New Issue