]> sigrok.org Git - libsigrokdecode.git/blobdiff - decoders/cc1101/pd.py
avr_isp: Add more parts
[libsigrokdecode.git] / decoders / cc1101 / pd.py
index 8c4c63123041b7e446c4e23f84630d3fa34217a8..f62f18eca9391e200c71f3f9a9bb1c145e826aeb 100644 (file)
 ##
 
 import sigrokdecode as srd
+from collections import namedtuple
+from common.srdhelper import SrdIntEnum
 from .lists import *
 
-ANN_STROBE, ANN_SINGLE_READ, ANN_SINGLE_WRITE, ANN_BURST_READ, \
-    ANN_BURST_WRITE, ANN_STATUS_READ, ANN_STATUS, ANN_WARN = range(8)
+Ann = SrdIntEnum.from_str('Ann', 'STROBE SINGLE_READ SINGLE_WRITE BURST_READ \
+    BURST_WRITE STATUS_READ STATUS WARN')
+
+Pos = namedtuple('Pos', ['ss', 'es'])
+Data = namedtuple('Data', ['mosi', 'miso'])
 
 class Decoder(srd.Decoder):
     api_version = 3
@@ -39,15 +44,15 @@ class Decoder(srd.Decoder):
         ('single_write', 'Single register write'),
         ('burst_read', 'Burst register read'),
         ('burst_write', 'Burst register write'),
-        ('status', 'Status register'),
+        ('status_read', 'Status read'),
+        ('status_reg', 'Status register'),
         ('warning', 'Warning'),
     )
     annotation_rows = (
-        ('cmd', 'Commands', (ANN_STROBE,)),
-        ('data', 'Data', (ANN_SINGLE_READ, ANN_SINGLE_WRITE, ANN_BURST_READ,
-                            ANN_BURST_WRITE, ANN_STATUS_READ)),
-        ('status', 'Status register', (ANN_STATUS,)),
-        ('warnings', 'Warnings', (ANN_WARN,)),
+        ('cmds', 'Commands', (Ann.STROBE,)),
+        ('data', 'Data', (Ann.prefixes('SINGLE_ BURST_ STATUS_'))),
+        ('status', 'Status register', (Ann.STATUS,)),
+        ('warnings', 'Warnings', (Ann.WARN,)),
     )
 
     def __init__(self):
@@ -63,15 +68,15 @@ class Decoder(srd.Decoder):
 
     def warn(self, pos, msg):
         '''Put a warning message 'msg' at 'pos'.'''
-        self.put(pos[0], pos[1], self.out_ann, [ANN_WARN, [msg]])
+        self.put(pos.ss, pos.es, self.out_ann, [Ann.WARN, [msg]])
 
     def putp(self, pos, ann, msg):
         '''Put an annotation message 'msg' at 'pos'.'''
-        self.put(pos[0], pos[1], self.out_ann, [ann, [msg]])
+        self.put(pos.ss, pos.es, self.out_ann, [ann, [msg]])
 
     def putp2(self, pos, ann, msg1, msg2):
         '''Put an annotation message 'msg' at 'pos'.'''
-        self.put(pos[0], pos[1], self.out_ann, [ann, [msg1, msg2]])
+        self.put(pos.ss, pos.es, self.out_ann, [ann, [msg1, msg2]])
 
     def next(self):
         '''Resets the decoder after a complete command was decoded.'''
@@ -92,11 +97,11 @@ class Decoder(srd.Decoder):
 
     def mosi_bytes(self):
         '''Returns the collected MOSI bytes of a multi byte command.'''
-        return [b[0] for b in self.mb]
+        return [b.mosi for b in self.mb]
 
     def miso_bytes(self):
         '''Returns the collected MISO bytes of a multi byte command.'''
-        return [b[1] for b in self.mb]
+        return [b.miso for b in self.mb]
 
     def decode_command(self, pos, b):
         '''Decodes the command byte 'b' at position 'pos' and prepares
@@ -109,11 +114,11 @@ class Decoder(srd.Decoder):
         self.cmd, self.dat, self.min, self.max = c
 
         if self.cmd == 'Strobe':
-            self.putp(pos, ANN_STROBE, self.format_command())
+            self.putp(pos, Ann.STROBE, self.format_command())
         else:
             # Don't output anything now, the command is merged with
             # the data bytes following it.
-            self.ss_mb = pos[0]
+            self.ss_mb = pos.ss
 
     def format_command(self):
         '''Returns the label for the current command.'''
@@ -121,7 +126,7 @@ class Decoder(srd.Decoder):
             return self.cmd
         if self.cmd == 'Strobe':
             reg = strobes.get(self.dat, 'unknown strobe')
-            return '{} "{}"'.format(self.cmd, reg)
+            return '{} {}'.format(self.cmd, reg)
         else:
             return 'TODO Cmd {}'.format(self.cmd)
 
@@ -170,11 +175,11 @@ class Decoder(srd.Decoder):
             if regid not in regs:
                 self.warn(pos, 'unknown register')
                 return
-            name = '{} (0x{:02X})'.format(regs[regid], regid)
+            name = '{} ({:02X})'.format(regs[regid], regid)
         else:
             name = regid
 
-        if regid == 'STATUS' and ann == ANN_STATUS:
+        if regid == 'STATUS' and ann == Ann.STATUS:
             label = 'Status'
             self.decode_status_reg(pos, ann, data, label)
         else:
@@ -203,7 +208,7 @@ class Decoder(srd.Decoder):
         else:
             longtext_fifo = '{} bytes free in TX FIFO'.format(fifo_bytes)
 
-        text = '{} = "0x{:02X}"'.format(label, status)
+        text = '{} = {:02X}'.format(label, status)
         longtext = ''.join([text, '; ', longtext_chiprdy, longtext_state, longtext_fifo])
         self.putp2(pos, ann, longtext, text)
 
@@ -215,24 +220,24 @@ class Decoder(srd.Decoder):
             return '{:02X}'.format(b)
 
         data = ' '.join([escape(b) for b in data])
-        text = '{} = "0x{}"'.format(label, data)
+        text = '{} = {}'.format(label, data)
         self.putp(pos, ann, text)
 
     def finish_command(self, pos):
         '''Decodes the remaining data bytes at position 'pos'.'''
 
         if self.cmd == 'Write':
-            self.decode_reg(pos, ANN_SINGLE_WRITE, self.dat, self.mosi_bytes())
+            self.decode_reg(pos, Ann.SINGLE_WRITE, self.dat, self.mosi_bytes())
         elif self.cmd == 'Burst write':
-            self.decode_reg(pos, ANN_BURST_WRITE, self.dat, self.mosi_bytes())
+            self.decode_reg(pos, Ann.BURST_WRITE, self.dat, self.mosi_bytes())
         elif self.cmd == 'Read':
-            self.decode_reg(pos, ANN_SINGLE_READ, self.dat, self.miso_bytes())
+            self.decode_reg(pos, Ann.SINGLE_READ, self.dat, self.miso_bytes())
         elif self.cmd == 'Burst read':
-            self.decode_reg(pos, ANN_BURST_READ, self.dat, self.miso_bytes())
+            self.decode_reg(pos, Ann.BURST_READ, self.dat, self.miso_bytes())
         elif self.cmd == 'Strobe':
-            self.decode_reg(pos, ANN_STROBE, self.dat, self.mosi_bytes())
+            self.decode_reg(pos, Ann.STROBE, self.dat, self.mosi_bytes())
         elif self.cmd == 'Status read':
-            self.decode_reg(pos, ANN_STATUS_READ, self.dat, self.miso_bytes())
+            self.decode_reg(pos, Ann.STATUS_READ, self.dat, self.miso_bytes())
         else:
             self.warn(pos, 'unhandled command')
 
@@ -259,14 +264,14 @@ class Decoder(srd.Decoder):
                     if len(self.mb) < self.min:
                         self.warn((ss, ss), 'missing data bytes')
                     elif self.mb:
-                        self.finish_command((self.ss_mb, self.es_mb))
+                        self.finish_command(Pos(self.ss_mb, self.es_mb))
 
                 self.next()
                 self.cs_was_released = True
 
         elif ptype == 'DATA' and self.cs_was_released:
             mosi, miso = data1, data2
-            pos = (ss, es)
+            pos = Pos(ss, es)
 
             if miso is None or mosi is None:
                 self.requirements_met = False
@@ -277,7 +282,7 @@ class Decoder(srd.Decoder):
                 # First MOSI byte is always the command.
                 self.decode_command(pos, mosi)
                 # First MISO byte is always the status register.
-                self.decode_reg(pos, ANN_STATUS, 'STATUS', [miso])
+                self.decode_reg(pos, Ann.STATUS, 'STATUS', [miso])
             else:
                 if not self.cmd or len(self.mb) >= self.max:
                     self.warn(pos, 'excess byte')
@@ -286,4 +291,4 @@ class Decoder(srd.Decoder):
                     if self.ss_mb == -1:
                         self.ss_mb = ss
                     self.es_mb = es
-                    self.mb.append((mosi, miso))
+                    self.mb.append(Data(mosi, miso))