summaryrefslogtreecommitdiff
path: root/decoders/onewire_network
diff options
context:
space:
mode:
authorUwe Hermann <uwe@hermann-uwe.de>2012-07-19 21:40:40 +0200
committerUwe Hermann <uwe@hermann-uwe.de>2012-07-21 21:47:54 +0200
commit48b5974694d0a587f3d7bc9c58a2cc5bf917f644 (patch)
tree880d11e9d4b592b6e3ae9d38c1770738585e9989 /decoders/onewire_network
parent6188e4e41ef0d9468a1b9f9bad5637ca862d73df (diff)
downloadlibsigrokdecode-48b5974694d0a587f3d7bc9c58a2cc5bf917f644.tar.gz
libsigrokdecode-48b5974694d0a587f3d7bc9c58a2cc5bf917f644.zip
srd: onewire_link/network: Reduce nesting level.
Also, some additional cleanups.
Diffstat (limited to 'decoders/onewire_network')
-rw-r--r--decoders/onewire_network/onewire_network.py108
1 files changed, 59 insertions, 49 deletions
diff --git a/decoders/onewire_network/onewire_network.py b/decoders/onewire_network/onewire_network.py
index a4f6f4a..f215344 100644
--- a/decoders/onewire_network/onewire_network.py
+++ b/decoders/onewire_network/onewire_network.py
@@ -52,8 +52,8 @@ class Decoder(srd.Decoder):
def __init__(self, **kwargs):
# Event timing variables
- self.net_beg = 0
- self.net_end = 0
+ self.beg = 0
+ self.end = 0
# Network layer variables
self.state = 'COMMAND'
self.bit_cnt = 0
@@ -61,7 +61,7 @@ class Decoder(srd.Decoder):
self.data_p = 0x0
self.data_n = 0x0
self.data = 0x0
- self.net_rom = 0x0000000000000000
+ self.rom = 0x0000000000000000
def start(self, metadata):
self.out_proto = self.add(srd.OUTPUT_PROTO, 'onewire_network')
@@ -72,11 +72,11 @@ class Decoder(srd.Decoder):
def putx(self, data):
# Helper function for most annotations.
- self.put(self.net_beg, self.net_end, self.out_ann, data)
+ self.put(self.beg, self.end, self.out_ann, data)
def puty(self, data):
# Helper function for most protocol packets.
- self.put(self.net_beg, self.net_end, self.out_proto, data)
+ self.put(self.beg, self.end, self.out_proto, data)
def decode(self, ss, es, data):
code, val = data
@@ -89,68 +89,78 @@ class Decoder(srd.Decoder):
[0, ['RESET/PRESENCE: %s' % ('True' if val else 'False')]])
self.put(ss, es, self.out_proto, ['RESET/PRESENCE', val])
self.state = 'COMMAND'
- elif code == 'BIT':
- if self.state == 'COMMAND':
- # Receiving and decoding a ROM command.
- if self.onewire_collect(8, val, ss, es):
- if self.data in command:
- self.putx([0, ['ROM COMMAND: 0x%02x \'%s\''
- % (self.data, command[self.data][0])]])
- self.state = command[self.data][1]
- else:
- self.putx([0, ['ROM COMMAND: 0x%02x \'%s\''
- % (self.data, 'UNRECOGNIZED')]])
- self.state = 'COMMAND ERROR'
- elif self.state == 'GET ROM':
- # A 64 bit device address is selected.
- # Family code (1B) + serial number (6B) + CRC (1B)
- if self.onewire_collect(64, val, ss, es):
- self.net_rom = self.data & 0xffffffffffffffff
- self.putx([0, ['ROM: 0x%016x' % self.net_rom]])
- self.puty(['ROM', self.net_rom])
- self.state = 'TRANSPORT'
- elif self.state == 'SEARCH ROM':
- # A 64 bit device address is searched for.
- # Family code (1B) + serial number (6B) + CRC (1B)
- if self.onewire_search(64, val, ss, es):
- self.net_rom = self.data & 0xffffffffffffffff
- self.putx([0, ['ROM: 0x%016x' % self.net_rom]])
- self.puty(['ROM', self.net_rom])
- self.state = 'TRANSPORT'
- elif self.state == 'TRANSPORT':
- # The transport layer is handled in byte sized units.
- if self.onewire_collect(8, val, ss, es):
- self.putx([0, ['DATA: 0x%02x' % self.data]])
- self.puty(['DATA', self.data])
- elif self.state == 'COMMAND ERROR':
- # Since the command is not recognized, print raw data.
- if self.onewire_collect(8, val, ss, es):
- self.putx([0, ['ROM ERROR DATA: 0x%02x' % self.data]])
+ return
+
+ # For now we're only interested in 'RESET/PRESENCE' and 'BIT' packets.
+ if code != 'BIT':
+ return
+
+ if self.state == 'COMMAND':
+ # Receiving and decoding a ROM command.
+ if self.onewire_collect(8, val, ss, es) == 0:
+ return
+ if self.data in command:
+ self.putx([0, ['ROM COMMAND: 0x%02x \'%s\''
+ % (self.data, command[self.data][0])]])
+ self.state = command[self.data][1]
else:
- raise Exception('Invalid state: %s' % self.state)
+ self.putx([0, ['ROM COMMAND: 0x%02x \'%s\''
+ % (self.data, 'UNRECOGNIZED')]])
+ self.state = 'COMMAND ERROR'
+ elif self.state == 'GET ROM':
+ # A 64 bit device address is selected.
+ # Family code (1B) + serial number (6B) + CRC (1B)
+ if self.onewire_collect(64, val, ss, es) == 0:
+ return
+ self.rom = self.data & 0xffffffffffffffff
+ self.putx([0, ['ROM: 0x%016x' % self.rom]])
+ self.puty(['ROM', self.rom])
+ self.state = 'TRANSPORT'
+ elif self.state == 'SEARCH ROM':
+ # A 64 bit device address is searched for.
+ # Family code (1B) + serial number (6B) + CRC (1B)
+ if self.onewire_search(64, val, ss, es) == 0:
+ return
+ self.rom = self.data & 0xffffffffffffffff
+ self.putx([0, ['ROM: 0x%016x' % self.rom]])
+ self.puty(['ROM', self.rom])
+ self.state = 'TRANSPORT'
+ elif self.state == 'TRANSPORT':
+ # The transport layer is handled in byte sized units.
+ if self.onewire_collect(8, val, ss, es) == 0:
+ return
+ self.putx([0, ['DATA: 0x%02x' % self.data]])
+ self.puty(['DATA', self.data])
+ elif self.state == 'COMMAND ERROR':
+ # Since the command is not recognized, print raw data.
+ if self.onewire_collect(8, val, ss, es) == 0:
+ return
+ self.putx([0, ['ROM ERROR DATA: 0x%02x' % self.data]])
+ else:
+ raise Exception('Invalid state: %s' % self.state)
- # Link/Network layer data collector.
+ # Data collector.
def onewire_collect(self, length, val, ss, es):
# Storing the sample this sequence begins with.
if self.bit_cnt == 1:
- self.net_beg = ss
+ self.beg = ss
self.data = self.data & ~(1 << self.bit_cnt) | (val << self.bit_cnt)
self.bit_cnt += 1
# Storing the sample this sequence ends with.
# In case the full length of the sequence is received, return 1.
if self.bit_cnt == length:
- self.net_end = es
+ self.end = es
self.data = self.data & ((1 << length) - 1)
self.bit_cnt = 0
return 1
else:
return 0
- # Link/Network layer search collector.
+ # Search collector.
def onewire_search(self, length, val, ss, es):
# Storing the sample this sequence begins with.
if (self.bit_cnt == 0) and (self.search == 'P'):
- self.net_beg = ss
+ self.beg = ss
if self.search == 'P':
# Master receives an original address bit.
@@ -171,7 +181,7 @@ class Decoder(srd.Decoder):
# Storing the sample this sequence ends with.
# In case the full length of the sequence is received, return 1.
if self.bit_cnt == length:
- self.net_end = es
+ self.end = es
self.data_p = self.data_p & ((1 << length) - 1)
self.data_n = self.data_n & ((1 << length) - 1)
self.data = self.data & ((1 << length) - 1)