enable "force trigger" by default (old code was in comment)
allow to set other trigger modes

* auto = always record
* normal = wait for trigger, then record
* single = wait for trigger, then record only one sequence

i have only tested the "auto" mode
"normal" mode might work (not tested)
"single" mode needs implementation

i also renamed the property triggermode to trigger_mode
for consistency with trigger_source and trigger_slope etc

enum values appended at the end to keep ABI compatibility (?)

TODO samplerates should be initialized depending on the model

added debug outputs for CMD_2250_SET_TRIGGERSOURCE etc

send CMD_SET_FILTERS only for model DSO2090
TODO add more cases

--

i hope the patchfile is working, i  did some manual edits
diff --git a/include/libsigrok/libsigrok.h b/include/libsigrok/libsigrok.h
index 2779490..66b3013 100644
--- a/include/libsigrok/libsigrok.h
+++ b/include/libsigrok/libsigrok.h
@@ -1098,6 +1098,9 @@ enum sr_configkey {
        /** Self test mode. */
        SR_CONF_TEST_MODE,
 
+       /** Trigger mode (auto, normal, single). */
+       SR_CONF_TRIGGER_MODE,
+
        /* Update sr_key_info_config[] (hwdriver.c) upon changes! */
 };
 
diff --git a/src/hardware/hantek-dso/api.c b/src/hardware/hantek-dso/api.c
index a3cc8a2..541be56 100644
--- a/src/hardware/hantek-dso/api.c
+++ b/src/hardware/hantek-dso/api.c
@@ -65,6 +65,7 @@ static const uint32_t devopts[] = {
        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,
+       SR_CONF_TRIGGER_MODE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
 };
 
 static const uint32_t devopts_cg[] = {
@@ -147,7 +148,7 @@ static const uint64_t samplerates[] = {
        SR_MHZ(25),
        SR_MHZ(50),
        SR_MHZ(100),
-       SR_MHZ(125),
+       SR_MHZ(125), // TODO not supported by DSO2250?
        /* Fast mode not supported yet.
        SR_MHZ(200),
        SR_MHZ(250), */
@@ -170,6 +171,7 @@ static const uint64_t vdivs[][2] = {
 static const char *trigger_sources[] = {
        "CH1", "CH2", "EXT",
        /* TODO: forced */
+       // DONE with trigger_mode = "auto"
 };
 
 static const char *trigger_slopes[] = {
@@ -180,6 +182,10 @@ static const char *coupling[] = {
        "AC", "DC", "GND",
 };
 
+static const char *trigger_modes[] = {
+       "auto", "normal", "single",
+};
+
 static struct sr_dev_inst *dso_dev_new(const struct dso_profile *prof)
 {
        struct sr_dev_inst *sdi;
@@ -222,6 +228,7 @@ static struct sr_dev_inst *dso_dev_new(const struct 
dso_profile *prof)
        devc->framesize = DEFAULT_FRAMESIZE;
        devc->triggerslope = SLOPE_POSITIVE;
        devc->triggersource = g_strdup(DEFAULT_TRIGGER_SOURCE);
+       devc->trigger_mode = TRIGGER_MODE_AUTO;
        devc->capture_ratio = DEFAULT_CAPTURE_RATIO;
        sdi->priv = devc;
 
@@ -474,6 +481,10 @@ static int config_get(uint32_t key, GVariant **data,
                        s = (devc->triggerslope == SLOPE_POSITIVE) ? "r" : "f";
                        *data = g_variant_new_string(s);
                        break;
+               case SR_CONF_TRIGGER_MODE:
+                       s = trigger_modes[devc->trigger_mode];
+                       *data = g_variant_new_string(s);
+                       break;
                case SR_CONF_CAPTURE_RATIO:
                        *data = g_variant_new_uint64(devc->capture_ratio);
                        break;
@@ -535,6 +546,11 @@ static int config_set(uint32_t key, GVariant *data,
                                return SR_ERR_ARG;
                        devc->triggerslope = idx;
                        break;
+               case SR_CONF_TRIGGER_MODE:
+                       if ((idx = std_str_idx(data, 
ARRAY_AND_SIZE(trigger_modes))) < 0)
+                               return SR_ERR_ARG;
+                       devc->trigger_mode = idx;
+                       break;
                case SR_CONF_CAPTURE_RATIO:
                        devc->capture_ratio = g_variant_get_uint64(data);
                        break;
@@ -617,6 +633,9 @@ static int config_list(uint32_t key, GVariant **data,
                case SR_CONF_TRIGGER_SOURCE:
                        *data = 
g_variant_new_strv(ARRAY_AND_SIZE(trigger_sources));
                        break;
+               case SR_CONF_TRIGGER_MODE:
+                       *data = 
g_variant_new_strv(ARRAY_AND_SIZE(trigger_modes));
+                       break;
                case SR_CONF_TRIGGER_SLOPE:
                        *data = 
g_variant_new_strv(ARRAY_AND_SIZE(trigger_slopes));
                        break;
@@ -809,6 +828,8 @@ static int handle_event(int fd, int revents, void *cb_data)
        (void)fd;
        (void)revents;
 
+       int break_switch_2 = FALSE;
+
        sdi = cb_data;
        di = sdi->driver;
        drvc = di->context;
@@ -861,8 +882,25 @@ static int handle_event(int fd, int revents, void *cb_data)
                                break;
                        if (dso_enable_trigger(sdi) != SR_OK)
                                break;
-//                     if (dso_force_trigger(sdi) != SR_OK)
-//                             break;
+
+                       sr_dbg("Trigger mode %i (%s).", devc->trigger_mode, 
trigger_modes[devc->trigger_mode]);
+                       break_switch_2 = FALSE;
+                       switch (devc->trigger_mode) {
+                       case TRIGGER_MODE_AUTO:
+                               sr_dbg("Forcing trigger.");
+                               if (dso_force_trigger(sdi) != SR_OK)
+                                       break_switch_2 = TRUE;
+                               break;
+                       case TRIGGER_MODE_NORMAL:
+                               // TODO wait for trigger, then get all samples
+                               break;
+                       case TRIGGER_MODE_SINGLE:
+                               // TODO wait for trigger, then get only one 
sequence
+                               break;
+                       }
+                       if (break_switch_2)
+                               break;
+
                        sr_dbg("Successfully requested next chunk.");
                }
                break;
diff --git a/src/hardware/hantek-dso/protocol.c 
b/src/hardware/hantek-dso/protocol.c
index c74187a..865ce31 100644
--- a/src/hardware/hantek-dso/protocol.c
+++ b/src/hardware/hantek-dso/protocol.c
@@ -272,6 +359,7 @@ static int dso2250_set_trigger_samplerate(const struct 
sr_dev_inst *sdi)
        devc = sdi->priv;
        usb = sdi->conn;
 
+       sr_dbg("Preparing CMD_2250_SET_TRIGGERSOURCE.");
        memset(cmdstring, 0, sizeof(cmdstring));
        /* Command */
        cmdstring[0] = CMD_2250_SET_TRIGGERSOURCE;
@@ -294,13 +382,17 @@ static int dso2250_set_trigger_samplerate(const struct 
sr_dev_inst *sdi)
                       libusb_error_name(ret));
                return SR_ERR;
        }
+       sr_dbg("Sent CMD_2250_SET_TRIGGERSOURCE.");
 
+       sr_dbg("Preparing CMD_2250_SET_RECORD_LENGTH.");
        /* Frame size */
        sr_dbg("Frame size: %d.", devc->framesize);
        cmdstring[0] = CMD_2250_SET_RECORD_LENGTH;
@@ -312,10 +404,12 @@ static int dso2250_set_trigger_samplerate(const struct 
sr_dev_inst *sdi)
                       libusb_error_name(ret));
                return SR_ERR;
        }
+       sr_dbg("Sent CMD_2250_SET_RECORD_LENGTH.");
 
+       sr_dbg("Preparing CMD_2250_SET_SAMPLERATE.");
        memset(cmdstring, 0, sizeof(cmdstring));
        cmdstring[0] = CMD_2250_SET_SAMPLERATE;
        base = 100e6;
@@ -349,11 +443,12 @@ static int dso2250_set_trigger_samplerate(const struct 
sr_dev_inst *sdi)
        }
        sr_dbg("Sent CMD_2250_SET_SAMPLERATE.");
 
+       sr_dbg("Preparing CMD_2250_SET_CHANNELS.");
        /* Enabled channels: 00=CH1, 01=CH2, 10=both. */
        memset(cmdstring, 0, sizeof(cmdstring));
        cmdstring[0] = CMD_2250_SET_CHANNELS;
@@ -366,11 +461,12 @@ static int dso2250_set_trigger_samplerate(const struct 
sr_dev_inst *sdi)
        }
        sr_dbg("Sent CMD_2250_SET_CHANNELS.");
 
+       sr_dbg("Preparing CMD_2250_SET_TRIGGERPOS_AND_BUFFER.");
        /* Trigger slope: 0=positive, 1=negative. */
        memset(cmdstring, 0, sizeof(cmdstring));
        cmdstring[0] = CMD_2250_SET_TRIGGERPOS_AND_BUFFER;
@@ -389,9 +485,10 @@ static int dso2250_set_trigger_samplerate(const struct 
sr_dev_inst *sdi)
                       libusb_error_name(ret));
                return SR_ERR;
        }
+       sr_dbg("Sent CMD_2250_SET_TRIGGERPOS_AND_BUFFER.");
 
        return SR_OK;
 }
@@ -792,26 +929,45 @@ SR_PRIV int dso_force_trigger(const struct sr_dev_inst 
*sdi)
 
 SR_PRIV int dso_init(const struct sr_dev_inst *sdi)
 {
+       struct dev_context *devc;
+
        sr_dbg("Initializing DSO.");
 
+       devc = sdi->priv;
+
        if (get_channel_offsets(sdi) != SR_OK)
                return SR_ERR;
 
        if (dso_set_trigger_samplerate(sdi) != SR_OK)
                return SR_ERR;
 
-       if (dso_set_filters(sdi) != SR_OK)
-               return SR_ERR;
+       switch (devc->profile->fw_pid) {
+       case 0x2090:
+               //  0 CMD_SET_FILTERS
+               if (dso_set_filters(sdi) != SR_OK)
+                       return SR_ERR;
+               break;
+       }
 
        if (dso_set_voltage(sdi) != SR_OK)
                return SR_ERR;
@@ -877,10 +1036,12 @@ SR_PRIV int dso_capture_start(const struct sr_dev_inst 
*sdi)
                return SR_ERR;
        }
 
+       sr_dbg("Sent CMD_CAPTURE_START.");
+
        return SR_OK;
 }
 
--- a/src/hardware/hantek-dso/protocol.h
+++ b/src/hardware/hantek-dso/protocol.h
@@ -147,12 +147,39 @@ enum capturestates {
        CAPTURE_UNKNOWN = 255,
 };
 
-enum triggermodes {
-       TRIGGERMODE_AUTO,
-       TRIGGERMODE_NORMAL,
-       TRIGGERMODE_SINGLE,
+enum trigger_modes {
+       TRIGGER_MODE_AUTO,
+       TRIGGER_MODE_NORMAL,
+       TRIGGER_MODE_SINGLE,
 };
 
 enum states {
        IDLE,
        NEW_CAPTURE,
@@ -205,7 +232,7 @@ struct dev_context {
        int triggerslope;
        char *triggersource;
        uint64_t capture_ratio;
-       int triggermode;
+       int trigger_mode;
 
        /* Frame transfer */
        unsigned int samp_received;
diff --git a/src/hwdriver.c b/src/hwdriver.c
index 1016507..c267060 100644
--- a/src/hwdriver.c
+++ b/src/hwdriver.c
@@ -232,6 +232,9 @@ static struct sr_key_info sr_key_info_config[] = {
        {SR_CONF_TEST_MODE, SR_T_STRING, "test_mode",
                "Test mode", NULL},
 
+  {SR_CONF_TRIGGER_MODE, SR_T_STRING, "triggermode",
+    "Trigger mode", NULL},
+
        ALL_ZERO
 };
 
_______________________________________________
sigrok-devel mailing list
sigrok-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sigrok-devel

Reply via email to