X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fsoft-trigger.c;h=1f81fae54e11575d226cb1fd0aaf9fc0ef9a9ddb;hb=40a0b2f4667d9ca13c83821a16997a2264f6a2a7;hp=27c71b611b4a82546c7c0cf35eda99a30fe40dab;hpb=1beccaed464a4d92a070988a0331fe399f9f7a7a;p=libsigrok.git
diff --git a/src/soft-trigger.c b/src/soft-trigger.c
index 27c71b61..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 "libsigrok.h"
+#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,13 +50,22 @@ 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 == NULL) {
+ if (stl->pre_trigger_size > 0 && !stl->pre_trigger_buffer) {
soft_trigger_logic_free(stl);
return NULL;
}
@@ -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) {