import sigrokdecode as srd
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)
+
class Decoder(srd.Decoder):
api_version = 3
id = 'cc1101'
('status', 'Status register'),
('warning', 'Warning'),
)
- ann_strobe = 0
- ann_single_read = 1
- ann_single_write = 2
- ann_burst_read = 3
- ann_burst_write = 4
- ann_status_read = 5
- ann_status = 6
- ann_warn = 7
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,)),
+ ('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,)),
)
def __init__(self):
def warn(self, pos, msg):
'''Put a warning message 'msg' at 'pos'.'''
- self.put(pos[0], pos[1], self.out_ann, [self.ann_warn, [msg]])
+ self.put(pos[0], pos[1], self.out_ann, [ANN_WARN, [msg]])
def putp(self, pos, ann, msg):
'''Put an annotation message 'msg' at 'pos'.'''
self.cmd, self.dat, self.min, self.max = c
- if self.cmd in ('STROBE_CMD',):
- self.putp(pos, self.ann_strobe, self.format_command())
+ if self.cmd == 'Strobe':
+ self.putp(pos, ANN_STROBE, self.format_command())
else:
# Don't output anything now, the command is merged with
# the data bytes following it.
def format_command(self):
'''Returns the label for the current command.'''
- if self.cmd == 'SINGLE_READ':
- reg = regs[self.dat] if self.dat in regs else 'unknown register'
- return 'Read'
- if self.cmd == 'BURST_READ':
- reg = regs[self.dat] if self.dat in regs else 'unknown register'
- return 'Burst read'
- if self.cmd == 'SINGLE_WRITE':
- reg = regs[self.dat] if self.dat in regs else 'unknown register'
- return 'Write'
- if self.cmd == 'BURST_WRITE':
- reg = regs[self.dat] if self.dat in regs else 'unknown register'
- return 'Burst write'
- if self.cmd == 'STATUS_READ':
- reg = regs[self.dat] if self.dat in regs else 'unknown register'
- return 'Status read'
- if self.cmd == 'STROBE_CMD':
- reg = strobes[self.dat] if self.dat in strobes else 'unknown strobe'
- return 'STROBE "{}"'.format(reg)
+ if self.cmd in ('Read', 'Burst read', 'Write', 'Burst write', 'Status read'):
+ return self.cmd
+ if self.cmd == 'Strobe':
+ reg = strobes.get(self.dat, 'unknown strobe')
+ return '{} "{}"'.format(self.cmd, reg)
else:
return 'TODO Cmd {}'.format(self.cmd)
addr = b & 0x3F
if (addr < 0x30) or (addr == 0x3E) or (addr == 0x3F):
if (b & 0xC0) == 0x00:
- return ('SINGLE_WRITE', addr, 1, 1)
+ return ('Write', addr, 1, 1)
if (b & 0xC0) == 0x40:
- return ('BURST_WRITE', addr, 1, 99999)
+ return ('Burst write', addr, 1, 99999)
if (b & 0xC0) == 0x80:
- return ('SINGLE_READ', addr, 1, 1)
+ return ('Read', addr, 1, 1)
if (b & 0xC0) == 0xC0:
- return ('BURST_READ', addr, 1, 99999)
+ return ('Burst read', addr, 1, 99999)
else:
self.warn(pos, 'unknown address/command combination')
else:
if (b & 0x40) == 0x00:
- return ('STROBE_CMD', addr, 0, 0)
+ return ('Strobe', addr, 0, 0)
if (b & 0xC0) == 0xC0:
- return ('STATUS_READ', addr, 1, 99999)
+ return ('Status read', addr, 1, 99999)
else:
self.warn(pos, 'unknown address/command combination')
else:
name = regid
- if regid == 'STATUS' and ann == self.ann_status:
+ if regid == 'STATUS' and ann == ANN_STATUS:
label = 'Status'
self.decode_status_reg(pos, ann, data, label)
else:
- if self.cmd in ('SINGLE_WRITE', 'SINGLE_READ', 'STATUS_READ', 'BURST_READ', 'BURST_WRITE'):
+ if self.cmd in ('Write', 'Read', 'Status read', 'Burst read', 'Burst write'):
label = '{}: {}'.format(self.format_command(), name)
else:
label = 'Reg ({}) {}'.format(self.cmd, name)
longtext_state = 'STATE is {}, '.format(status_reg_states[state])
# bits 3:0 --> FIFO_BYTES_AVAILABLE
fifo_bytes = status & 0x0F
- if self.cmd in ('SINGLE_READ', 'STATUS_READ', 'BURST_READ'):
+ if self.cmd in ('Single read', 'Status read', 'Burst read'):
longtext_fifo = '{} bytes available in RX FIFO'.format(fifo_bytes)
else:
longtext_fifo = '{} bytes free in TX FIFO'.format(fifo_bytes)
def finish_command(self, pos):
'''Decodes the remaining data bytes at position 'pos'.'''
- if self.cmd == 'SINGLE_WRITE':
- self.decode_register(pos, self.ann_single_write,
+ if self.cmd == 'Write':
+ self.decode_register(pos, ANN_SINGLE_WRITE,
self.dat, self.mosi_bytes())
- elif self.cmd == 'BURST_WRITE':
- self.decode_register(pos, self.ann_burst_write,
+ elif self.cmd == 'Burst write':
+ self.decode_register(pos, ANN_BURST_WRITE,
self.dat, self.mosi_bytes())
- elif self.cmd == 'SINGLE_READ':
- self.decode_register(pos, self.ann_single_read,
+ elif self.cmd == 'Read':
+ self.decode_register(pos, ANN_SINGLE_READ,
self.dat, self.miso_bytes())
- elif self.cmd == 'BURST_READ':
- self.decode_register(pos, self.ann_burst_read,
+ elif self.cmd == 'Burst read':
+ self.decode_register(pos, ANN_BURST_READ,
self.dat, self.miso_bytes())
- elif self.cmd == 'STROBE_CMD':
- self.decode_register(pos, self.ann_strobe,
+ elif self.cmd == 'Strobe':
+ self.decode_register(pos, ANN_STROBE,
self.dat, self.mosi_bytes())
- elif self.cmd == 'STATUS_READ':
- self.decode_register(pos, self.ann_status_read,
+ elif self.cmd == 'Status read':
+ self.decode_register(pos, ANN_STATUS_READ,
self.dat, self.miso_bytes())
else:
self.warn(pos, 'unhandled command')
# First MOSI byte is always the command.
self.decode_command(pos, mosi)
# First MISO byte is always the status register.
- self.decode_register(pos, self.ann_status, 'STATUS', [miso])
+ self.decode_register(pos, ANN_STATUS, 'STATUS', [miso])
else:
if not self.cmd or len(self.mb) >= self.max:
self.warn(pos, 'excess byte')