]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/demo/api.c
demo: Implement logic triggering.
[libsigrok.git] / src / hardware / demo / api.c
index 32ca88dd106d55da14ac7f5e03b58ddb90214e0c..190dc83637a48ff6fa7c0a68fec0699abb3e2616 100644 (file)
@@ -143,6 +143,8 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options)
        devc->logic_pattern = DEFAULT_LOGIC_PATTERN;
        devc->num_analog_channels = num_analog_channels;
        devc->limit_frames = limit_frames;
+       devc->capture_ratio = 20;
+       devc->stl = NULL;
 
        if (num_logic_channels > 0) {
                /* Logic channels, all in one channel group. */
@@ -434,6 +436,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
        uint8_t mask;
        GHashTableIter iter;
        void *value;
+       struct sr_trigger *trigger;
 
        devc = sdi->priv;
        devc->sent_samples = 0;
@@ -499,6 +502,18 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
        devc->spent_us = 0;
        devc->step = 0;
 
+       /* Store Triggers to stl and preset trigger_fired */
+       if ((trigger = sr_session_trigger_get(sdi->session))) {
+               int pre_trigger_samples = 0;
+               if (devc->limit_samples > 0)
+                       pre_trigger_samples = (devc->capture_ratio * devc->limit_samples) / 100;
+               devc->stl = soft_trigger_logic_new(sdi, trigger, pre_trigger_samples);
+               if (!devc->stl)
+                       return SR_ERR_MALLOC;
+               devc->trigger_fired = FALSE;
+       } else
+               devc->trigger_fired = TRUE;
+
        return SR_OK;
 }
 
@@ -514,6 +529,11 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi)
 
        std_session_send_df_end(sdi);
 
+       if (devc->stl) {
+               soft_trigger_logic_free(devc->stl);
+               devc->stl = NULL;
+       }
+
        return SR_OK;
 }