devc->limit_samples = 0;
devc->capture_ratio = 0;
devc->sample_wide = FALSE;
- devc->trigger_en = FALSE;
+ devc->dslogic_continuous_mode = FALSE;
+ devc->dslogic_clock_edge = DS_EDGE_RISING;
devc->stl = NULL;
return devc;
devc = sdi->priv;
- std_session_send_df_end(sdi, LOG_PREFIX);
+ std_session_send_df_end(sdi);
usb_source_remove(sdi->session, devc->ctx);
{
size_t i;
struct dev_context *devc;
+ struct sr_datafeed_analog analog;
+ struct sr_analog_encoding encoding;
+ struct sr_analog_meaning meaning;
+ struct sr_analog_spec spec;
(void)sample_width;
/* Send the logic */
for (i = 0; i < length; i++) {
- devc->logic_buffer[i] = data[i * 2];
+ devc->logic_buffer[i] = data[i * 2];
/* Rescale to -10V - +10V from 0-255. */
- devc->analog_buffer[i] = data[i * 2 + 1] - 128.0f / 12.8f;
+ devc->analog_buffer[i] = (data[i * 2 + 1] - 128.0f) / 12.8f;
};
const struct sr_datafeed_logic logic = {
sr_session_send(sdi, &logic_packet);
- const struct sr_datafeed_analog_old analog = {
- .channels = devc->enabled_analog_channels,
- .num_samples = length,
- .mq = SR_MQ_VOLTAGE,
- .unit = SR_UNIT_VOLT,
- .mqflags = 0 /*SR_MQFLAG_DC*/,
- .data = devc->analog_buffer
- };
+ sr_analog_init(&analog, &encoding, &meaning, &spec, 2);
+ analog.meaning->channels = devc->enabled_analog_channels;
+ analog.meaning->mq = SR_MQ_VOLTAGE;
+ analog.meaning->unit = SR_UNIT_VOLT;
+ analog.meaning->mqflags = 0 /* SR_MQFLAG_DC */;
+ analog.num_samples = length;
+ analog.data = devc->analog_buffer;
const struct sr_datafeed_packet analog_packet = {
- .type = SR_DF_ANALOG_OLD,
+ .type = SR_DF_ANALOG,
.payload = &analog
};
struct sr_dev_inst *sdi;
struct dev_context *devc;
gboolean packet_has_error = FALSE;
+ struct sr_datafeed_packet packet;
unsigned int num_samples;
int trigger_offset, cur_sample_count, unitsize;
int pre_trigger_samples;
} else {
devc->empty_transfer_count = 0;
}
- if (devc->trigger_en)
- devc->trigger_fired = TRUE;
if (devc->trigger_fired) {
if (!devc->limit_samples || devc->sent_samples < devc->limit_samples) {
/* Send the incoming transfer to the session bus. */
else
num_samples = cur_sample_count;
- devc->send_data_proc(sdi, (uint8_t *)transfer->buffer,
- num_samples * unitsize, unitsize);
- devc->sent_samples += num_samples;
+ if (devc->dslogic && devc->trigger_pos > devc->sent_samples
+ && devc->trigger_pos <= devc->sent_samples + num_samples) {
+ /* DSLogic trigger in this block. Send trigger position. */
+ trigger_offset = devc->trigger_pos - devc->sent_samples;
+ /* Pre-trigger samples. */
+ devc->send_data_proc(sdi, (uint8_t *)transfer->buffer,
+ trigger_offset * unitsize, unitsize);
+ devc->sent_samples += trigger_offset;
+ /* Trigger position. */
+ devc->trigger_pos = 0;
+ packet.type = SR_DF_TRIGGER;
+ packet.payload = NULL;
+ sr_session_send(sdi, &packet);
+ /* Post trigger samples. */
+ num_samples -= trigger_offset;
+ devc->send_data_proc(sdi, (uint8_t *)transfer->buffer
+ + trigger_offset * unitsize, num_samples * unitsize, unitsize);
+ devc->sent_samples += num_samples;
+ } else {
+ devc->send_data_proc(sdi, (uint8_t *)transfer->buffer,
+ num_samples * unitsize, unitsize);
+ devc->sent_samples += num_samples;
+ }
}
} else {
trigger_offset = soft_trigger_logic_check(devc->stl,