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
[email protected]
https://lists.sourceforge.net/lists/listinfo/sigrok-devel