]> sigrok.org Git - libsigrokdecode.git/blobdiff - decoders/lm75/lm75.py
srd: lm75: Output min/max/avg temperature in report().
[libsigrokdecode.git] / decoders / lm75 / lm75.py
index 8a0641244306ae4b1f0255f5e49c63857e1d5a41..05ff23156346392da3c5c59d06ed86a31831f4d9 100644 (file)
@@ -75,15 +75,18 @@ class Decoder(srd.Decoder):
         self.databytes = []
         self.mintemp = 0
         self.maxtemp = 0
         self.databytes = []
         self.mintemp = 0
         self.maxtemp = 0
-        self.avgtemp = 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):
 
     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: Output min/max/avg temperature.
-        pass
+        # 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 putx(self, data):
         # Helper for annotations which span exactly one I2C packet.
 
     def putx(self, data):
         # Helper for annotations which span exactly one I2C packet.
@@ -101,7 +104,7 @@ class Decoder(srd.Decoder):
             s = 'Warning: I2C slave 0x%02x not an LM75 compatible sensor.'
             self.putx([4, [s % addr]])
 
             s = 'Warning: I2C slave 0x%02x not an LM75 compatible sensor.'
             self.putx([4, [s % addr]])
 
-    def output_temperature(self, s):
+    def output_temperature(self, s, rw):
         # TODO: Support for resolutions other than 9 bit.
         before, after = self.databytes[0], (self.databytes[1] >> 7) * 5
         celsius = float('%d.%d' % (before, after))
         # TODO: Support for resolutions other than 9 bit.
         before, after = self.databytes[0], (self.databytes[1] >> 7) * 5
         celsius = float('%d.%d' % (before, after))
@@ -109,14 +112,19 @@ class Decoder(srd.Decoder):
         self.putb([0, ['%s: %.1f °C' % (s, celsius)]])
         self.putb([1, ['%s: %.1f °K' % (s, kelvin)]])
 
         self.putb([0, ['%s: %.1f °C' % (s, celsius)]])
         self.putb([1, ['%s: %.1f °K' % (s, kelvin)]])
 
+        # Warn about the temperature register (0x00) being read-only.
+        if s == 'Temperature' and rw == 'WRITE':
+            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
         # Keep some statistics. Can be output in report(), for example.
         if celsius < self.mintemp:
             self.mintemp = celsius
         if celsius > self.maxtemp:
             self.maxtemp = celsius
-        # TODO: avg. temp.
+        self.avgvalues.append(celsius)
 
 
-    def handle_temperature_reg(self, b, s):
+    def handle_temperature_reg(self, b, s, rw):
         # Common helper for the temperature/T_HYST/T_OS registers.
         if len(self.databytes) == 0:
             self.block_start = self.ss
         # Common helper for the temperature/T_HYST/T_OS registers.
         if len(self.databytes) == 0:
             self.block_start = self.ss
@@ -124,14 +132,14 @@ class Decoder(srd.Decoder):
             return
         self.databytes.append(b)
         self.block_end = self.es
             return
         self.databytes.append(b)
         self.block_end = self.es
-        self.output_temperature(s)
+        self.output_temperature(s, rw)
         self.databytes = []
 
         self.databytes = []
 
-    def handle_reg_0x00(self, b):
+    def handle_reg_0x00(self, b, rw):
         # Temperature register (16bits, read-only).
         # Temperature register (16bits, read-only).
-        self.handle_temperature_reg(b, 'Temperature')
+        self.handle_temperature_reg(b, 'Temperature', rw)
 
 
-    def handle_reg_0x01(self, b):
+    def handle_reg_0x01(self, b, rw):
         # Configuration register (8 bits, read/write).
         # TODO: Bit-exact annotation ranges.
 
         # Configuration register (8 bits, read/write).
         # TODO: Bit-exact annotation ranges.
 
@@ -163,17 +171,13 @@ class Decoder(srd.Decoder):
         self.putx([2, [s]])
         self.putx([3, [s2]])
 
         self.putx([2, [s]])
         self.putx([3, [s2]])
 
-    def handle_reg_0x02(self, b):
+    def handle_reg_0x02(self, b, rw):
         # T_HYST register (16 bits, read/write).
         # T_HYST register (16 bits, read/write).
-        self.handle_temperature_reg(b, 'T_HYST trip temperature')
+        self.handle_temperature_reg(b, 'T_HYST trip temperature', rw)
 
 
-    def handle_reg_0x03(self, b):
+    def handle_reg_0x03(self, b, rw):
         # T_OS register (16 bits, read/write).
         # T_OS register (16 bits, read/write).
-        self.handle_temperature_reg(b, 'T_OS trip temperature')
-
-    def handle_reg_write(self, b):
-        # TODO
-        self.putx([0, ['LM75 write: reg 0x%02x = 0x%02x' % (self.reg, b)]])
+        self.handle_temperature_reg(b, 'T_OS trip temperature', rw)
 
     def decode(self, ss, es, data):
         cmd, databyte = data
 
     def decode(self, ss, es, data):
         cmd, databyte = data
@@ -189,24 +193,13 @@ class Decoder(srd.Decoder):
             self.state = 'GET SLAVE ADDR'
         elif self.state == 'GET SLAVE ADDR':
             # Wait for an address read/write operation.
             self.state = 'GET SLAVE ADDR'
         elif self.state == 'GET SLAVE ADDR':
             # Wait for an address read/write operation.
-            if cmd == 'ADDRESS READ':
+            if cmd in ('ADDRESS READ', 'ADDRESS WRITE'):
                 self.warn_upon_invalid_slave(databyte)
                 self.warn_upon_invalid_slave(databyte)
-                self.state = 'READ REGS'
-            elif cmd == 'ADDRESS WRITE':
-                self.state = 'WRITE REGS'
-        elif self.state == 'READ REGS':
-            if cmd == 'DATA READ':
+                self.state = cmd[8:] + ' REGS' # READ REGS / WRITE REGS
+        elif self.state in ('READ REGS', 'WRITE REGS'):
+            if cmd in ('DATA READ', 'DATA WRITE'):
                 handle_reg = getattr(self, 'handle_reg_0x%02x' % self.reg)
                 handle_reg = getattr(self, 'handle_reg_0x%02x' % self.reg)
-                handle_reg(databyte)
-            elif cmd == 'STOP':
-                # TODO: Any output?
-                self.state = 'IDLE'
-            else:
-                # self.putx([0, ['Ignoring: %s (data=%s)' % (cmd, databyte)]])
-                pass
-        elif self.state == 'WRITE REGS':
-            if cmd == 'DATA WRITE':
-                self.handle_reg_write(databyte)
+                handle_reg(databyte, cmd[5:]) # READ / WRITE
             elif cmd == 'STOP':
                 # TODO: Any output?
                 self.state = 'IDLE'
             elif cmd == 'STOP':
                 # TODO: Any output?
                 self.state = 'IDLE'