]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/hameg-hmo/api.c
hameg-hmo: Allow retrieving frame limit
[libsigrok.git] / src / hardware / hameg-hmo / api.c
index 27fbc6a65df2037a5f8b006e9ad5c48b8235f777..1c58f74b70778f7b4bbaad6b78cfbba0d92f2ba2 100644 (file)
@@ -204,6 +204,12 @@ static int config_get(uint32_t key, GVariant **data,
        case SR_CONF_TRIGGER_PATTERN:
                *data = g_variant_new_string(state->trigger_pattern);
                break;
+       case SR_CONF_HIGH_RESOLUTION:
+               *data = g_variant_new_boolean(state->high_resolution);
+               break;
+       case SR_CONF_PEAK_DETECTION:
+               *data = g_variant_new_boolean(state->peak_detection);
+               break;
        case SR_CONF_HORIZ_TRIGGERPOS:
                *data = g_variant_new_double(state->horiz_triggerpos);
                break;
@@ -253,6 +259,9 @@ static int config_get(uint32_t key, GVariant **data,
                }
                *data = g_variant_new_double(state->digital_pods[idx].user_threshold);
                break;
+       case SR_CONF_LIMIT_FRAMES:
+               *data = g_variant_new_uint64(devc->frame_limit);
+               break;
        default:
                return SR_ERR_NA;
        }
@@ -270,7 +279,7 @@ static int config_set(uint32_t key, GVariant *data,
        const struct scope_config *model;
        struct scope_state *state;
        double tmp_d, tmp_d2;
-       gboolean update_sample_rate;
+       gboolean update_sample_rate, tmp_bool;
 
        if (!sdi)
                return SR_ERR_ARG;
@@ -293,18 +302,6 @@ static int config_set(uint32_t key, GVariant *data,
                devc->frame_limit = g_variant_get_uint64(data);
                ret = SR_OK;
                break;
-       case SR_CONF_TRIGGER_SOURCE:
-               if ((idx = std_str_idx(data, *model->trigger_sources, model->num_trigger_sources)) < 0)
-                       return SR_ERR_ARG;
-               g_snprintf(command, sizeof(command),
-                          (*model->scpi_dialect)[SCPI_CMD_SET_TRIGGER_SOURCE],
-                          (*model->trigger_sources)[idx]);
-               if (sr_scpi_send(sdi->conn, command) != SR_OK ||
-                   sr_scpi_get_opc(sdi->conn) != SR_OK)
-                       return SR_ERR;
-               state->trigger_source = idx;
-               ret = SR_OK;
-               break;
        case SR_CONF_VDIV:
                if (!cg)
                        return SR_ERR_CHANNEL_GROUP;
@@ -315,7 +312,7 @@ static int config_set(uint32_t key, GVariant *data,
                g_ascii_formatd(float_str, sizeof(float_str), "%E",
                        (float) (*model->vdivs)[idx][0] / (*model->vdivs)[idx][1]);
                g_snprintf(command, sizeof(command),
-                          (*model->scpi_dialect)[SCPI_CMD_SET_VERTICAL_DIV],
+                          (*model->scpi_dialect)[SCPI_CMD_SET_VERTICAL_SCALE],
                           j + 1, float_str);
                if (sr_scpi_send(sdi->conn, command) != SR_OK ||
                    sr_scpi_get_opc(sdi->conn) != SR_OK)
@@ -356,6 +353,18 @@ static int config_set(uint32_t key, GVariant *data,
                state->horiz_triggerpos = tmp_d;
                ret = SR_OK;
                break;
+       case SR_CONF_TRIGGER_SOURCE:
+               if ((idx = std_str_idx(data, *model->trigger_sources, model->num_trigger_sources)) < 0)
+                       return SR_ERR_ARG;
+               g_snprintf(command, sizeof(command),
+                          (*model->scpi_dialect)[SCPI_CMD_SET_TRIGGER_SOURCE],
+                          (*model->trigger_sources)[idx]);
+               if (sr_scpi_send(sdi->conn, command) != SR_OK ||
+                   sr_scpi_get_opc(sdi->conn) != SR_OK)
+                       return SR_ERR;
+               state->trigger_source = idx;
+               ret = SR_OK;
+               break;
        case SR_CONF_TRIGGER_SLOPE:
                if ((idx = std_str_idx(data, *model->trigger_slopes, model->num_trigger_slopes)) < 0)
                        return SR_ERR_ARG;
@@ -379,8 +388,51 @@ static int config_set(uint32_t key, GVariant *data,
                if (sr_scpi_send(sdi->conn, command) != SR_OK ||
                    sr_scpi_get_opc(sdi->conn) != SR_OK)
                        return SR_ERR;
-               g_free(state->trigger_pattern);
-               state->trigger_pattern = g_strdup(tmp_str);
+               strncpy(state->trigger_pattern,
+                       tmp_str,
+                       MAX_ANALOG_CHANNEL_COUNT + MAX_DIGITAL_CHANNEL_COUNT);
+               ret = SR_OK;
+               break;
+       case SR_CONF_HIGH_RESOLUTION:
+               tmp_bool = g_variant_get_boolean(data);
+               g_snprintf(command, sizeof(command),
+                          (*model->scpi_dialect)[SCPI_CMD_SET_HIGH_RESOLUTION],
+                          tmp_bool ? "AUTO" : "OFF");
+               if (sr_scpi_send(sdi->conn, command) != SR_OK ||
+                   sr_scpi_get_opc(sdi->conn) != SR_OK)
+                       return SR_ERR;
+               /* High Resolution mode automatically switches off Peak Detection. */
+               if (tmp_bool) {
+                       g_snprintf(command, sizeof(command),
+                                  (*model->scpi_dialect)[SCPI_CMD_SET_PEAK_DETECTION],
+                                  "OFF");
+                       if (sr_scpi_send(sdi->conn, command) != SR_OK ||
+                                        sr_scpi_get_opc(sdi->conn) != SR_OK)
+                               return SR_ERR;
+                       state->peak_detection = FALSE;
+               }
+               state->high_resolution = tmp_bool;
+               ret = SR_OK;
+               break;
+       case SR_CONF_PEAK_DETECTION:
+               tmp_bool = g_variant_get_boolean(data);
+               g_snprintf(command, sizeof(command),
+                          (*model->scpi_dialect)[SCPI_CMD_SET_PEAK_DETECTION],
+                          tmp_bool ? "AUTO" : "OFF");
+               if (sr_scpi_send(sdi->conn, command) != SR_OK ||
+                   sr_scpi_get_opc(sdi->conn) != SR_OK)
+                       return SR_ERR;
+               /* Peak Detection automatically switches off High Resolution mode. */
+               if (tmp_bool) {
+                       g_snprintf(command, sizeof(command),
+                                  (*model->scpi_dialect)[SCPI_CMD_SET_HIGH_RESOLUTION],
+                                  "OFF");
+                       if (sr_scpi_send(sdi->conn, command) != SR_OK ||
+                                        sr_scpi_get_opc(sdi->conn) != SR_OK)
+                               return SR_ERR;
+                       state->high_resolution = FALSE;
+               }
+               state->peak_detection = tmp_bool;
                ret = SR_OK;
                break;
        case SR_CONF_COUPLING:
@@ -414,7 +466,7 @@ static int config_set(uint32_t key, GVariant *data,
                if (model->logic_threshold_for_pod)
                        i = j + 1;
                else
-                       i = j * 8;
+                       i = j * DIGITAL_CHANNELS_PER_POD;
                g_snprintf(command, sizeof(command),
                           (*model->scpi_dialect)[SCPI_CMD_SET_DIG_POD_THRESHOLD],
                           i, (*model->logic_threshold)[idx]);
@@ -441,7 +493,7 @@ static int config_set(uint32_t key, GVariant *data,
                if (model->logic_threshold_for_pod)
                        idx = j + 1;
                else
-                       idx = j * 8;
+                       idx = j * DIGITAL_CHANNELS_PER_POD;
                /* Try to support different dialects exhaustively. */
                for (i = 0; i < model->num_logic_threshold; i++) {
                        if (!strcmp("USER2", (*model->logic_threshold)[i])) {
@@ -594,7 +646,7 @@ SR_PRIV int hmo_request_data(const struct sr_dev_inst *sdi)
        case SR_CHANNEL_LOGIC:
                g_snprintf(command, sizeof(command),
                           (*model->scpi_dialect)[SCPI_CMD_GET_DIG_DATA],
-                          ch->index < 8 ? 1 : 2);
+                          ch->index / DIGITAL_CHANNELS_PER_POD + 1);
                break;
        default:
                sr_err("Invalid channel type.");
@@ -631,7 +683,7 @@ static int hmo_check_channels(GSList *channels)
                                enabled_chan[idx] = TRUE;
                        break;
                case SR_CHANNEL_LOGIC:
-                       idx = ch->index / 8;
+                       idx = ch->index / DIGITAL_CHANNELS_PER_POD;
                        if (idx < ARRAY_SIZE(enabled_pod))
                                enabled_pod[idx] = TRUE;
                        break;
@@ -696,10 +748,10 @@ static int hmo_setup_channels(const struct sr_dev_inst *sdi)
                case SR_CHANNEL_LOGIC:
                        /*
                         * A digital POD needs to be enabled for every group of
-                        * 8 channels.
+                        * DIGITAL_CHANNELS_PER_POD channels.
                         */
                        if (ch->enabled)
-                               pod_enabled[ch->index < 8 ? 0 : 1] = TRUE;
+                               pod_enabled[ch->index / DIGITAL_CHANNELS_PER_POD] = TRUE;
 
                        if (ch->enabled == state->digital_channels[ch->index])
                                break;
@@ -777,7 +829,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
                if (!ch->enabled)
                        continue;
                /* Only add a single digital channel per group (pod). */
-               group = ch->index / 8;
+               group = ch->index / DIGITAL_CHANNELS_PER_POD;
                if (ch->type != SR_CHANNEL_LOGIC || !digital_added[group]) {
                        devc->enabled_channels = g_slist_append(
                                        devc->enabled_channels, ch);