license = 'gplv2+'
inputs = ['logic']
outputs = ['ir_rc5']
- probes = [
+ channels = (
{'id': 'ir', 'name': 'IR', 'desc': 'IR data line'},
- ]
- optional_probes = []
- options = {
- 'polarity': ['Polarity', 'active-low'],
- 'protocol': ['Protocol type', 'standard'],
- }
- annotations = [
- ['bit', 'Bit'],
- ['startbit1', 'Startbit 1'],
- ['startbit2', 'Startbit 2'],
- ['togglebit-0', 'Toggle bit 0'],
- ['togglebit-1', 'Toggle bit 1'],
- ['address', 'Address'],
- ['command', 'Command'],
- ]
+ )
+ options = (
+ {'id': 'polarity', 'desc': 'Polarity', 'default': 'active-low',
+ 'values': ('active-low', 'active-high')},
+ {'id': 'protocol', 'desc': 'Protocol type', 'default': 'standard',
+ 'values': ('standard', 'extended')},
+ )
+ annotations = (
+ ('bit', 'Bit'),
+ ('startbit1', 'Startbit 1'),
+ ('startbit2', 'Startbit 2'),
+ ('togglebit-0', 'Toggle bit 0'),
+ ('togglebit-1', 'Toggle bit 1'),
+ ('address', 'Address'),
+ ('command', 'Command'),
+ )
annotation_rows = (
('bits', 'Bits', (0,)),
('fields', 'Fields', (1, 2, 3, 4, 5, 6)),
elif distance in range(s - margin, s + margin + 1):
return 's'
else:
- raise Exception('Invalid edge distance: %d' % distance)
+ return 'e' # Error, invalid edge distance.
+
+ def reset_decoder_state(self):
+ self.edges, self.bits, self.bits_ss_es = [], [], []
+ self.state = 'IDLE'
def decode(self, ss, es, data):
if self.samplerate is None:
self.old_ir = self.ir
continue
edge = self.edge_type()
+ if edge == 'e':
+ self.reset_decoder_state() # Reset state machine upon errors.
+ continue
if self.state == 'MID1':
self.state = 'START1' if edge == 's' else 'MID0'
bit = None if edge == 's' else 0
if bit != None:
self.bits.append([self.samplenum, bit])
- if len(self.bits) == 14 + 1:
+ if len(self.bits) == 14:
self.handle_bits()
- self.edges, self.bits, self.bits_ss_es = [], [], []
- self.state = 'IDLE'
+ self.reset_decoder_state()
self.old_ir = self.ir