uart: Add [rx|tx]_packet_len options.
authorUwe Hermann <uwe@hermann-uwe.de>
Tue, 12 Nov 2019 21:20:45 +0000 (22:20 +0100)
committerUwe Hermann <uwe@hermann-uwe.de>
Tue, 12 Nov 2019 22:03:32 +0000 (23:03 +0100)
Similar to the recently added [rx|tx]_packet_delimiter options, these
emit summary annotations ("packets") when a certain number of data values
have been decoded.

This is a convenience feature which can be useful when a user wants to
view data which doesn't have a specified delimiter value (as last data
value in the "packet"), but rather fixed-length "packets".

This is just an (intentionally very simple) helper/convenience improvement
and is NOT meant to replace "proper" stacked decoders for UART-based protocols.

decoders/uart/pd.py

index 0a0d30729c6bcf85de4b2edd0040e251b5dc05cf..1639727c3c8cf2983158a03bee1c648ceebd074d 100644 (file)
@@ -116,6 +116,8 @@ class Decoder(srd.Decoder):
             'default': -1},
         {'id': 'tx_packet_delimiter', 'desc': 'TX packet delimiter (decimal)',
             'default': -1},
+        {'id': 'rx_packet_len', 'desc': 'RX packet length', 'default': -1},
+        {'id': 'tx_packet_len', 'desc': 'TX packet length', 'default': -1},
     )
     annotations = (
         ('rx-data', 'RX data'),
@@ -261,16 +263,18 @@ class Decoder(srd.Decoder):
         self.state[rxtx] = 'GET DATA BITS'
 
     def handle_packet(self, rxtx):
-        opt = ('rx' if (rxtx == RX) else 'tx') + '_packet_delimiter'
-        delim = self.options[opt]
-        if delim == -1:
+        d = 'rx' if (rxtx == RX) else 'tx'
+        delim = self.options[d + '_packet_delimiter']
+        plen = self.options[d + '_packet_len']
+        if delim == -1 and plen == -1:
             return
 
-        # Cache data values until we see the delimiter.
+        # Cache data values until we see the delimiter and/or the specified
+        # packet length has been reached (whichever happens first).
         if len(self.packet_cache[rxtx]) == 0:
             self.ss_packet[rxtx] = self.startsample[rxtx]
         self.packet_cache[rxtx].append(self.datavalue[rxtx])
-        if self.datavalue[rxtx] == delim:
+        if self.datavalue[rxtx] == delim or len(self.packet_cache[rxtx]) == plen:
             self.es_packet[rxtx] = self.samplenum
             s = ''
             for b in self.packet_cache[rxtx]: