## along with this program; if not, see <http://www.gnu.org/licenses/>.
##
-# Generic I²C filtering protocol decoder
-
# TODO: Support for filtering out multiple slave/direction pairs?
import sigrokdecode as srd
class Decoder(srd.Decoder):
- api_version = 1
+ api_version = 3
id = 'i2cfilter'
name = 'I²C filter'
longname = 'I²C filter'
license = 'gplv3+'
inputs = ['i2c']
outputs = ['i2c']
- probes = []
- optional_probes = []
- options = {
- 'address': ['Address to filter out of the I²C stream', 0],
- 'direction': ['Direction to filter (read/write/both)', 'both']
- }
- annotations = []
+ options = (
+ {'id': 'address', 'desc': 'Address to filter out of the I²C stream',
+ 'default': 0},
+ {'id': 'direction', 'desc': 'Direction to filter', 'default': 'both',
+ 'values': ('read', 'write', 'both')}
+ )
+
+ def __init__(self):
+ self.reset()
- def __init__(self, **kwargs):
- self.state = None
+ def reset(self):
self.curslave = -1
self.curdirection = None
self.packets = [] # Local cache of I²C packets
def start(self):
- self.out_proto = self.register(srd.OUTPUT_PYTHON, proto_id='i2c')
+ self.out_python = self.register(srd.OUTPUT_PYTHON, proto_id='i2c')
if self.options['address'] not in range(0, 127 + 1):
raise Exception('Invalid slave (must be 0..127).')
- if self.options['direction'] not in ('both', 'read', 'write'):
- raise Exception('Invalid direction (valid: read/write/both).')
# Grab I²C packets into a local cache, until an I²C STOP condition
# packet comes along. At some point before that STOP condition, there
# TODO: START->STOP chunks with both read and write (Repeat START)
# Otherwise, send out the whole chunk of I²C packets.
for p in self.packets:
- self.put(p[0], p[1], self.out_proto, p[2])
+ self.put(p[0], p[1], self.out_python, p[2])
self.packets = []
else:
pass # Do nothing, only add the I²C packet to our cache.
-