X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=decoders%2Frgb_led_ws281x%2Fpd.py;h=43fbce4d0e2c9c89baacdb263649a706c2e21f38;hb=ec5fc441e38e59a57cd508abf420e30fc3c28e0d;hp=5cf21245df91603ea53fcc0d0fcce6f0feb5f112;hpb=1b9ef18be867133e721681cbc20272cf5c669504;p=libsigrokdecode.git diff --git a/decoders/rgb_led_ws281x/pd.py b/decoders/rgb_led_ws281x/pd.py index 5cf2124..43fbce4 100644 --- a/decoders/rgb_led_ws281x/pd.py +++ b/decoders/rgb_led_ws281x/pd.py @@ -31,7 +31,8 @@ class Decoder(srd.Decoder): 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'}, ) @@ -41,11 +42,18 @@ class Decoder(srd.Decoder): ('rgb', 'RGB'), ) annotation_rows = ( - ('bit', 'Bits', (0, 1)), - ('rgb', 'RGB', (2,)), + ('bits', 'Bits', (0, 1)), + ('rgb-vals', 'RGB values', (2,)), + ) + options = ( + {'id': 'type', 'desc': 'RGB or RGBW', 'default': 'RGB', + 'values': ('RGB', 'RGBW')}, ) def __init__(self): + self.reset() + + def reset(self): self.samplerate = None self.oldpin = None self.ss_packet = None @@ -62,13 +70,22 @@ class Decoder(srd.Decoder): self.samplerate = value def handle_bits(self, samplenum): - if len(self.bits) == 24: - grb = reduce(lambda a, b: (a << 1) | b, self.bits) - rgb = (grb & 0xff0000) >> 8 | (grb & 0x00ff00) << 8 | (grb & 0x0000ff) - self.put(self.ss_packet, samplenum, self.out_ann, - [2, ['#%06x' % rgb]]) - self.bits = [] - self.ss_packet = None + if self.options['type'] == 'RGB': + if len(self.bits) == 24: + grb = reduce(lambda a, b: (a << 1) | b, self.bits) + rgb = (grb & 0xff0000) >> 8 | (grb & 0x00ff00) << 8 | (grb & 0x0000ff) + self.put(self.ss_packet, samplenum, self.out_ann, + [2, ['#%06x' % rgb]]) + self.bits = [] + self.ss_packet = None + else: + if len(self.bits) == 32: + grb = reduce(lambda a, b: (a << 1) | b, self.bits) + rgb = (grb & 0xff0000) >> 8 | (grb & 0x00ff00) << 8 | (grb & 0xff0000ff) + self.put(self.ss_packet, samplenum, self.out_ann, + [2, ['#%08x' % rgb]]) + self.bits = [] + self.ss_packet = None def decode(self): if not self.samplerate: @@ -85,6 +102,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.