]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/hantek-dso/api.c
hantek-dso: dso2250: Fix capture runaway, only do the requested number of frames.
[libsigrok.git] / src / hardware / hantek-dso / api.c
index d86eff611c64caf1974a5db682f9a9e533ad4b38..d173155282feeeeffc8e7e39de1a13689ef1de0a 100644 (file)
@@ -64,6 +64,7 @@ static const uint32_t devopts[] = {
        SR_CONF_BUFFERSIZE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
        SR_CONF_SAMPLERATE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
        SR_CONF_NUM_VDIV | SR_CONF_GET,
+       SR_CONF_TRIGGER_LEVEL | SR_CONF_GET | SR_CONF_SET,
 };
 
 static const uint32_t devopts_cg[] = {
@@ -441,6 +442,9 @@ static int config_get(uint32_t key, GVariant **data,
        devc = sdi->priv;
        if (!cg) {
                switch (key) {
+               case SR_CONF_TRIGGER_LEVEL:
+                       *data = g_variant_new_double(devc->voffset_trigger);
+                       break;
                case SR_CONF_CONN:
                        if (!sdi->conn)
                                return SR_ERR_ARG;
@@ -504,6 +508,7 @@ static int config_set(uint32_t key, GVariant *data,
        struct dev_context *devc;
        int rat;
        int ch_idx, idx;
+       float flt;
 
        devc = sdi->priv;
        if (!cg) {
@@ -511,6 +516,18 @@ static int config_set(uint32_t key, GVariant *data,
                case SR_CONF_LIMIT_FRAMES:
                        devc->limit_frames = g_variant_get_uint64(data);
                        break;
+               case SR_CONF_TRIGGER_LEVEL:
+                       flt = g_variant_get_double(data);
+                       if (flt < 0.0 || flt > 1.0) {
+                               sr_err("Trigger level must be in [0.0,1.0].");
+                               return SR_ERR_ARG;
+                       }
+
+                       devc->voffset_trigger = flt;
+                       if (dso_set_voffsets(sdi) != SR_OK) {
+                                       return SR_ERR;
+                       }
+                       break;
                case SR_CONF_TRIGGER_SLOPE:
                        if ((idx = std_str_idx(data, ARRAY_AND_SIZE(trigger_slopes))) < 0)
                                return SR_ERR_ARG;
@@ -768,12 +785,14 @@ static void LIBUSB_CALL receive_transfer(struct libusb_transfer *transfer)
                sr_dbg("End of frame, sending %d pre-trigger buffered samples.",
                        devc->samp_buffered);
                send_chunk(sdi, devc->framebuf, devc->samp_buffered);
+               g_free(devc->framebuf);
+               devc->framebuf = NULL;
 
                /* Mark the end of this frame. */
                packet.type = SR_DF_FRAME_END;
                sr_session_send(sdi, &packet);
 
-               if (devc->limit_frames && ++devc->num_frames == devc->limit_frames) {
+               if (devc->limit_frames && ++devc->num_frames >= devc->limit_frames) {
                        /* Terminate session */
                        devc->dev_state = STOPPING;
                } else {
@@ -928,6 +947,7 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi)
 
        devc = sdi->priv;
        devc->dev_state = STOPPING;
+       devc->num_frames = 0;
 
        return SR_OK;
 }