From: Soeren Apel Date: Sun, 7 Jun 2015 09:40:39 +0000 (+0200) Subject: yokogawa-dlm: Config get/set/list handler updates X-Git-Tag: libsigrok-0.4.0~480 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=f3c60fb6affce2ebd81250db1d60bee733e5f479;p=libsigrok.git yokogawa-dlm: Config get/set/list handler updates --- diff --git a/src/hardware/yokogawa-dlm/api.c b/src/hardware/yokogawa-dlm/api.c index 11dbfda1..0ccf5834 100644 --- a/src/hardware/yokogawa-dlm/api.c +++ b/src/hardware/yokogawa-dlm/api.c @@ -26,11 +26,34 @@ SR_PRIV struct sr_dev_driver yokogawa_dlm_driver_info; static const char *MANUFACTURER_ID = "YOKOGAWA"; static const char *MANUFACTURER_NAME = "Yokogawa"; -static const uint32_t drvopts[] = { +static const uint32_t dlm_scanopts[] = { + SR_CONF_CONN, +}; + +static const uint32_t dlm_drvopts[] = { SR_CONF_LOGIC_ANALYZER, SR_CONF_OSCILLOSCOPE, }; +static const uint32_t dlm_devopts[] = { + 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, + SR_CONF_NUM_HDIV | SR_CONF_GET, + SR_CONF_HORIZ_TRIGGERPOS | SR_CONF_GET | SR_CONF_SET, + SR_CONF_TRIGGER_SLOPE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, + SR_CONF_TRIGGER_SOURCE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, +}; + +static const uint32_t dlm_analog_devopts[] = { + SR_CONF_COUPLING | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, + SR_CONF_VDIV | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, + SR_CONF_NUM_VDIV | SR_CONF_GET, +}; + +static const uint32_t dlm_digital_devopts[] = { +}; + enum { CG_INVALID = -1, CG_NONE, @@ -222,8 +245,8 @@ static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *s break; case SR_CONF_TIMEBASE: *data = g_variant_new("(tt)", - (*model->timebases)[state->timebase][0], - (*model->timebases)[state->timebase][1]); + dlm_timebases[state->timebase][0], + dlm_timebases[state->timebase][1]); ret = SR_OK; break; case SR_CONF_NUM_VDIV: @@ -250,8 +273,8 @@ static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *s if (cg != devc->analog_groups[i]) continue; *data = g_variant_new("(tt)", - (*model->vdivs)[state->analog_states[i].vdiv][0], - (*model->vdivs)[state->analog_states[i].vdiv][1]); + dlm_vdivs[state->analog_states[i].vdiv][0], + dlm_vdivs[state->analog_states[i].vdiv][1]); ret = SR_OK; break; } @@ -261,7 +284,7 @@ static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *s ret = SR_OK; break; case SR_CONF_TRIGGER_SLOPE: - *data = g_variant_new_string((*model->trigger_slopes)[state->trigger_slope]); + *data = g_variant_new_string(dlm_trigger_slopes[state->trigger_slope]); ret = SR_OK; break; case SR_CONF_HORIZ_TRIGGERPOS: @@ -364,9 +387,9 @@ static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sd g_variant_get(data, "(tt)", &p, &q); - for (i = 0; i < model->num_vdivs; i++) { - if (p != (*model->vdivs)[i][0] || - q != (*model->vdivs)[i][1]) + for (i = 0; i < ARRAY_SIZE(dlm_vdivs); i++) { + if (p != dlm_vdivs[i][0] || + q != dlm_vdivs[i][1]) continue; for (j = 1; j <= model->analog_channels; ++j) { if (cg != devc->analog_groups[j - 1]) @@ -388,9 +411,9 @@ static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sd case SR_CONF_TIMEBASE: g_variant_get(data, "(tt)", &p, &q); - for (i = 0; i < model->num_timebases; i++) { - if (p != (*model->timebases)[i][0] || - q != (*model->timebases)[i][1]) + for (i = 0; i < ARRAY_SIZE(dlm_timebases); i++) { + if (p != dlm_timebases[i][0] || + q != dlm_timebases[i][1]) continue; state->timebase = i; g_ascii_formatd(float_str, sizeof(float_str), @@ -409,8 +432,8 @@ static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sd state->horiz_triggerpos = tmp_d; tmp_d = -(tmp_d - 0.5) * - ((double) (*model->timebases)[state->timebase][0] / - (*model->timebases)[state->timebase][1]) + ((double) dlm_timebases[state->timebase][0] / + dlm_timebases[state->timebase][1]) * model->num_xdivs; g_ascii_formatd(float_str, sizeof(float_str), "%E", tmp_d); @@ -475,25 +498,66 @@ static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst * struct dev_context *devc = NULL; const struct scope_config *model = NULL; - if (sdi && (devc = sdi->priv)) { - if ((cg_type = check_channel_group(devc, cg)) == CG_INVALID) - return SR_ERR; + /* SR_CONF_SCAN_OPTIONS is always valid, regardless of sdi or probe group. */ + if (key == SR_CONF_SCAN_OPTIONS) { + *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, + dlm_scanopts, ARRAY_SIZE(dlm_scanopts), sizeof(uint32_t)); + return SR_OK; + } - model = devc->model_config; + /* If sdi is NULL, nothing except SR_CONF_DEVICE_OPTIONS can be provided. */ + if (key == SR_CONF_DEVICE_OPTIONS && !sdi) { + *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, + dlm_drvopts, ARRAY_SIZE(dlm_drvopts), sizeof(uint32_t)); + return SR_OK; } + if (!sdi) + return SR_ERR_ARG; + + devc = sdi->priv; + model = devc->model_config; + + /* If cg is NULL, only the SR_CONF_DEVICE_OPTIONS that are not + * specific to a probe group must be returned. */ + if (!cg) { + switch (key) { + case SR_CONF_DEVICE_OPTIONS: + *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, + dlm_devopts, ARRAY_SIZE(dlm_devopts), sizeof(uint32_t)); + return SR_OK; + case SR_CONF_TIMEBASE: + *data = build_tuples(&dlm_timebases, ARRAY_SIZE(dlm_timebases)); + return SR_OK; + case SR_CONF_TRIGGER_SOURCE: + if (!model) + return SR_ERR_ARG; + *data = g_variant_new_strv(*model->trigger_sources, + g_strv_length((char **)*model->trigger_sources)); + return SR_OK; + case SR_CONF_TRIGGER_SLOPE: + *data = g_variant_new_strv(dlm_trigger_slopes, + g_strv_length((char **)dlm_trigger_slopes)); + return SR_OK; + case SR_CONF_NUM_HDIV: + *data = g_variant_new_uint32(ARRAY_SIZE(dlm_timebases)); + return SR_OK; + default: + return SR_ERR_NA; + } + } + + if ((cg_type = check_channel_group(devc, cg)) == CG_INVALID) + return SR_ERR; + switch (key) { case SR_CONF_DEVICE_OPTIONS: - if (cg_type == CG_NONE) { - if (model) - *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, - model->devopts, model->num_devopts, sizeof(uint32_t)); - else - *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, - drvopts, ARRAY_SIZE(drvopts), sizeof(uint32_t)); - } else if (cg_type == CG_ANALOG) { + if (cg_type == CG_ANALOG) { + *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, + dlm_analog_devopts, ARRAY_SIZE(dlm_analog_devopts), sizeof(uint32_t)); + } else if (cg_type == CG_DIGITAL) { *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, - model->analog_devopts, model->num_analog_devopts, sizeof(uint32_t)); + dlm_digital_devopts, ARRAY_SIZE(dlm_digital_devopts), sizeof(uint32_t)); } else { *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, NULL, 0, sizeof(uint32_t)); @@ -505,27 +569,10 @@ static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst * *data = g_variant_new_strv(*model->coupling_options, g_strv_length((char **)*model->coupling_options)); break; - case SR_CONF_TRIGGER_SOURCE: - if (!model) - return SR_ERR_ARG; - *data = g_variant_new_strv(*model->trigger_sources, - g_strv_length((char **)*model->trigger_sources)); - break; - case SR_CONF_TRIGGER_SLOPE: - if (!model) - return SR_ERR_ARG; - *data = g_variant_new_strv(*model->trigger_slopes, - g_strv_length((char **)*model->trigger_slopes)); - break; - case SR_CONF_TIMEBASE: - if (!model) - return SR_ERR_ARG; - *data = build_tuples(model->timebases, model->num_timebases); - break; case SR_CONF_VDIV: if (cg_type == CG_NONE) return SR_ERR_CHANNEL_GROUP; - *data = build_tuples(model->vdivs, model->num_vdivs); + *data = build_tuples(&dlm_vdivs, ARRAY_SIZE(dlm_vdivs)); break; default: return SR_ERR_NA; diff --git a/src/hardware/yokogawa-dlm/protocol.c b/src/hardware/yokogawa-dlm/protocol.c index 11b8638e..a60bc0d3 100644 --- a/src/hardware/yokogawa-dlm/protocol.c +++ b/src/hardware/yokogawa-dlm/protocol.c @@ -25,24 +25,6 @@ #include "protocol.h" -static const uint32_t dlm_devopts[] = { - SR_CONF_LOGIC_ANALYZER, - SR_CONF_OSCILLOSCOPE, - SR_CONF_LIMIT_FRAMES | SR_CONF_SET, - SR_CONF_SAMPLERATE | SR_CONF_GET, - SR_CONF_TRIGGER_SLOPE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, - SR_CONF_TRIGGER_SOURCE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, - SR_CONF_TIMEBASE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, - SR_CONF_NUM_HDIV | SR_CONF_GET, - SR_CONF_HORIZ_TRIGGERPOS | SR_CONF_GET | SR_CONF_SET, -}; - -static const uint32_t dlm_analog_devopts[] = { - SR_CONF_VDIV | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, - SR_CONF_COUPLING | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, - SR_CONF_NUM_VDIV | SR_CONF_GET, -}; - static const char *dlm_coupling_options[] = { "AC", "DC", @@ -51,13 +33,6 @@ static const char *dlm_coupling_options[] = { NULL, }; -/* Note: Values must correlate to the trigger_slopes values */ -static const char *dlm_trigger_slopes[] = { - "r", - "f", - NULL, -}; - static const char *dlm_2ch_trigger_sources[] = { "1", "2", @@ -85,7 +60,14 @@ static const char *dlm_4ch_trigger_sources[] = { NULL, }; -static const uint64_t dlm_timebases[][2] = { +/* Note: Values must correlate to the trigger_slopes values */ +const char *dlm_trigger_slopes[3] = { + "r", + "f", + NULL, +}; + +const uint64_t dlm_timebases[36][2] = { /* nanoseconds */ { 1, 1000000000 }, { 2, 1000000000 }, @@ -128,7 +110,7 @@ static const uint64_t dlm_timebases[][2] = { { 500, 1 }, }; -static const uint64_t dlm_vdivs[][2] = { +const uint64_t dlm_vdivs[17][2] = { /* millivolts */ { 2, 1000 }, { 5, 1000 }, @@ -214,21 +196,8 @@ static const struct scope_config scope_models[] = { .analog_names = &scope_analog_channel_names, .digital_names = &scope_digital_channel_names_8, - .devopts = &dlm_devopts, - .num_devopts = ARRAY_SIZE(dlm_devopts), - - .analog_devopts = &dlm_analog_devopts, - .num_analog_devopts = ARRAY_SIZE(dlm_analog_devopts), - .coupling_options = &dlm_coupling_options, .trigger_sources = &dlm_2ch_trigger_sources, - .trigger_slopes = &dlm_trigger_slopes, - - .timebases = &dlm_timebases, - .num_timebases = ARRAY_SIZE(dlm_timebases), - - .vdivs = &dlm_vdivs, - .num_vdivs = ARRAY_SIZE(dlm_vdivs), .num_xdivs = 10, .num_ydivs = 8, @@ -243,21 +212,8 @@ static const struct scope_config scope_models[] = { .analog_names = &scope_analog_channel_names, .digital_names = &scope_digital_channel_names_8, - .devopts = &dlm_devopts, - .num_devopts = ARRAY_SIZE(dlm_devopts), - - .analog_devopts = &dlm_analog_devopts, - .num_analog_devopts = ARRAY_SIZE(dlm_analog_devopts), - .coupling_options = &dlm_coupling_options, .trigger_sources = &dlm_4ch_trigger_sources, - .trigger_slopes = &dlm_trigger_slopes, - - .timebases = &dlm_timebases, - .num_timebases = ARRAY_SIZE(dlm_timebases), - - .vdivs = &dlm_vdivs, - .num_vdivs = ARRAY_SIZE(dlm_vdivs), .num_xdivs = 10, .num_ydivs = 8, @@ -274,21 +230,8 @@ static const struct scope_config scope_models[] = { .analog_names = &scope_analog_channel_names, .digital_names = NULL, - .devopts = &dlm_devopts, - .num_devopts = ARRAY_SIZE(dlm_devopts), - - .analog_devopts = &dlm_analog_devopts, - .num_analog_devopts = ARRAY_SIZE(dlm_analog_devopts), - .coupling_options = &dlm_coupling_options, .trigger_sources = &dlm_4ch_trigger_sources, - .trigger_slopes = &dlm_trigger_slopes, - - .timebases = &dlm_timebases, - .num_timebases = ARRAY_SIZE(dlm_timebases), - - .vdivs = &dlm_vdivs, - .num_vdivs = ARRAY_SIZE(dlm_vdivs), .num_xdivs = 10, .num_ydivs = 8, @@ -303,21 +246,8 @@ static const struct scope_config scope_models[] = { .analog_names = &scope_analog_channel_names, .digital_names = &scope_digital_channel_names_32, - .devopts = &dlm_devopts, - .num_devopts = ARRAY_SIZE(dlm_devopts), - - .analog_devopts = &dlm_analog_devopts, - .num_analog_devopts = ARRAY_SIZE(dlm_analog_devopts), - .coupling_options = &dlm_coupling_options, .trigger_sources = &dlm_4ch_trigger_sources, - .trigger_slopes = &dlm_trigger_slopes, - - .timebases = &dlm_timebases, - .num_timebases = ARRAY_SIZE(dlm_timebases), - - .vdivs = &dlm_vdivs, - .num_vdivs = ARRAY_SIZE(dlm_vdivs), .num_xdivs = 10, .num_ydivs = 8, @@ -332,21 +262,8 @@ static const struct scope_config scope_models[] = { .analog_names = &scope_analog_channel_names, .digital_names = &scope_digital_channel_names_32, - .devopts = &dlm_devopts, - .num_devopts = ARRAY_SIZE(dlm_devopts), - - .analog_devopts = &dlm_analog_devopts, - .num_analog_devopts = ARRAY_SIZE(dlm_analog_devopts), - .coupling_options = &dlm_coupling_options, .trigger_sources = &dlm_4ch_trigger_sources, - .trigger_slopes = &dlm_trigger_slopes, - - .timebases = &dlm_timebases, - .num_timebases = ARRAY_SIZE(dlm_timebases), - - .vdivs = &dlm_vdivs, - .num_vdivs = ARRAY_SIZE(dlm_vdivs), .num_xdivs = 10, .num_ydivs = 8, @@ -366,8 +283,8 @@ static void scope_state_dump(const struct scope_config *config, char *tmp; for (i = 0; i < config->analog_channels; ++i) { - tmp = sr_voltage_string((*config->vdivs)[state->analog_states[i].vdiv][0], - (*config->vdivs)[state->analog_states[i].vdiv][1]); + tmp = sr_voltage_string(dlm_vdivs[state->analog_states[i].vdiv][0], + dlm_vdivs[state->analog_states[i].vdiv][1]); sr_info("State of analog channel %d -> %s : %s (coupling) %s (vdiv) %2.2e (offset)", i + 1, state->analog_states[i].state ? "On" : "Off", (*config->coupling_options)[state->analog_states[i].coupling], @@ -384,8 +301,8 @@ static void scope_state_dump(const struct scope_config *config, state->pod_states[i] ? "On" : "Off"); } - tmp = sr_period_string((*config->timebases)[state->timebase][0] * - (*config->timebases)[state->timebase][1]); + tmp = sr_period_string(dlm_timebases[state->timebase][0] * + dlm_timebases[state->timebase][1]); sr_info("Current timebase: %s", tmp); g_free(tmp); @@ -398,7 +315,7 @@ static void scope_state_dump(const struct scope_config *config, sr_info("Current trigger: %s (source), %s (slope) %.2f (offset)", (*config->trigger_sources)[state->trigger_source], - (*config->trigger_slopes)[state->trigger_slope], + dlm_trigger_slopes[state->trigger_slope], state->horiz_triggerpos); } @@ -515,7 +432,7 @@ static int analog_channel_state_get(struct sr_scpi_dev_inst *scpi, if (dlm_analog_chan_vdiv_get(scpi, i + 1, &response) != SR_OK) return SR_ERR; - if (array_float_get(response, *config->vdivs, config->num_vdivs, + if (array_float_get(response, dlm_vdivs, ARRAY_SIZE(dlm_vdivs), &j) != SR_OK) { g_free(response); return SR_ERR; @@ -656,8 +573,8 @@ SR_PRIV int dlm_scope_state_query(struct sr_dev_inst *sdi) if (dlm_timebase_get(sdi->conn, &response) != SR_OK) return SR_ERR; - if (array_float_get(response, *config->timebases, - config->num_timebases, &i) != SR_OK) { + if (array_float_get(response, dlm_timebases, + ARRAY_SIZE(dlm_timebases), &i) != SR_OK) { g_free(response); return SR_ERR; } @@ -670,8 +587,8 @@ SR_PRIV int dlm_scope_state_query(struct sr_dev_inst *sdi) /* TODO: Check if the calculation makes sense for the DLM. */ state->horiz_triggerpos = tmp_float / - (((double)(*config->timebases)[state->timebase][0] / - (*config->timebases)[state->timebase][1]) * config->num_xdivs); + (((double)dlm_timebases[state->timebase][0] / + dlm_timebases[state->timebase][1]) * config->num_xdivs); state->horiz_triggerpos -= 0.5; state->horiz_triggerpos *= -1; diff --git a/src/hardware/yokogawa-dlm/protocol.h b/src/hardware/yokogawa-dlm/protocol.h index 18b946b3..3ae92433 100644 --- a/src/hardware/yokogawa-dlm/protocol.h +++ b/src/hardware/yokogawa-dlm/protocol.h @@ -48,6 +48,10 @@ enum trigger_slopes { SLOPE_NEGATIVE }; +extern const char *dlm_trigger_slopes[3]; +extern const uint64_t dlm_timebases[36][2]; +extern const uint64_t dlm_vdivs[17][2]; + struct scope_config { const char *model_id[MAX_INSTRUMENT_VERSIONS]; const char *model_name[MAX_INSTRUMENT_VERSIONS]; @@ -58,26 +62,12 @@ struct scope_config { const char *(*analog_names)[]; const char *(*digital_names)[]; - const uint32_t (*devopts)[]; - const uint8_t num_devopts; - - const uint32_t (*analog_devopts)[]; - const uint8_t num_analog_devopts; - const char *(*coupling_options)[]; const uint8_t num_coupling_options; const char *(*trigger_sources)[]; const uint8_t num_trigger_sources; - const char *(*trigger_slopes)[]; - - const uint64_t (*timebases)[][2]; - const uint8_t num_timebases; - - const uint64_t (*vdivs)[][2]; - const uint8_t num_vdivs; - const uint8_t num_xdivs; const uint8_t num_ydivs; };