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,
"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",
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 = {"HMO722", "HMO1002", "HMO1022", "HMO1522", "HMO2022", NULL},
.analog_channels = 2,
.digital_channels = 8,
.digital_pods = 1,
.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", "HMO3522", 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),
.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),
.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),
unsigned int i, j, group;
struct sr_channel *ch;
struct dev_context *devc;
+ int ret;
devc = sdi->priv;
model_index = -1;
devc->analog_groups = g_malloc0(sizeof(struct sr_channel_group*) *
scope_models[model_index].analog_channels);
-
devc->digital_groups = g_malloc0(sizeof(struct sr_channel_group*) *
scope_models[model_index].digital_pods);
+ if (!devc->analog_groups || !devc->digital_groups) {
+ g_free(devc->analog_groups);
+ g_free(devc->digital_groups);
+ return SR_ERR_MALLOC;
+ }
/* Add analog channels. */
for (i = 0; i < scope_models[model_index].analog_channels; i++) {
}
/* Add digital channel groups. */
+ ret = SR_OK;
for (i = 0; i < scope_models[model_index].digital_pods; i++) {
devc->digital_groups[i] = g_malloc0(sizeof(struct sr_channel_group));
+ if (!devc->digital_groups[i]) {
+ ret = SR_ERR_MALLOC;
+ break;
+ }
devc->digital_groups[i]->name = g_strdup_printf("POD%d", i);
sdi->channel_groups = g_slist_append(sdi->channel_groups,
devc->digital_groups[i]);
}
+ if (ret != SR_OK)
+ return ret;
/* Add digital channels. */
for (i = 0; i < scope_models[model_index].digital_channels; i++) {
}
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)))
} else {
store = devc->logic_data;
size = store->len / devc->pod_count;
- if (size != pod_data->len)
- return;
if (group >= devc->pod_count)
return;
}
*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. */
if (sr_scpi_get_block(sdi->conn, NULL, &data) != SR_OK) {
if (data)
g_byte_array_free(data, TRUE);
-
return TRUE;
}
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;
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;
break;
case SR_CHANNEL_LOGIC:
if (sr_scpi_get_block(sdi->conn, NULL, &data) != SR_OK) {
- g_free(data);
+ if (data)
+ g_byte_array_free(data, TRUE);
return TRUE;
}
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);
hmo_queue_logic_data(devc, group, data);
}
+ devc->num_samples = data->len / devc->pod_count;
g_byte_array_free(data, TRUE);
data = NULL;
break;
/*
* 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 {