]> sigrok.org Git - libsigrokdecode.git/blobdiff - decoders/pan1321/pan1321.py
srd: pan1321: Output correct start/end sample values.
[libsigrokdecode.git] / decoders / pan1321 / pan1321.py
index 55676ce55f95b005d0c67b888d301afe71eb4227..670a48e5ea2f9978b6b501dfdfa60a60220b112e 100644 (file)
 ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
 ##
 
-#
 # Panasonic PAN1321 Bluetooth module protocol decoder
-#
-# TODO
-#
 
 import sigrokdecode as srd
 
-# Annotation feed formats
-ANN_ASCII = 0
-
-# UART 'data' packet type.
-T_DATA = 1
-
 # ...
 RX = 0
 TX = 1
 
 class Decoder(srd.Decoder):
+    api_version = 1
     id = 'pan1321'
     name = 'PAN1321'
     longname = 'Panasonic PAN1321'
-    desc = 'TODO.'
-    longdesc = 'TODO.'
+    desc = 'Bluetooth RF module with Serial Port Profile (SPP).'
     license = 'gplv2+'
     inputs = ['uart']
     outputs = ['pan1321']
     probes = []
+    optional_probes = []
     options = {}
     annotations = [
-        ['ASCII', 'TODO: description'],
+        ['Text', 'Human-readable text'],
     ]
 
     def __init__(self, **kwargs):
         self.cmd = ['', '']
+        self.ss_block = None
 
     def start(self, metadata):
         # self.out_proto = self.add(srd.OUTPUT_PROTO, 'pan1321')
@@ -61,43 +53,43 @@ class Decoder(srd.Decoder):
     def report(self):
         pass
 
-    def handle_host_command(self, ss, es, rxtx, s):
+    def putx(self, data):
+        self.put(self.ss_block, self.es_block, self.out_ann, data)
+
+    def handle_host_command(self, rxtx, s):
         if s.startswith('AT+JSEC'):
-            pin = s[s.find('\r\n') - 4:len(s) - 2]
-            self.put(ss, es, self.out_ann,
-                     [ANN_ASCII, ['Host set the Bluetooth PIN to ' + pin]])
+            pin = s[-4:]
+            self.putx([0, ['Host set the Bluetooth PIN to ' + pin]])
         elif s.startswith('AT+JSLN'):
-            name = s[s.find(',') + 1:-2]
-            self.put(ss, es, self.out_ann,
-                     [ANN_ASCII, ['Host set the Bluetooth name to ' + name]])
+            name = s[s.find(',') + 1:]
+            self.putx([0, ['Host set the Bluetooth name to ' + name]])
         else:
-            self.put(ss, es, self.out_ann,
-                     [ANN_ASCII, ['Host sent unsupported command']])
+            self.putx([0, ['Host sent unsupported command: %s' % s]])
         self.cmd[rxtx] = ''
 
-    def handle_device_reply(self, ss, es, rxtx, s):
-        if s == 'ROK\r\n':
-            self.put(ss, es, self.out_ann,
-                     [ANN_ASCII, ['Device initialized correctly']])
-        elif s == 'OK\r\n':
-            self.put(ss, es, self.out_ann,
-                     [ANN_ASCII, ['Device acknowledged last command']])
+    def handle_device_reply(self, rxtx, s):
+        if s == 'ROK':
+            self.putx([0, ['Device initialized correctly']])
+        elif s == 'OK':
+            self.putx([0, ['Device acknowledged last command']])
         elif s.startswith('ERR'):
             error = s[s.find('=') + 1:]
-            self.put(ss, es, self.out_ann,
-                     [ANN_ASCII, ['Device sent error code ' + error]])
+            self.putx([0, ['Device sent error code ' + error]])
         else:
-            self.put(ss, es, self.out_ann,
-                     [ANN_ASCII, ['Device sent an unknown reply']])
+            self.putx([0, ['Device sent an unknown reply: %s' % s]])
         self.cmd[rxtx] = ''
 
     def decode(self, ss, es, data):
         ptype, rxtx, pdata = data
 
         # For now, ignore all UART packets except the actual data packets.
-        if ptype != T_DATA:
+        if ptype != 'DATA':
             return
 
+        # If this is the start of a command/reply, remember the start sample.
+        if self.cmd[rxtx] == '':
+            self.ss_block = ss
+
         # Append a new (ASCII) byte to the currently built/parsed command.
         self.cmd[rxtx] += chr(pdata)
 
@@ -106,10 +98,13 @@ class Decoder(srd.Decoder):
             return
 
         # Handle host commands and device replies.
+        # We remove trailing \r\n from the strings before handling them.
         if rxtx == RX:
-            self.handle_device_reply(ss, es, rxtx, self.cmd[rxtx])
+            self.es_block = es
+            self.handle_device_reply(rxtx, self.cmd[rxtx][:-2])
         elif rxtx == TX:
-            self.handle_host_command(ss, es, rxtx, self.cmd[rxtx])
+            self.es_block = es
+            self.handle_host_command(rxtx, self.cmd[rxtx][:-2])
         else:
-            pass # TODO: Error.
+            raise Exception('Invalid rxtx value: %d' % rxtx)