summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--decoders/pca9571/pd.py8
-rw-r--r--decoders/tca6408a/pd.py6
-rw-r--r--instance.c41
-rw-r--r--libsigrokdecode-internal.h1
4 files changed, 49 insertions, 7 deletions
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);