From: Soeren Apel Date: Sun, 21 Jun 2020 10:10:59 +0000 (+0200) Subject: Implement basic flushing X-Git-Url: https://sigrok.org/gitweb/?p=libsigrokdecode.git;a=commitdiff_plain;h=114adb4997b71e93267e3816710c8b019ae927c0 Implement basic flushing --- diff --git a/decoders/pca9571/pd.py b/decoders/pca9571/pd.py index a878142..ea8715d 100644 --- a/decoders/pca9571/pd.py +++ b/decoders/pca9571/pd.py @@ -62,8 +62,8 @@ class Decoder(srd.Decoder): self.out_ann = self.register(srd.OUTPUT_ANN) self.out_logic = self.register(srd.OUTPUT_LOGIC) -# def flush(self): -# self.put_logic_states() + def flush(self): + self.put_logic_states() def putx(self, data): self.put(self.ss, self.es, self.out_ann, data) @@ -82,7 +82,7 @@ class Decoder(srd.Decoder): '(%02X) are different' % self.last_write]]) else: operation = ['Outputs set', 'W'] -# self.put_logic_states() + self.put_logic_states() self.last_write = b self.putx([1, [operation[0] + ': %02X' % b, @@ -99,8 +99,6 @@ class Decoder(srd.Decoder): cmd, databyte = data self.ss, self.es = ss, es - self.put_logic_states() - # State machine. if cmd in ('ACK', 'BITS'): # Discard 'ACK' and 'BITS'. pass diff --git a/decoders/tca6408a/pd.py b/decoders/tca6408a/pd.py index 0d63cc3..4ca1082 100644 --- a/decoders/tca6408a/pd.py +++ b/decoders/tca6408a/pd.py @@ -64,6 +64,9 @@ class Decoder(srd.Decoder): self.out_ann = self.register(srd.OUTPUT_ANN) self.out_logic = self.register(srd.OUTPUT_LOGIC) + def flush(self): + self.put_logic_states() + def putx(self, data): self.put(self.ss, self.es, self.out_ann, data) @@ -78,6 +81,7 @@ class Decoder(srd.Decoder): # TODO def handle_reg_0x01(self, b): + self.put_logic_states() self.putx([1, ['Outputs set: %02X' % b]]) self.logic_value = b @@ -109,8 +113,6 @@ class Decoder(srd.Decoder): # Store the start/end samples of this I²C packet. self.ss, self.es = ss, es - self.put_logic_states() - # State machine. if self.state == 'IDLE': # Wait for an I²C START condition. diff --git a/instance.c b/instance.c index 3608874..c30b46b 100644 --- a/instance.c +++ b/instance.c @@ -1234,12 +1234,53 @@ SRD_PRIV int srd_inst_decode(struct srd_decoder_inst *di, g_cond_wait(&di->handled_all_samples_cond, &di->data_mutex); g_mutex_unlock(&di->data_mutex); + /* Flush all PDs in the stack that can be flushed */ + srd_inst_flush(di); + if (di->want_wait_terminate) return SRD_ERR_TERM_REQ; return SRD_OK; } + +/** + * Flush all data that is pending, bottom decoder first up to the top of the stack. + * + * @param di The decoder instance to call. Must not be NULL. + * + * @return SRD_OK upon success, a (negative) error code otherwise. + * + * @private + */ +SRD_PRIV int srd_inst_flush(struct srd_decoder_inst *di) +{ + PyGILState_STATE gstate; + PyObject *py_ret; + GSList *l; + int ret; + + if (!di) + return SRD_ERR_ARG; + + gstate = PyGILState_Ensure(); + if (PyObject_HasAttrString(di->py_inst, "flush")) { + srd_dbg("Calling flush() of instance %s", di->inst_id); + py_ret = PyObject_CallMethod(di->py_inst, "flush", NULL); + Py_XDECREF(py_ret); + } + PyGILState_Release(gstate); + + /* Pass the "flush" request to all stacked decoders. */ + for (l = di->next_di; l; l = l->next) { + ret = srd_inst_flush(l->data); + if (ret != SRD_OK) + return ret; + } + + return di->decoder_state; +} + /** * Terminate current decoder work, prepare for re-use on new input data. * diff --git a/libsigrokdecode-internal.h b/libsigrokdecode-internal.h index af245f6..329a10a 100644 --- a/libsigrokdecode-internal.h +++ b/libsigrokdecode-internal.h @@ -82,6 +82,7 @@ SRD_PRIV int srd_inst_decode(struct srd_decoder_inst *di, uint64_t abs_start_samplenum, uint64_t abs_end_samplenum, const uint8_t *inbuf, uint64_t inbuflen, uint64_t unitsize); SRD_PRIV int process_samples_until_condition_match(struct srd_decoder_inst *di, gboolean *found_match); +SRD_PRIV int srd_inst_flush(struct srd_decoder_inst *di); SRD_PRIV int srd_inst_terminate_reset(struct srd_decoder_inst *di); SRD_PRIV void srd_inst_free(struct srd_decoder_inst *di); SRD_PRIV void srd_inst_free_all(struct srd_session *sess);