]> sigrok.org Git - libsigrokdecode.git/commitdiff
Implement basic flushing
authorSoeren Apel <redacted>
Sun, 21 Jun 2020 10:10:59 +0000 (12:10 +0200)
committerSoeren Apel <redacted>
Sat, 13 Feb 2021 22:21:10 +0000 (23:21 +0100)
decoders/pca9571/pd.py
decoders/tca6408a/pd.py
instance.c
libsigrokdecode-internal.h

index a87814222a129d7074b8dd204fa2c3d1ae843b7c..ea8715d6d2ca15c1fecfd5d7b61ddc18a9eae215 100644 (file)
@@ -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
index 0d63cc38e467575e32256df82725eecb7f375e12..4ca1082a8bcfe9e2645d46ac502063332d898530 100644 (file)
@@ -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.
index 36088744893b7a76f8b0c74e8da33d977c3d3a13..c30b46b7ecd37348c17e9007efce47951214ebe8 100644 (file)
@@ -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.
  *
index af245f6ad197f5b75ab8a2782a0399bb43b2a95c..329a10ab9462f7661c7e5a4f3a5390e4fd38fb19 100644 (file)
@@ -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);