"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),
return SR_ERR;
}
-static int analog_channel_state_get(struct sr_scpi_dev_inst *scpi,
+static struct sr_channel *get_channel_by_index_and_type(GSList *channel_lhead,
+ int index, int type)
+{
+ while (channel_lhead) {
+ struct sr_channel *ch = channel_lhead->data;
+ if (ch->index == index && ch->type == type)
+ return ch;
+
+ channel_lhead = channel_lhead->next;
+ }
+
+ return 0;
+}
+
+static int analog_channel_state_get(struct sr_dev_inst *sdi,
const struct scope_config *config,
struct scope_state *state)
{
unsigned int i, j;
char command[MAX_COMMAND_SIZE];
char *tmp_str;
+ struct sr_channel *ch;
+ struct sr_scpi_dev_inst *scpi = sdi->conn;
for (i = 0; i < config->analog_channels; i++) {
g_snprintf(command, sizeof(command),
&state->analog_channels[i].state) != SR_OK)
return SR_ERR;
+ ch = get_channel_by_index_and_type(sdi->channels, i, SR_CHANNEL_ANALOG);
+ if (ch)
+ ch->enabled = state->analog_channels[i].state;
+
g_snprintf(command, sizeof(command),
(*config->scpi_dialect)[SCPI_CMD_GET_VERTICAL_DIV],
i + 1);
return SR_OK;
}
-static int digital_channel_state_get(struct sr_scpi_dev_inst *scpi,
+static int digital_channel_state_get(struct sr_dev_inst *sdi,
const struct scope_config *config,
struct scope_state *state)
{
unsigned int i;
char command[MAX_COMMAND_SIZE];
+ struct sr_channel *ch;
+ struct sr_scpi_dev_inst *scpi = sdi->conn;
for (i = 0; i < config->digital_channels; i++) {
g_snprintf(command, sizeof(command),
if (sr_scpi_get_bool(scpi, command,
&state->digital_channels[i]) != SR_OK)
return SR_ERR;
+
+ ch = get_channel_by_index_and_type(sdi->channels, i, SR_CHANNEL_LOGIC);
+ if (ch)
+ ch->enabled = state->digital_channels[i];
}
for (i = 0; i < config->digital_pods; i++) {
struct dev_context *devc;
struct scope_state *state;
const struct scope_config *config;
-
int tmp;
unsigned int i;
float tmp_float;
sr_info("Fetching scope state");
- if (analog_channel_state_get(sdi->conn, config, state) != SR_OK)
+ if (analog_channel_state_get(sdi, config, state) != SR_OK)
return SR_ERR;
- if (digital_channel_state_get(sdi->conn, config, state) != SR_OK)
+ if (digital_channel_state_get(sdi, config, state) != SR_OK)
return SR_ERR;
if (sr_scpi_get_float(sdi->conn,
SR_PRIV int hmo_init_device(struct sr_dev_inst *sdi)
{
- char tmp[25];
int model_index;
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++) {
- g_snprintf(tmp, 25, "POD%d", i);
-
devc->digital_groups[i] = g_malloc0(sizeof(struct sr_channel_group));
-
- devc->digital_groups[i]->name = g_strdup(tmp);
+ 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++) {
if (sr_scpi_get_block(sdi->conn, NULL, &data) != SR_OK) {
if (data)
g_byte_array_free(data, TRUE);
-
return TRUE;
}
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;
}