]> sigrok.org Git - libsigrokdecode.git/blobdiff - decoders/rgb_led_ws281x/pd.py
Backport recent changes from mainline.
[libsigrokdecode.git] / decoders / rgb_led_ws281x / pd.py
index 0cb6603fb81dd7eaa9b20969387784b95c2f5aef..adf68eb17d616c835023755a574dd14d1c7745b3 100644 (file)
@@ -24,14 +24,15 @@ class SamplerateError(Exception):
     pass
 
 class Decoder(srd.Decoder):
-    api_version = 2
+    api_version = 3
     id = 'rgb_led_ws281x'
     name = 'RGB LED (WS281x)'
     longname = 'RGB LED string decoder (WS281x)'
     desc = 'RGB LED string protocol (WS281x).'
     license = 'gplv3+'
     inputs = ['logic']
-    outputs = ['rgb_led_ws281x']
+    outputs = []
+    tags = ['Display', 'IC']
     channels = (
         {'id': 'din', 'name': 'DIN', 'desc': 'DIN data line'},
     )
@@ -46,6 +47,9 @@ class Decoder(srd.Decoder):
     )
 
     def __init__(self):
+        self.reset()
+
+    def reset(self):
         self.samplerate = None
         self.oldpin = None
         self.ss_packet = None
@@ -70,11 +74,14 @@ class Decoder(srd.Decoder):
             self.bits = []
             self.ss_packet = None
 
-    def decode(self, ss, es, data):
+    def decode(self):
         if not self.samplerate:
             raise SamplerateError('Cannot decode without samplerate.')
 
-        for (self.samplenum, (pin, )) in data:
+        while True:
+            # TODO: Come up with more appropriate self.wait() conditions.
+            (pin,) = self.wait()
+
             if self.oldpin is None:
                 self.oldpin = pin
                 continue
@@ -82,6 +89,7 @@ class Decoder(srd.Decoder):
             # Check RESET condition (manufacturer recommends 50 usec minimal,
             # but real minimum is ~10 usec).
             if not self.inreset and not pin and self.es is not None and \
+                    self.ss is not None and \
                     (self.samplenum - self.es) / self.samplerate > 50e-6:
 
                 # Decode last bit value.