Change PD options to be a tuple of dictionaries.
[libsigrokdecode.git] / decoders / lm75 / pd.py
index 86d3950b282f125ffa0fd26c73ef845b85a5fbb7..84cc26a01b952fe91aa1944510c8ef53babb9612 100644 (file)
@@ -1,5 +1,5 @@
 ##
-## This file is part of the sigrok project.
+## This file is part of the libsigrokdecode project.
 ##
 ## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
 ##
@@ -18,8 +18,6 @@
 ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
 ##
 
-# National LM75 (and compatibles) temperature sensor protocol decoder
-
 # TODO: Better support for various LM75 compatible devices.
 
 import sigrokdecode as srd
@@ -53,55 +51,46 @@ class Decoder(srd.Decoder):
     probes = []
     optional_probes = [
         {'id': 'os', 'name': 'OS', 'desc': 'Overtemperature shutdown'},
-        {'id': 'a0', 'name': 'A0', 'desc': 'I2C slave address input 0'},
-        {'id': 'a1', 'name': 'A1', 'desc': 'I2C slave address input 1'},
-        {'id': 'a2', 'name': 'A2', 'desc': 'I2C slave address input 2'},
+        {'id': 'a0', 'name': 'A0', 'desc': 'I²C slave address input 0'},
+        {'id': 'a1', 'name': 'A1', 'desc': 'I²C slave address input 1'},
+        {'id': 'a2', 'name': 'A2', 'desc': 'I²C slave address input 2'},
     ]
-    options = {
-        'sensor': ['Sensor type', 'lm75'],
-        'resolution': ['Resolution', 9], # 9-12 bit, sensor/config dependent
-    }
+    options = (
+        {'id': 'sensor', 'desc': 'Sensor type', 'default': 'lm75'},
+        {'id': 'resolution', 'desc': 'Resolution', 'default': 9,
+            'values': (9, 10, 11, 12)},
+    )
     annotations = [
-        ['Celsius', 'Temperature in degrees Celsius'],
-        ['Kelvin', 'Temperature in Kelvin'],
-        ['Text (verbose)', 'Human-readable text (verbose)'],
-        ['Text', 'Human-readable text'],
-        ['Warnings', 'Human-readable warnings'],
+        ['celsius', 'Temperature in degrees Celsius'],
+        ['kelvin', 'Temperature in Kelvin'],
+        ['text-verbose', 'Human-readable text (verbose)'],
+        ['text', 'Human-readable text'],
+        ['warnings', 'Human-readable warnings'],
     ]
 
     def __init__(self, **kwargs):
         self.state = 'IDLE'
         self.reg = 0x00 # Currently selected register
         self.databytes = []
-        self.mintemp = 0
-        self.maxtemp = 0
-        self.avgvalues = []
-
-    def start(self, metadata):
-        # self.out_proto = self.add(srd.OUTPUT_PROTO, 'lm75')
-        self.out_ann = self.add(srd.OUTPUT_ANN, 'lm75')
 
-    def report(self):
-        # TODO: print() or self.put() or return xyz, or... ?
-        avg = sum(self.avgvalues) / len(self.avgvalues)
-        temperatures = (self.mintemp, self.maxtemp, avg)
-        # TODO: Configurable report() output, e.g. for Kelvin.
-        return 'Min/max/avg temperature: %f/%f/%f °C' % temperatures
+    def start(self):
+        # self.out_python = self.register(srd.OUTPUT_PYTHON)
+        self.out_ann = self.register(srd.OUTPUT_ANN)
 
     def putx(self, data):
-        # Helper for annotations which span exactly one I2C packet.
+        # Helper for annotations which span exactly one I²C packet.
         self.put(self.ss, self.es, self.out_ann, data)
 
     def putb(self, data):
-        # Helper for annotations which span a block of I2C packets.
+        # Helper for annotations which span a block of I²C packets.
         self.put(self.block_start, self.block_end, self.out_ann, data)
 
     def warn_upon_invalid_slave(self, addr):
-        # LM75 and compatible devices have a 7-bit I2C slave address where
+        # LM75 and compatible devices have a 7-bit I²C slave address where
         # the 4 MSBs are fixed to 1001, and the 3 LSBs are configurable.
         # Thus, valid slave addresses (1001xxx) range from 0x48 to 0x4f.
         if addr not in range(0x48, 0x4f + 1):
-            s = 'Warning: I2C slave 0x%02x not an LM75 compatible sensor.'
+            s = 'Warning: I²C slave 0x%02x not an LM75 compatible sensor.'
             self.putx([4, [s % addr]])
 
     def output_temperature(self, s, rw):
@@ -117,13 +106,6 @@ class Decoder(srd.Decoder):
             s = 'Warning: The temperature register is read-only!'
             self.putb([4, [s]])
 
-        # Keep some statistics. Can be output in report(), for example.
-        if celsius < self.mintemp:
-            self.mintemp = celsius
-        if celsius > self.maxtemp:
-            self.maxtemp = celsius
-        self.avgvalues.append(celsius)
-
     def handle_temperature_reg(self, b, s, rw):
         # Common helper for the temperature/T_HYST/T_OS registers.
         if len(self.databytes) == 0:
@@ -182,12 +164,12 @@ class Decoder(srd.Decoder):
     def decode(self, ss, es, data):
         cmd, databyte = data
 
-        # Store the start/end samples of this I2C packet.
+        # Store the start/end samples of this I²C packet.
         self.ss, self.es = ss, es
 
         # State machine.
         if self.state == 'IDLE':
-            # Wait for an I2C START condition.
+            # Wait for an I²C START condition.
             if cmd != 'START':
                 return
             self.state = 'GET SLAVE ADDR'