X-Git-Url: https://sigrok.org/gitweb/?p=libsigrokdecode.git;a=blobdiff_plain;f=decoders%2Fsdq%2Fpd.py;h=66df42025f1b9343d75678ff16fa3652e03b62ab;hp=1dc9c1c692bb613524406ff5a12e879c9ae60db0;hb=168b01adba98bd36abfd3b678282995ce415cb57;hpb=2bb149e691be4e1abf664a346b0d97c3eac0ad3b diff --git a/decoders/sdq/pd.py b/decoders/sdq/pd.py index 1dc9c1c..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 @@ -75,22 +80,25 @@ class Decoder(srd.Decoder): def metadata(self, key, value): if key == srd.SRD_CONF_SAMPLERATE: self.samplerate = value - self.bit_width = float(self.samplerate) / float(self.options['bitrate']) - self.half_bit_width = self.bit_width / 2.0 - self.break_threshold = self.bit_width * 1.2 # Break if the line is low for longer than this 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,29 +106,26 @@ class Decoder(srd.Decoder): def decode(self): if not self.samplerate: raise SamplerateError('Cannot decode without samplerate.') + 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. + 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)