Hi I have added support for extended addresses to the ir_nec decoder.
I found that the error detection code in the decoder did not detect all error conditions. The check should be that the address byte is followed by its complement, and similary for the data byte. The first patch ir_nec_errordetect.patch fixes this bug. The second patch ir_nec_extended.patch adds support for extended addresses where the second byte is used as part of the error check instead of for error detection. The data file is from a NAD remote and contains one command with extended addressing followed by 3 repeat codes. Søren Wedel Nielsen
diff --git a/decoders/ir_nec/pd.py b/decoders/ir_nec/pd.py
index bb52420..2d5f781 100644
--- a/decoders/ir_nec/pd.py
+++ b/decoders/ir_nec/pd.py
@@ -140,7 +140,8 @@ def handle_bit(self, tick):
self.ss_bit = self.samplenum
def data_ok(self):
- ret, name = (self.data >> 8) & (self.data & 0xff), self.state.title()
+ ret = (self.data >> 8) ^ (self.data & 0xff) == 0xff
+ name = self.state.title()
if self.count == 8:
if self.state == 'ADDRESS':
self.addr = self.data
@@ -149,13 +150,13 @@ def data_ok(self):
self.putd(self.data)
self.ss_start = self.samplenum
return True
- if ret == 0:
+ if ret:
self.putd(self.data >> 8)
else:
self.putx([12, ['%s error: 0x%04X' % (name, self.data)]])
self.data = self.count = 0
self.ss_bit = self.ss_start = self.samplenum
- return ret == 0
+ return ret
def decode(self):
if not self.samplerate:
diff --git a/decoders/ir_nec/pd.py b/decoders/ir_nec/pd.py
index 2d5f781..5212c4e 100644
--- a/decoders/ir_nec/pd.py
+++ b/decoders/ir_nec/pd.py
@@ -19,6 +19,7 @@
import sigrokdecode as srd
from .lists import *
+import struct
class SamplerateError(Exception):
pass
@@ -40,6 +41,8 @@ class Decoder(srd.Decoder):
{'id': 'polarity', 'desc': 'Polarity', 'default': 'active-low',
'values': ('active-low', 'active-high')},
{'id': 'cd_freq', 'desc': 'Carrier Frequency', 'default': 0},
+ {'id': 'protocol', 'desc': 'Protocol type', 'default': 'standard',
+ 'values': ('standard', 'extended')},
)
annotations = (
('bit', 'Bit'),
@@ -140,8 +143,14 @@ def handle_bit(self, tick):
self.ss_bit = self.samplenum
def data_ok(self):
- ret = (self.data >> 8) ^ (self.data & 0xff) == 0xff
- name = self.state.title()
+ if self.options['protocol'] == 'extended' and self.state == 'ADDRESS':
+ ret, name = True, self.state.title
+ # Little endian to native byte order
+ data, = struct.unpack('<H',struct.pack('H',self.data))
+ else:
+ data = self.data >> 8
+ ret = data ^ (self.data & 0xff) == 0xff
+ name = self.state.title()
if self.count == 8:
if self.state == 'ADDRESS':
self.addr = self.data
@@ -151,7 +160,7 @@ def data_ok(self):
self.ss_start = self.samplenum
return True
if ret:
- self.putd(self.data >> 8)
+ self.putd(data)
else:
self.putx([12, ['%s error: 0x%04X' % (name, self.data)]])
self.data = self.count = 0
@@ -216,8 +225,10 @@ def decode(self):
self.ss_bit = self.ss_start = self.samplenum
elif self.state == 'ADDRESS':
self.handle_bit(b)
- if self.count == 8:
+ if self.options['protocol'] == 'standard' and self.count == 8:
self.state = 'ADDRESS#' if self.data_ok() else 'IDLE'
+ if self.options['protocol'] == 'extended' and self.count == 16:
+ self.state = 'COMMAND' if self.data_ok() else 'IDLE'
elif self.state == 'ADDRESS#':
self.handle_bit(b)
if self.count == 16:
nec_ext_cmd_3repeat.sr
Description: Zip archive
_______________________________________________ sigrok-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/sigrok-devel

