From 01416b9810ceb759e3088bad174d89621704a210 Mon Sep 17 00:00:00 2001 From: Gerhard Sittig Date: Mon, 17 Jul 2023 18:23:03 +0200 Subject: i2c: unify emission of annotations, always use proto{} table Slightly unobfuscate how the I2C decoder invokes put methods. Present the annotation class and the list of texts for different zoom levels for readability. Also keep the data value presentation in that table so that it holds all texts which users will see during decoder use. Eliminate how the data bits used to bypass that table in the past. This commit does not address the unfortunate self.ss/es coupling of decoding code paths and annotation emitting helpers, which complicates review of the decoder's implemented logic. --- decoders/i2c/pd.py | 46 +++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 19 deletions(-) (limited to 'decoders') diff --git a/decoders/i2c/pd.py b/decoders/i2c/pd.py index d9061f5..70795c0 100644 --- a/decoders/i2c/pd.py +++ b/decoders/i2c/pd.py @@ -48,18 +48,19 @@ For example, a slave address field could be 0x51 (instead of 0xa2). For 'START', 'START REPEAT', 'STOP', 'ACK', and 'NACK' is None. ''' -# CMD: [annotation-type-index, long annotation, short annotation] +# Meaning of table items: +# command -> [annotation class, annotation text in order of decreasing length] proto = { - 'START': [0, 'Start', 'S'], - 'START REPEAT': [1, 'Start repeat', 'Sr'], - 'STOP': [2, 'Stop', 'P'], - 'ACK': [3, 'ACK', 'A'], - 'NACK': [4, 'NACK', 'N'], - 'BIT': [5, 'Bit', 'B'], - 'ADDRESS READ': [6, 'Address read', 'AR'], - 'ADDRESS WRITE': [7, 'Address write', 'AW'], - 'DATA READ': [8, 'Data read', 'DR'], - 'DATA WRITE': [9, 'Data write', 'DW'], + 'START': [0, 'Start', 'S'], + 'START REPEAT': [1, 'Start repeat', 'Sr'], + 'STOP': [2, 'Stop', 'P'], + 'ACK': [3, 'ACK', 'A'], + 'NACK': [4, 'NACK', 'N'], + 'BIT': [5, '{b:1d}'], + 'ADDRESS READ': [6, 'Address read: {b:02X}', 'AR: {b:02X}', '{b:02X}'], + 'ADDRESS WRITE': [7, 'Address write: {b:02X}', 'AW: {b:02X}', '{b:02X}'], + 'DATA READ': [8, 'Data read: {b:02X}', 'DR: {b:02X}', '{b:02X}'], + 'DATA WRITE': [9, 'Data write: {b:02X}', 'DW: {b:02X}', '{b:02X}'], } class Decoder(srd.Decoder): @@ -145,7 +146,8 @@ class Decoder(srd.Decoder): self.pdu_bits = 0 cmd = 'START REPEAT' if self.is_repeat_start else 'START' self.putp([cmd, None]) - self.putx([proto[cmd][0], proto[cmd][1:]]) + cls, texts = proto[cmd][0], proto[cmd][1:] + self.putx([cls, texts]) self.state = 'FIND ADDRESS' self.is_repeat_start = True self.is_write = None @@ -230,17 +232,21 @@ class Decoder(srd.Decoder): self.putb([bin_class, bytes([d])]) - for bit in self.data_bits: - self.put(bit[1], bit[2], self.out_ann, [5, ['%d' % bit[0]]]) + for b, ss, es in self.data_bits: + cls, texts = proto['BIT'][0], proto['BIT'][1:] + texts = [t.format(b = b) for t in texts] + self.put(ss, es, self.out_ann, [cls, texts]) if cmd.startswith('ADDRESS') and is_seven: self.ss, self.es = self.samplenum, self.samplenum + self.bitwidth + cls = proto[cmd][0] w = ['Write', 'Wr', 'W'] if self.is_write else ['Read', 'Rd', 'R'] - self.putx([proto[cmd][0], w]) + self.putx([cls, w]) self.ss, self.es = self.ss_byte, self.samplenum - self.putx([proto[cmd][0], ['%s: %02X' % (proto[cmd][1], d), - '%s: %02X' % (proto[cmd][2], d), '%02X' % d]]) + cls, texts = proto[cmd][0], proto[cmd][1:] + texts = [t.format(b = d) for t in texts] + self.putx([cls, texts]) # Done with this packet. self.data_bits.clear() @@ -251,7 +257,8 @@ class Decoder(srd.Decoder): self.ss, self.es = self.samplenum, self.samplenum + self.bitwidth cmd = 'NACK' if (sda == 1) else 'ACK' self.putp([cmd, None]) - self.putx([proto[cmd][0], proto[cmd][1:]]) + cls, texts = proto[cmd][0], proto[cmd][1:] + self.putx([cls, texts]) # Slave addresses can span one or two bytes, before data bytes # follow. There can be an arbitrary number of data bytes. Stick # with getting more address bytes if applicable, or enter or @@ -273,7 +280,8 @@ class Decoder(srd.Decoder): cmd = 'STOP' self.ss, self.es = self.samplenum, self.samplenum self.putp([cmd, None]) - self.putx([proto[cmd][0], proto[cmd][1:]]) + cls, texts = proto[cmd][0], proto[cmd][1:] + self.putx([cls, texts]) self.state = 'FIND START' self.is_repeat_start = False self.is_write = None -- cgit v1.2.3-70-g09d2