Skip to content

Commit

Permalink
Use new trigger API.
Browse files Browse the repository at this point in the history
  • Loading branch information
biot committed May 27, 2014
1 parent 20d461e commit 6b27bde
Show file tree
Hide file tree
Showing 4 changed files with 142 additions and 21 deletions.
107 changes: 107 additions & 0 deletions parsers.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,113 @@ GSList *parse_channelstring(struct sr_dev_inst *sdi, const char *channelstring)
return channellist;
}

int parse_trigger_match(char c)
{
int match;

if (c == '0')
match = SR_TRIGGER_ZERO;
else if (c == '1')
match = SR_TRIGGER_ONE;
else if (c == 'r')
match = SR_TRIGGER_RISING;
else if (c == 'f')
match = SR_TRIGGER_FALLING;
else if (c == 'e')
match = SR_TRIGGER_EDGE;
else if (c == 'o')
match = SR_TRIGGER_OVER;
else if (c == 'u')
match = SR_TRIGGER_UNDER;
else
match = 0;

return match;
}

int parse_triggerstring(const struct sr_dev_inst *sdi, const char *s)
{
struct sr_channel *ch;
struct sr_trigger *trigger;
struct sr_trigger_stage *stage;
GVariant *gvar;
GSList *l;
gsize num_matches;
gboolean found_match, error;
const int32_t *matches;
int32_t match;
unsigned int j;
int t, i;
char **tokens, *sep;

if (sr_config_list(sdi->driver, sdi, NULL, SR_CONF_TRIGGER_MATCH,
&gvar) != SR_OK) {
g_critical("Device doesn't support any triggers.");
return FALSE;
}
matches = g_variant_get_fixed_array(gvar, &num_matches, sizeof(int32_t));

trigger = sr_trigger_new(NULL);
error = FALSE;
tokens = g_strsplit(s, ",", -1);
for (i = 0; tokens[i]; i++) {
if (!(sep = strchr(tokens[i], '='))) {
g_critical("Invalid trigger '%s'.", tokens[i]);
error = TRUE;
break;
}
*sep++ = 0;
ch = NULL;
for (l = sdi->channels; l; l = l->next) {
ch = l->data;
if (ch->enabled && !strcmp(ch->name, tokens[i]))
break;
ch = NULL;
}
if (!ch) {
g_critical("Invalid channel '%s'.", tokens[i]);
error = TRUE;
break;
}
for (t = 0; sep[t]; t++) {
if (!(match = parse_trigger_match(sep[t]))) {
g_critical("Invalid trigger match '%c'.", sep[t]);
error = TRUE;
break;
}
found_match = FALSE;
for (j = 0; j < num_matches; j++) {
if (matches[j] == match) {
found_match = TRUE;
break;
}
}
if (!found_match) {
g_critical("Trigger match '%c' not supported by device.", sep[t]);
error = TRUE;
break;
}
/* Make sure this ends up in the right stage, creating
* them as needed. */
while (!(stage = g_slist_nth_data(trigger->stages, t)))
sr_trigger_stage_new(trigger);
if (sr_trigger_match_add(stage, ch, match, 0) != SR_OK) {
error = TRUE;
break;
}
}
}
g_strfreev(tokens);
g_variant_unref(gvar);

if (error)
sr_trigger_free(trigger);
else
error = sr_session_trigger_set(trigger) != SR_OK;

return !error;
}

GHashTable *parse_generic_arg(const char *arg, gboolean sep_first)
{
GHashTable *hash;
Expand Down
12 changes: 1 addition & 11 deletions session.c
Original file line number Diff line number Diff line change
Expand Up @@ -457,8 +457,6 @@ void run_session(void)
GVariant *gvar;
struct sr_dev_inst *sdi;
uint64_t min_samples, max_samples;
int max_channels, i;
char **triggerlist;

devices = device_scan();
if (!devices) {
Expand Down Expand Up @@ -500,18 +498,10 @@ void run_session(void)
}

if (opt_triggers) {
if (!(triggerlist = sr_parse_triggerstring(sdi, opt_triggers))) {
if (!parse_triggerstring(sdi, opt_triggers)) {
sr_session_destroy();
return;
}
max_channels = g_slist_length(sdi->channels);
for (i = 0; i < max_channels; i++) {
if (triggerlist[i]) {
sr_dev_trigger_set(sdi, i, triggerlist[i]);
g_free(triggerlist[i]);
}
}
g_free(triggerlist);
}

if (opt_continuous) {
Expand Down
43 changes: 33 additions & 10 deletions show.c
Original file line number Diff line number Diff line change
Expand Up @@ -208,11 +208,11 @@ void show_dev_detail(void)
double dlow, dhigh, dcur_low, dcur_high;
const uint64_t *uint64, p, q, low, high;
uint64_t cur_low, cur_high;
const int32_t *opts;
const int32_t *int32, *opts;
unsigned int num_devices, o, i;
char *tmp_str;
char *s;
const char *charopts, **stropts;
char *s, c;
const char **stropts;

if (!(devices = device_scan())) {
g_critical("No devices found.");
Expand Down Expand Up @@ -284,20 +284,43 @@ void show_dev_detail(void)
if (!(srci = sr_config_info_get(opts[o])))
continue;

if (srci->key == SR_CONF_TRIGGER_TYPE) {
if (srci->key == SR_CONF_TRIGGER_MATCH) {
if (sr_config_list(sdi->driver, sdi, channel_group, srci->key,
&gvar) != SR_OK) {
&gvar_list) != SR_OK) {
printf("\n");
continue;
}
charopts = g_variant_get_string(gvar, NULL);
int32 = g_variant_get_fixed_array(gvar_list,
&num_elements, sizeof(int32_t));
printf(" Supported triggers: ");
while (*charopts) {
printf("%c ", *charopts);
charopts++;
for (i = 0; i < num_elements; i++) {
switch(int32[i]) {
case SR_TRIGGER_ZERO:
c = '0';
break;
case SR_TRIGGER_ONE:
c = '1';
break;
case SR_TRIGGER_RISING:
c = 'r';
break;
case SR_TRIGGER_FALLING:
c = 'f';
break;
case SR_TRIGGER_EDGE:
c = 'e';
break;
case SR_TRIGGER_OVER:
c = 'o';
break;
case SR_TRIGGER_UNDER:
c = 'u';
break;
}
printf("%c ", c);
}
printf("\n");
g_variant_unref(gvar);
g_variant_unref(gvar_list);

} else if (srci->key == SR_CONF_LIMIT_SAMPLES) {
/* If implemented in config_list(), this denotes the
Expand Down
1 change: 1 addition & 0 deletions sigrok-cli.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ void map_pd_channels(struct sr_dev_inst *sdi);
/* parsers.c */
struct sr_channel *find_channel(GSList *channellist, const char *channelname);
GSList *parse_channelstring(struct sr_dev_inst *sdi, const char *channelstring);
int parse_triggerstring(const struct sr_dev_inst *sdi, const char *s);
GHashTable *parse_generic_arg(const char *arg, gboolean sep_first);
int canon_cmp(const char *str1, const char *str2);

Expand Down

0 comments on commit 6b27bde

Please sign in to comment.