X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=decoders%2Fi2c%2Fpd.py;fp=decoders%2Fi2c%2Fpd.py;h=850b204db31a38ed1e647b7f7746731cb2780b50;hb=5eb664089f9123a91841f66535ffb1689d9ddd98;hp=70795c034efbe7235ef77d075904319b1cb7e6a6;hpb=01416b9810ceb759e3088bad174d89621704a210;p=libsigrokdecode.git diff --git a/decoders/i2c/pd.py b/decoders/i2c/pd.py index 70795c0..850b204 100644 --- a/decoders/i2c/pd.py +++ b/decoders/i2c/pd.py @@ -142,9 +142,12 @@ class Decoder(srd.Decoder): def handle_start(self, pins): self.ss, self.es = self.samplenum, self.samplenum - self.pdu_start = self.samplenum - self.pdu_bits = 0 - cmd = 'START REPEAT' if self.is_repeat_start else 'START' + if self.is_repeat_start: + cmd = 'START REPEAT' + else: + cmd = 'START' + self.pdu_start = self.samplenum + self.pdu_bits = 0 self.putp([cmd, None]) cls, texts = proto[cmd][0], proto[cmd][1:] self.putx([cls, texts]) @@ -254,6 +257,9 @@ class Decoder(srd.Decoder): def get_ack(self, pins): scl, sda = pins + # NOTE! Re-uses the last data bit's width for ACK/NAK as well. + # Which might be acceptable because this decoder implementation + # only gets to handle ACK/NAK after all DATA BITS were seen. self.ss, self.es = self.samplenum, self.samplenum + self.bitwidth cmd = 'NACK' if (sda == 1) else 'ACK' self.putp([cmd, None]) @@ -272,10 +278,14 @@ class Decoder(srd.Decoder): def handle_stop(self, pins): # Meta bitrate - if self.samplerate: - elapsed = 1 / float(self.samplerate) * (self.samplenum - self.pdu_start + 1) + if self.samplerate and self.pdu_start: + elapsed = self.samplenum - self.pdu_start + 1 + elapsed /= self.samplerate bitrate = int(1 / elapsed * self.pdu_bits) - self.put(self.ss_byte, self.samplenum, self.out_bitrate, bitrate) + ss, es = self.pdu_start, self.samplenum + self.put(ss, es, self.out_bitrate, bitrate) + self.pdu_start = None + self.pdu_bits = 0 cmd = 'STOP' self.ss, self.es = self.samplenum, self.samplenum