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