X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fyokogawa-dlm%2Fapi.c;h=f80e83dceb7e91537252d05b37a516e12e225ac3;hb=070668a0fd0876485ea6867eb60010da0ef1c304;hp=5e554608dc850689a2dd5ec934b6368dd66b568e;hpb=d1ac53ccd5a5cf3b40539bb26509321cbc7df6b7;p=libsigrok.git diff --git a/src/hardware/yokogawa-dlm/api.c b/src/hardware/yokogawa-dlm/api.c index 5e554608..f80e83dc 100644 --- a/src/hardware/yokogawa-dlm/api.c +++ b/src/hardware/yokogawa-dlm/api.c @@ -162,31 +162,30 @@ static int dev_close(struct sr_dev_inst *sdi) static int check_channel_group(struct dev_context *devc, const struct sr_channel_group *cg) { - unsigned int i; const struct scope_config *model; + if (!devc) + return CG_INVALID; model = devc->model_config; if (!cg) return CG_NONE; - for (i = 0; i < model->analog_channels; i++) - if (cg == devc->analog_groups[i]) - return CG_ANALOG; + if (std_cg_idx(cg, devc->analog_groups, model->analog_channels) >= 0) + return CG_ANALOG; - for (i = 0; i < model->pods; i++) - if (cg == devc->digital_groups[i]) - return CG_DIGITAL; + if (std_cg_idx(cg, devc->digital_groups, model->pods) >= 0) + return CG_DIGITAL; sr_err("Invalid channel group specified."); + return CG_INVALID; } static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi, const struct sr_channel_group *cg) { - int ret, cg_type; - unsigned int i; + int ret, cg_type, idx; struct dev_context *devc; const struct scope_config *model; struct scope_state *state; @@ -214,32 +213,24 @@ static int config_get(uint32_t key, GVariant **data, ret = SR_OK; break; case SR_CONF_NUM_VDIV: - if (cg_type == CG_NONE) { + if (!cg) return SR_ERR_CHANNEL_GROUP; - } else if (cg_type == CG_ANALOG) { - *data = g_variant_new_int32(model->num_ydivs); - ret = SR_OK; - break; - } else { - ret = SR_ERR_NA; - } + if (cg_type != CG_ANALOG) + return SR_ERR_NA; + *data = g_variant_new_int32(model->num_ydivs); + ret = SR_OK; break; case SR_CONF_VDIV: - ret = SR_ERR_NA; - if (cg_type == CG_NONE) { + if (!cg) return SR_ERR_CHANNEL_GROUP; - } else if (cg_type != CG_ANALOG) - break; - - for (i = 0; i < model->analog_channels; i++) { - if (cg != devc->analog_groups[i]) - continue; - *data = g_variant_new("(tt)", - dlm_vdivs[state->analog_states[i].vdiv][0], - dlm_vdivs[state->analog_states[i].vdiv][1]); - ret = SR_OK; - break; - } + if (cg_type != CG_ANALOG) + return SR_ERR_NA; + if ((idx = std_cg_idx(cg, devc->analog_groups, model->analog_channels)) < 0) + return SR_ERR_ARG; + *data = g_variant_new("(tt)", + dlm_vdivs[state->analog_states[idx].vdiv][0], + dlm_vdivs[state->analog_states[idx].vdiv][1]); + ret = SR_OK; break; case SR_CONF_TRIGGER_SOURCE: *data = g_variant_new_string((*model->trigger_sources)[state->trigger_source]); @@ -254,19 +245,14 @@ static int config_get(uint32_t key, GVariant **data, ret = SR_OK; break; case SR_CONF_COUPLING: - ret = SR_ERR_NA; - if (cg_type == CG_NONE) { + if (!cg) return SR_ERR_CHANNEL_GROUP; - } else if (cg_type != CG_ANALOG) - break; - - for (i = 0; i < model->analog_channels; i++) { - if (cg != devc->analog_groups[i]) - continue; - *data = g_variant_new_string((*model->coupling_options)[state->analog_states[i].coupling]); - ret = SR_OK; - break; - } + if (cg_type != CG_ANALOG) + return SR_ERR_NA; + if ((idx = std_cg_idx(cg, devc->analog_groups, model->analog_channels)) < 0) + return SR_ERR_ARG; + *data = g_variant_new_string((*model->coupling_options)[state->analog_states[idx].coupling]); + ret = SR_OK; break; case SR_CONF_SAMPLERATE: *data = g_variant_new_uint64(state->sample_rate); @@ -282,8 +268,7 @@ static int config_get(uint32_t key, GVariant **data, static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sdi, const struct sr_channel_group *cg) { - int ret, cg_type, idx; - unsigned int j; + int ret, cg_type, idx, j; char float_str[30]; struct dev_context *devc; const struct scope_config *model; @@ -301,8 +286,6 @@ static int config_set(uint32_t key, GVariant *data, state = devc->model_state; update_sample_rate = FALSE; - ret = SR_ERR_NA; - switch (key) { case SR_CONF_LIMIT_FRAMES: devc->frame_limit = g_variant_get_uint64(data); @@ -316,21 +299,18 @@ static int config_set(uint32_t key, GVariant *data, ret = dlm_trigger_source_set(sdi->conn, (*model->trigger_sources)[idx]); break; case SR_CONF_VDIV: - if (cg_type == CG_NONE) + if (!cg) return SR_ERR_CHANNEL_GROUP; if ((idx = std_u64_tuple_idx(data, ARRAY_AND_SIZE(dlm_vdivs))) < 0) return SR_ERR_ARG; - for (j = 0; j < model->analog_channels; j++) { - if (cg != devc->analog_groups[j]) - continue; - state->analog_states[j].vdiv = idx; - g_ascii_formatd(float_str, sizeof(float_str), - "%E", (float) dlm_vdivs[idx][0] / dlm_vdivs[idx][1]); - if (dlm_analog_chan_vdiv_set(sdi->conn, j + 1, float_str) != SR_OK || - sr_scpi_get_opc(sdi->conn) != SR_OK) - return SR_ERR; - break; - } + if ((j = std_cg_idx(cg, devc->analog_groups, model->analog_channels)) < 0) + return SR_ERR_ARG; + state->analog_states[j].vdiv = idx; + g_ascii_formatd(float_str, sizeof(float_str), + "%E", (float) dlm_vdivs[idx][0] / dlm_vdivs[idx][1]); + if (dlm_analog_chan_vdiv_set(sdi->conn, j + 1, float_str) != SR_OK || + sr_scpi_get_opc(sdi->conn) != SR_OK) + return SR_ERR; ret = SR_OK; break; case SR_CONF_TIMEBASE: @@ -366,19 +346,16 @@ static int config_set(uint32_t key, GVariant *data, ret = dlm_trigger_slope_set(sdi->conn, state->trigger_slope); break; case SR_CONF_COUPLING: - if (cg_type == CG_NONE) + if (!cg) return SR_ERR_CHANNEL_GROUP; if ((idx = std_str_idx(data, *model->coupling_options, model->num_coupling_options)) < 0) return SR_ERR_ARG; - for (j = 0; j <= model->analog_channels; j++) { - if (cg != devc->analog_groups[j]) - continue; - state->analog_states[j].coupling = idx; - if (dlm_analog_chan_coupl_set(sdi->conn, j + 1, (*model->coupling_options)[idx]) != SR_OK || - sr_scpi_get_opc(sdi->conn) != SR_OK) - return SR_ERR; - break; - } + if ((j = std_cg_idx(cg, devc->analog_groups, model->analog_channels)) < 0) + return SR_ERR_ARG; + state->analog_states[j].coupling = idx; + if (dlm_analog_chan_coupl_set(sdi->conn, j + 1, (*model->coupling_options)[idx]) != SR_OK || + sr_scpi_get_opc(sdi->conn) != SR_OK) + return SR_ERR; ret = SR_OK; break; default: @@ -432,6 +409,8 @@ static int config_list(uint32_t key, GVariant **data, *data = g_variant_new_strv(ARRAY_AND_SIZE(dlm_trigger_slopes)); return SR_OK; case SR_CONF_NUM_HDIV: + if (!model) + return SR_ERR_ARG; *data = g_variant_new_uint32(model->num_xdivs); return SR_OK; default: @@ -452,12 +431,12 @@ static int config_list(uint32_t key, GVariant **data, *data = std_gvar_array_u32(NULL, 0); break; case SR_CONF_COUPLING: - if (cg_type == CG_NONE) + if (!cg) return SR_ERR_CHANNEL_GROUP; *data = g_variant_new_strv(*model->coupling_options, model->num_coupling_options); break; case SR_CONF_VDIV: - if (cg_type == CG_NONE) + if (!cg) return SR_ERR_CHANNEL_GROUP; *data = std_gvar_tuple_array(ARRAY_AND_SIZE(dlm_vdivs)); break;