From 13ace4b4117ad498484c10f961affec3e95aafac Mon Sep 17 00:00:00 2001 From: DreamSourceLab Date: Wed, 20 Nov 2019 02:01:53 -0800 Subject: [PATCH] Fix decode issue when skip zero --- libsigrokdecode4DSL/instance.c | 16 +++++++++++++--- libsigrokdecode4DSL/libsigrokdecode.h | 3 +++ libsigrokdecode4DSL/type_decoder.c | 4 ++-- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/libsigrokdecode4DSL/instance.c b/libsigrokdecode4DSL/instance.c index 73f2e181..5ede7107 100755 --- a/libsigrokdecode4DSL/instance.c +++ b/libsigrokdecode4DSL/instance.c @@ -699,6 +699,9 @@ SRD_PRIV int srd_inst_start(struct srd_decoder_inst *di, char **error) /* none matched */ di->abs_cur_matched = FALSE; + /* skip zero flag */ + di->skip_zero = FALSE; + /* Set self.samplenum to 0. */ PyObject_SetAttrString(di->py_inst, "samplenum", PyLong_FromLong(0)); @@ -859,7 +862,7 @@ static void update_old_pins_array_initial_pins(struct srd_decoder_inst *di) } } -static gboolean term_matches(const struct srd_decoder_inst *di, +static gboolean term_matches(struct srd_decoder_inst *di, struct srd_term *term, gboolean *skip_allow) { uint8_t old_sample, sample; @@ -869,8 +872,11 @@ static gboolean term_matches(const struct srd_decoder_inst *di, /* Caller ensures di, di->dec_channelmap, term, sample_pos != NULL. */ *skip_allow = FALSE; - if (term->type == SRD_TERM_SKIP) + if (term->type == SRD_TERM_SKIP) { + if (di->abs_cur_matched && term->num_samples_to_skip == 0) + di->skip_zero = TRUE; return sample_matches(0, 0, term); + } ch = term->channel; if (*(di->inbuf + ch) == NULL) { @@ -886,7 +892,7 @@ static gboolean term_matches(const struct srd_decoder_inst *di, return sample_matches(old_sample, sample, term); } -static gboolean all_terms_match(const struct srd_decoder_inst *di, +static gboolean all_terms_match(struct srd_decoder_inst *di, const GSList *cond, gboolean *skip_allow) { const GSList *l; @@ -900,6 +906,10 @@ static gboolean all_terms_match(const struct srd_decoder_inst *di, return FALSE; } + if (di->skip_zero) { + di->abs_cur_samplenum--; + di->skip_zero = FALSE; + } return TRUE; } diff --git a/libsigrokdecode4DSL/libsigrokdecode.h b/libsigrokdecode4DSL/libsigrokdecode.h index 804b00f9..491c3371 100755 --- a/libsigrokdecode4DSL/libsigrokdecode.h +++ b/libsigrokdecode4DSL/libsigrokdecode.h @@ -309,6 +309,9 @@ struct srd_decoder_inst { /** First entry of wait(). */ gboolean first_pos; + /** skip zero flag. */ + gboolean skip_zero; + /** Indicates the current state of the decoder stack. */ int decoder_state; diff --git a/libsigrokdecode4DSL/type_decoder.c b/libsigrokdecode4DSL/type_decoder.c index abc55c5d..d4b9782b 100755 --- a/libsigrokdecode4DSL/type_decoder.c +++ b/libsigrokdecode4DSL/type_decoder.c @@ -685,7 +685,7 @@ static int create_term_list(PyObject *py_dict, GSList **term_list, gboolean cur_ term = g_malloc(sizeof(struct srd_term)); term->type = SRD_TERM_SKIP; term->num_samples_to_skip = num_samples_to_skip; - term->num_samples_already_skipped = cur_matched ? 1 : 0; + term->num_samples_already_skipped = cur_matched ? (term->num_samples_to_skip != 0) : 0; } else { srd_err("Term key is neither a string nor a number."); goto err; @@ -841,7 +841,7 @@ static int set_skip_condition(struct srd_decoder_inst *di, uint64_t count) term = g_malloc(sizeof(*term)); term->type = SRD_TERM_SKIP; term->num_samples_to_skip = count; - term->num_samples_already_skipped = di->abs_cur_matched ? 1 : 0; + term->num_samples_already_skipped = di->abs_cur_matched ? (term->num_samples_to_skip != 0) : 0; term_list = g_slist_append(NULL, term); di->condition_list = g_slist_append(di->condition_list, term_list);