X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=blobdiff_plain;f=src%2Fsoft-trigger.c;h=1f81fae54e11575d226cb1fd0aaf9fc0ef9a9ddb;hp=116e7b34f3086db0d82d9413c802aaceb58a0e89;hb=22fdb67fa0714c11cc0a58ee1423f55d18a4f080;hpb=c1aae90038456a61d0f9313d34e6107c3440d3e7 diff --git a/src/soft-trigger.c b/src/soft-trigger.c index 116e7b34..1f81fae5 100644 --- a/src/soft-trigger.c +++ b/src/soft-trigger.c @@ -17,13 +17,29 @@ * along with this program. If not, see . */ +#include #include #include #include "libsigrok-internal.h" -/* @cond PRIVATE */ +/** @cond PRIVATE */ #define LOG_PREFIX "soft-trigger" -/* @endcond */ +/** @endcond */ + +SR_PRIV int logic_channel_unitsize(GSList *channels) +{ + int number = 0; + struct sr_channel *channel; + GSList *l; + + for (l = channels; l; l = l->next) { + channel = l->data; + if (channel->type == SR_CHANNEL_LOGIC) + number++; + } + + return (number + 7) / 8; +} SR_PRIV struct soft_trigger_logic *soft_trigger_logic_new( const struct sr_dev_inst *sdi, struct sr_trigger *trigger, @@ -34,10 +50,19 @@ SR_PRIV struct soft_trigger_logic *soft_trigger_logic_new( stl = g_malloc0(sizeof(struct soft_trigger_logic)); stl->sdi = sdi; stl->trigger = trigger; - stl->unitsize = (g_slist_length(sdi->channels) + 7) / 8; + stl->unitsize = logic_channel_unitsize(sdi->channels); stl->prev_sample = g_malloc0(stl->unitsize); stl->pre_trigger_size = stl->unitsize * pre_trigger_samples; - stl->pre_trigger_buffer = g_malloc(stl->pre_trigger_size); + stl->pre_trigger_buffer = g_try_malloc(stl->pre_trigger_size); + if (pre_trigger_samples > 0 && !stl->pre_trigger_buffer) { + /* + * Error out if g_try_malloc() failed (or was invoked as + * g_try_malloc(0)) *and* more than 0 pretrigger samples + * were requested. + */ + soft_trigger_logic_free(stl); + return NULL; + } stl->pre_trigger_head = stl->pre_trigger_buffer; if (stl->pre_trigger_size > 0 && !stl->pre_trigger_buffer) { @@ -150,7 +175,6 @@ static gboolean logic_check_match(struct soft_trigger_logic *stl, SR_PRIV int soft_trigger_logic_check(struct soft_trigger_logic *stl, uint8_t *buf, int len, int *pre_trigger_samples) { - struct sr_datafeed_packet packet; struct sr_trigger_stage *stage; struct sr_trigger_match *match; GSList *l, *l_stage; @@ -191,9 +215,7 @@ SR_PRIV int soft_trigger_logic_check(struct soft_trigger_logic *stl, /* Fire trigger. */ offset = i / stl->unitsize; - packet.type = SR_DF_TRIGGER; - packet.payload = NULL; - sr_session_send(stl->sdi, &packet); + std_session_send_df_trigger(stl->sdi); break; } } else if (stl->cur_stage > 0) {