X-Git-Url: https://sigrok.org/gitweb/?p=libsigrokdecode.git;a=blobdiff_plain;f=decoders%2Fsdq%2Fpd.py;h=66df42025f1b9343d75678ff16fa3652e03b62ab;hp=d8df89ff5879f8ea4df1939bceb9c9882de29152;hb=168b01adba98bd36abfd3b678282995ce415cb57;hpb=d7c2340885909a619acfe590201f71faefae7843 diff --git a/decoders/sdq/pd.py b/decoders/sdq/pd.py index d8df89f..66df420 100644 --- a/decoders/sdq/pd.py +++ b/decoders/sdq/pd.py @@ -23,6 +23,12 @@ import sigrokdecode as srd class SamplerateError(Exception): pass +class Pin: + SDQ, = range(1) + +class Ann: + BIT, BYTE, BREAK, = range(3) + class Decoder(srd.Decoder): api_version = 3 id = 'sdq' @@ -45,9 +51,9 @@ class Decoder(srd.Decoder): ('break', 'Break'), ) annotation_rows = ( - ('bits', 'Bits', (0,)), - ('bytes', 'Bytes', (1,)), - ('breaks', 'Breaks', (2,)), + ('bits', 'Bits', (Ann.BIT,)), + ('bytes', 'Bytes', (Ann.BYTE,)), + ('breaks', 'Breaks', (Ann.BREAK,)), ) def puts(self, data): @@ -64,7 +70,6 @@ class Decoder(srd.Decoder): def reset(self): self.samplerate = None - self.state = 'INIT' self.startsample = 0 self.bits = [] self.bytepos = 0 @@ -78,16 +83,22 @@ class Decoder(srd.Decoder): def handle_bit(self, bit): self.bits.append(bit) - self.putetu([0, ['Bit: %d' % bit, '%d' % bit]]) + self.putetu([Ann.BIT, [ + 'Bit: {:d}'.format(bit), + '{:d}'.format(bit), + ]]) if len(self.bits) == 8: byte = bitpack(self.bits) - self.putbetu([1, ['Byte: %#04x' % byte, '%#04x' % byte]]) + self.putbetu([Ann.BYTE, [ + 'Byte: 0x{:02x}'.format(byte), + '0x{:02x}'.format(byte), + ]]) self.bits = [] self.bytepos = 0 def handle_break(self): - self.puts([2, ['Break', 'BR']]) + self.puts([Ann.BREAK, ['Break', 'BR']]) self.bits = [] self.startsample = self.samplenum self.bytepos = 0 @@ -98,30 +109,23 @@ class Decoder(srd.Decoder): self.bit_width = float(self.samplerate) / float(self.options['bitrate']) self.half_bit_width = self.bit_width / 2.0 # BREAK if the line is low for longer than this. - self.break_threshold = self.bit_width * 1.2 + break_threshold = self.bit_width * 1.2 + # Wait until the line is high before inspecting input data. + sdq, = self.wait({Pin.SDQ: 'h'}) while True: - if self.state == 'INIT': - sdq, = self.wait({0: 'h'}) # Wait until the line is high before starting - self.state = 'DATA' - - elif self.state == 'DATA': - sdq, = self.wait({0: 'f'}) # Falling edge - - self.startsample = self.samplenum - if self.bytepos == 0: - self.bytepos = self.samplenum - - sdq, = self.wait({0: 'r'}) # Rising edge - - delta = self.samplenum - self.startsample - if delta > self.break_threshold: - self.state = 'BREAK' - elif delta > self.half_bit_width: - self.handle_bit(0) - else: - self.handle_bit(1) - - elif self.state == 'BREAK': + # Get the length of a low pulse (falling to rising edge). + sdq, = self.wait({Pin.SDQ: 'f'}) + self.startsample = self.samplenum + if self.bytepos == 0: + self.bytepos = self.samplenum + sdq, = self.wait({Pin.SDQ: 'r'}) + + # Check for 0 or 1 data bits, or the BREAK symbol. + delta = self.samplenum - self.startsample + if delta > break_threshold: self.handle_break() - self.state = 'DATA' + elif delta > self.half_bit_width: + self.handle_bit(0) + else: + self.handle_bit(1)