X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=decoders%2Fusb_signalling%2Fpd.py;h=3760dea85c64a3fe5f1a97cc13f7f607e68a1a6a;hb=be465111b552c7c2a2262ac49758a30a8bf1b1d5;hp=61844f7605bc7dc04d4e53a84e9a02f85840800c;hpb=a56b8fe1439410e88a4fa3888820f693f6f37aba;p=libsigrokdecode.git diff --git a/decoders/usb_signalling/pd.py b/decoders/usb_signalling/pd.py index 61844f7..3760dea 100644 --- a/decoders/usb_signalling/pd.py +++ b/decoders/usb_signalling/pd.py @@ -35,7 +35,6 @@ Packet: - 'BIT', - 'STUFF BIT', None - 'EOP', None - - 'PACKET', : - 'J', 'K', 'SE0', or 'SE1' @@ -43,10 +42,6 @@ Packet: : - 0 or 1 - Note: Symbols like SE0, SE1, and the J that's part of EOP don't yield 'BIT'. - -: - - A string consisting of '1' and '0' characters, e.g. '11010100'. - - The packet contains only "real" bits, no stuff bits (and no SOF/EOP). ''' # Low-/full-speed symbols. @@ -91,20 +86,19 @@ class Decoder(srd.Decoder): 'signalling': ['Signalling', 'full-speed'], } annotations = [ - ['symbol', 'Symbol'], + ['sym', 'Symbol'], ['sop', 'Start of packet (SOP)'], ['eop', 'End of packet (EOP)'], ['bit', 'Bit'], ['stuffbit', 'Stuff bit'], - ['packet', 'Packet'], ] def __init__(self): + self.samplerate = None self.oldsym = 'J' # The "idle" state is J. self.ss_sop = None self.ss_block = None self.samplenum = 0 - self.packet = '' self.syms = [] self.bitrate = None self.bitwidth = None @@ -114,12 +108,16 @@ class Decoder(srd.Decoder): self.consecutive_ones = 0 self.state = 'IDLE' - def start(self, metadata): - self.out_proto = self.add(srd.OUTPUT_PROTO, 'usb_signalling') - self.out_ann = self.add(srd.OUTPUT_ANN, 'usb_signalling') - self.bitrate = bitrates[self.options['signalling']] - self.bitwidth = float(metadata['samplerate']) / float(self.bitrate) - self.halfbit = int(self.bitwidth / 2) + def start(self): + self.out_proto = self.register(srd.OUTPUT_PYTHON) + self.out_ann = self.register(srd.OUTPUT_ANN) + + def metadata(self, key, value): + if key == srd.SRD_CONF_SAMPLERATE: + self.samplerate = value + self.bitrate = bitrates[self.options['signalling']] + self.bitwidth = float(self.samplerate) / float(self.bitrate) + self.halfbit = int(self.bitwidth / 2) def report(self): pass @@ -132,11 +130,11 @@ class Decoder(srd.Decoder): def putpm(self, data): s, h = self.samplenum, self.halfbit - self.put(self.ss_block - h, self.samplenum + h, self.out_proto, data) + self.put(self.ss_block - h, s + h, self.out_proto, data) def putm(self, data): s, h = self.samplenum, self.halfbit - self.put(self.ss_block - h, self.samplenum + h, self.out_ann, data) + self.put(self.ss_block - h, s + h, self.out_ann, data) def putpb(self, data): s, h = self.samplenum, self.halfbit @@ -164,15 +162,14 @@ class Decoder(srd.Decoder): def handle_bit(self, sym, b): if self.consecutive_ones == 6 and b == '0': - # Stuff bit. Don't add to the packet, reset self.consecutive_ones. + # Stuff bit. self.putpb(['STUFF BIT', None]) self.putb([4, ['SB: %s/%s' % (sym, b)]]) self.consecutive_ones = 0 else: - # Normal bit. Add it to the packet, update self.consecutive_ones. + # Normal bit (not a stuff bit). self.putpb(['BIT', b]) self.putb([3, ['%s/%s' % (sym, b)]]) - self.packet += b if b == '1': self.consecutive_ones += 1 else: @@ -187,13 +184,10 @@ class Decoder(srd.Decoder): self.set_new_target_samplenum() self.oldsym = sym if self.syms[-2:] == ['SE0', 'J']: - # Got an EOP, i.e. we now have a full packet. + # Got an EOP. self.putpm(['EOP', None]) self.putm([2, ['EOP']]) - self.ss_block = self.ss_sop - self.putpm(['PACKET', self.packet]) - self.putm([5, ['PACKET: %s' % self.packet]]) - self.bitnum, self.packet, self.syms, self.state = 0, '', [], 'IDLE' + self.bitnum, self.syms, self.state = 0, [], 'IDLE' self.consecutive_ones = 0 def get_bit(self, sym): @@ -212,6 +206,8 @@ class Decoder(srd.Decoder): self.oldsym = sym def decode(self, ss, es, data): + if self.samplerate is None: + raise Exception("Cannot decode without samplerate.") for (self.samplenum, pins) in data: # State machine. if self.state == 'IDLE':