fx2lafw: Use new library software trigger.
This commit is contained in:
parent
ac136b574a
commit
335122f07d
|
@ -96,6 +96,9 @@ static const char *channel_names[] = {
|
||||||
static const int32_t soft_trigger_matches[] = {
|
static const int32_t soft_trigger_matches[] = {
|
||||||
SR_TRIGGER_ZERO,
|
SR_TRIGGER_ZERO,
|
||||||
SR_TRIGGER_ONE,
|
SR_TRIGGER_ONE,
|
||||||
|
SR_TRIGGER_RISING,
|
||||||
|
SR_TRIGGER_FALLING,
|
||||||
|
SR_TRIGGER_EDGE,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const uint64_t samplerates[] = {
|
static const uint64_t samplerates[] = {
|
||||||
|
@ -513,6 +516,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data)
|
||||||
struct dev_context *devc;
|
struct dev_context *devc;
|
||||||
struct drv_context *drvc;
|
struct drv_context *drvc;
|
||||||
struct sr_usb_dev_inst *usb;
|
struct sr_usb_dev_inst *usb;
|
||||||
|
struct sr_trigger *trigger;
|
||||||
struct libusb_transfer *transfer;
|
struct libusb_transfer *transfer;
|
||||||
unsigned int i, timeout, num_transfers;
|
unsigned int i, timeout, num_transfers;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -531,10 +535,9 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data)
|
||||||
devc->acq_aborted = FALSE;
|
devc->acq_aborted = FALSE;
|
||||||
devc->empty_transfer_count = 0;
|
devc->empty_transfer_count = 0;
|
||||||
|
|
||||||
if (sr_session_trigger_get()) {
|
if ((trigger = sr_session_trigger_get())) {
|
||||||
|
devc->stl = soft_trigger_logic_new(sdi, trigger);
|
||||||
devc->trigger_fired = FALSE;
|
devc->trigger_fired = FALSE;
|
||||||
devc->cur_trigger_stage = 0;
|
|
||||||
devc->cur_trigger_step = 0;
|
|
||||||
} else
|
} else
|
||||||
devc->trigger_fired = TRUE;
|
devc->trigger_fired = TRUE;
|
||||||
|
|
||||||
|
|
|
@ -311,6 +311,7 @@ SR_PRIV struct dev_context *fx2lafw_dev_new(void)
|
||||||
devc->cur_samplerate = 0;
|
devc->cur_samplerate = 0;
|
||||||
devc->limit_samples = 0;
|
devc->limit_samples = 0;
|
||||||
devc->sample_wide = FALSE;
|
devc->sample_wide = FALSE;
|
||||||
|
devc->stl = NULL;
|
||||||
|
|
||||||
return devc;
|
return devc;
|
||||||
}
|
}
|
||||||
|
@ -340,6 +341,11 @@ static void finish_acquisition(struct dev_context *devc)
|
||||||
|
|
||||||
devc->num_transfers = 0;
|
devc->num_transfers = 0;
|
||||||
g_free(devc->transfers);
|
g_free(devc->transfers);
|
||||||
|
|
||||||
|
if (devc->stl) {
|
||||||
|
soft_trigger_logic_free(devc->stl);
|
||||||
|
devc->stl = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void free_transfer(struct libusb_transfer *transfer)
|
static void free_transfer(struct libusb_transfer *transfer)
|
||||||
|
@ -379,95 +385,6 @@ static void resubmit_transfer(struct libusb_transfer *transfer)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean check_match(uint16_t sample, struct sr_trigger_match *match)
|
|
||||||
{
|
|
||||||
gboolean bit, result;
|
|
||||||
|
|
||||||
result = FALSE;
|
|
||||||
bit = sample & (1 << match->channel->index);
|
|
||||||
if (match->match == SR_TRIGGER_ZERO && !bit)
|
|
||||||
result = TRUE;
|
|
||||||
else if (match->match == SR_TRIGGER_ONE && bit)
|
|
||||||
result = TRUE;
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Returns the offset (in samples) within buf of where the trigger
|
|
||||||
* occurred, or -1 if not triggered. */
|
|
||||||
static int soft_trigger(struct sr_dev_inst *sdi, uint8_t *buf,
|
|
||||||
int len)
|
|
||||||
{
|
|
||||||
struct dev_context *devc;
|
|
||||||
struct sr_datafeed_packet packet;
|
|
||||||
struct sr_trigger *trigger;
|
|
||||||
struct sr_trigger_stage *stage;
|
|
||||||
struct sr_trigger_match *match;
|
|
||||||
GSList *l, *lst;;
|
|
||||||
int offset;
|
|
||||||
uint16_t sample;
|
|
||||||
int unitsize, i;
|
|
||||||
gboolean match_found;
|
|
||||||
|
|
||||||
devc = sdi->priv;
|
|
||||||
offset = -1;
|
|
||||||
trigger = sr_session_trigger_get();
|
|
||||||
unitsize = devc->sample_wide ? 2 : 1;
|
|
||||||
for (i = 0; i < len; i += unitsize) {
|
|
||||||
memcpy(&sample, buf + i, unitsize);
|
|
||||||
|
|
||||||
lst = g_slist_nth(trigger->stages, devc->cur_trigger_stage);
|
|
||||||
stage = lst->data;
|
|
||||||
if (!stage->matches)
|
|
||||||
/* No matches supplied, client error. */
|
|
||||||
return SR_ERR_ARG;
|
|
||||||
|
|
||||||
match_found = TRUE;
|
|
||||||
for (l = stage->matches; l; l = l->next) {
|
|
||||||
match = l->data;
|
|
||||||
if (!match->channel->enabled)
|
|
||||||
/* Ignore disabled channels with a trigger. */
|
|
||||||
continue;
|
|
||||||
if (!check_match(sample, match)) {
|
|
||||||
match_found = FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (match_found) {
|
|
||||||
/* Matched on the current stage. */
|
|
||||||
if (lst->next) {
|
|
||||||
/* Advance to next stage. */
|
|
||||||
devc->cur_trigger_stage++;
|
|
||||||
} else {
|
|
||||||
/* Matched on last stage, fire trigger. */
|
|
||||||
offset = i / unitsize;
|
|
||||||
|
|
||||||
packet.type = SR_DF_TRIGGER;
|
|
||||||
packet.payload = NULL;
|
|
||||||
sr_session_send(devc->cb_data, &packet);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (devc->cur_trigger_stage > 0) {
|
|
||||||
/*
|
|
||||||
* We had a match at an earlier stage, but failed on the
|
|
||||||
* current stage. However, we may have a match on this
|
|
||||||
* stage in the next bit -- trigger on 0001 will fail on
|
|
||||||
* seeing 00001, so we need to go back to stage 0 -- but
|
|
||||||
* at the next sample from the one that matched originally,
|
|
||||||
* which the counter increment at the end of the loop
|
|
||||||
* takes care of.
|
|
||||||
*/
|
|
||||||
i -= devc->cur_trigger_stage * unitsize;
|
|
||||||
if (i < -1)
|
|
||||||
i = -1; /* Oops, went back past this buffer. */
|
|
||||||
/* Reset trigger stage. */
|
|
||||||
devc->cur_trigger_stage = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
SR_PRIV void fx2lafw_receive_transfer(struct libusb_transfer *transfer)
|
SR_PRIV void fx2lafw_receive_transfer(struct libusb_transfer *transfer)
|
||||||
{
|
{
|
||||||
struct sr_dev_inst *sdi;
|
struct sr_dev_inst *sdi;
|
||||||
|
@ -543,7 +460,8 @@ SR_PRIV void fx2lafw_receive_transfer(struct libusb_transfer *transfer)
|
||||||
devc->sent_samples += cur_sample_count;
|
devc->sent_samples += cur_sample_count;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
trigger_offset = soft_trigger(sdi, transfer->buffer, transfer->actual_length);
|
trigger_offset = soft_trigger_logic_check(devc->stl,
|
||||||
|
transfer->buffer, transfer->actual_length);
|
||||||
if (trigger_offset > -1) {
|
if (trigger_offset > -1) {
|
||||||
packet.type = SR_DF_LOGIC;
|
packet.type = SR_DF_LOGIC;
|
||||||
packet.payload = &logic;
|
packet.payload = &logic;
|
||||||
|
|
|
@ -85,8 +85,7 @@ struct dev_context {
|
||||||
gboolean trigger_fired;
|
gboolean trigger_fired;
|
||||||
gboolean acq_aborted;
|
gboolean acq_aborted;
|
||||||
gboolean sample_wide;
|
gboolean sample_wide;
|
||||||
unsigned int cur_trigger_stage;
|
struct soft_trigger_logic *stl;
|
||||||
int cur_trigger_step;
|
|
||||||
|
|
||||||
unsigned int sent_samples;
|
unsigned int sent_samples;
|
||||||
int submitted_transfers;
|
int submitted_transfers;
|
||||||
|
|
Loading…
Reference in New Issue