]> sigrok.org Git - libsigrok.git/commitdiff
yokogawa-dlm: Config get/set/list handler updates
authorSoeren Apel <redacted>
Sun, 7 Jun 2015 09:40:39 +0000 (11:40 +0200)
committerUwe Hermann <redacted>
Mon, 22 Jun 2015 22:15:56 +0000 (00:15 +0200)
src/hardware/yokogawa-dlm/api.c
src/hardware/yokogawa-dlm/protocol.c
src/hardware/yokogawa-dlm/protocol.h

index 11dbfda1bb80a1b6feb378a6db2c3ca30c061fef..0ccf5834e157638aac443d69708a5230a8fceb46 100644 (file)
@@ -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;
index 11b8638e913ce940995fa4635ec8e568a2f97628..a60bc0d3208d3f103400e50ba335fe33d54fa6b3 100644 (file)
 
 #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;
 
index 18b946b3c0d2e058f3f509b270fbbcd7da738f2a..3ae9243329b6862867c09ed899f1c450a819693d 100644 (file)
@@ -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;
 };