]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/siglent-sds/api.c
siglent-sds: Fixed samplerate and memory depth calculation
[libsigrok.git] / src / hardware / siglent-sds / api.c
index f77dcc16bce9d640aaedbb528527e379384b68ed..790886bc59837f1954cf68bfdd1eb7a9af2ae3f4 100644 (file)
@@ -525,13 +525,13 @@ static int config_set(uint32_t key, GVariant *data,
        const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
 {
        struct dev_context *devc;
-       uint64_t p, q;
+       uint64_t p;
        double t_dbl;
-       unsigned int i;
+       int i;
        int ret, idx;
        const char *tmp_str;
        char buffer[16];
-       char *cmd;
+       char *cmd = NULL;
        char cmd4[4];
 
        devc = sdi->priv;
@@ -588,12 +588,13 @@ static int config_set(uint32_t key, GVariant *data,
                case 1000000:
                        cmd = g_strdup_printf("%" PRIu64 "US", p);
                        break;
-               case 100000000:
+               case 1000000000:
                        cmd = g_strdup_printf("%" PRIu64 "NS", p);
                        break;
                }
-               sr_dbg("Setting device timebase: TDIV %s.", cmd);
-               return siglent_sds_config_set(sdi, "TDIV %s", cmd);
+               ret = siglent_sds_config_set(sdi, "TDIV %s", cmd);
+               g_free(cmd);
+               return ret;
        case SR_CONF_TRIGGER_SOURCE:
                if ((idx = std_str_idx(data, ARRAY_AND_SIZE(trigger_sources))) < 0)
                        return SR_ERR_ARG;
@@ -636,7 +637,9 @@ static int config_set(uint32_t key, GVariant *data,
                        cmd = g_strdup_printf("%" PRIu64 "UV", p);
                        break;
                }
-               return siglent_sds_config_set(sdi, "C%d:VDIV %s", i + 1, cmd);
+               ret = siglent_sds_config_set(sdi, "C%d:VDIV %s", i + 1, cmd);
+               g_free(cmd);
+               return ret;
        case SR_CONF_COUPLING:
                if (!cg)
                        return SR_ERR_CHANNEL_GROUP;
@@ -678,6 +681,14 @@ static int config_set(uint32_t key, GVariant *data,
                siglent_sds_get_dev_cfg_horizontal(sdi);
                data = g_variant_new_uint64(devc->samplerate);
                break;
+       case SR_CONF_AVERAGING:
+               devc->average_enabled = g_variant_get_boolean(data);
+               sr_dbg("%s averaging", devc->average_enabled ? "Enabling" : "Disabling");
+               break;
+       case SR_CONF_AVG_SAMPLES:
+               devc->average_samples = g_variant_get_uint64(data);
+               sr_dbg("Setting averaging rate to %" PRIu64, devc->average_samples);
+               break;  
        default:
                return SR_ERR_NA;
        }
@@ -763,7 +774,7 @@ static int config_list(uint32_t key, GVariant **data,
                *data = g_variant_new_int32(devc->model->series->num_horizontal_divs);
                break;
        case SR_CONF_AVERAGING:
-               /* TODO: Implement averaging. */
+               *data = g_variant_new_boolean(devc->average_enabled);
                break;
        default:
                return SR_ERR_NA;
@@ -846,12 +857,18 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
        // devc->analog_frame_size = devc->model->series->buffer_samples;
        // devc->digital_frame_size = devc->model->series->buffer_samples;
 
+       siglent_sds_get_dev_cfg_horizontal(sdi);
        switch (devc->model->series->protocol) {
        case SPO_MODEL:
                if (siglent_sds_config_set(sdi, "WFSU SP,0,TYPE,1") != SR_OK)
                        return SR_ERR;
-               if (siglent_sds_config_set(sdi, "ACQW SAMPLING") != SR_OK)
-                       return SR_ERR;
+               if (devc->average_enabled) {
+                       if (siglent_sds_config_set(sdi, "ACQW AVERAGE,%i", devc->average_samples) != SR_OK)
+                               return SR_ERR;
+               } else {
+                       if (siglent_sds_config_set(sdi, "ACQW SAMPLING") != SR_OK)
+                               return SR_ERR;
+               }
                break;
        case NON_SPO_MODEL:
                /* TODO: Implement CML/CNL/DL models. */