From: Uwe Hermann Date: Thu, 26 Jan 2012 22:48:11 +0000 (+0100) Subject: srd: Melexis MLX90614 Infrared Thermometer decoder. X-Git-Tag: libsigrokdecode-0.1.0~93 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=bc1385a6d999c0011050b1cbd275879a928f4252;p=libsigrokdecode.git srd: Melexis MLX90614 Infrared Thermometer decoder. --- diff --git a/configure.ac b/configure.ac index c80294a..fa6b97c 100644 --- a/configure.ac +++ b/configure.ac @@ -155,6 +155,7 @@ AC_CONFIG_FILES([Makefile decoders/ebr30a_i2c_demux/Makefile decoders/i2c/Makefile decoders/i2cdemux/Makefile + decoders/mlx90614/Makefile decoders/mx25lxx05d/Makefile decoders/nunchuk/Makefile decoders/pan1321/Makefile diff --git a/decoders/Makefile.am b/decoders/Makefile.am index 0798fb0..c53436b 100644 --- a/decoders/Makefile.am +++ b/decoders/Makefile.am @@ -25,6 +25,7 @@ SUBDIRS = \ ebr30a_i2c_demux \ i2c \ i2cdemux \ + mlx90614 \ mx25lxx05d \ nunchuk \ pan1321 \ diff --git a/decoders/mlx90614/Makefile.am b/decoders/mlx90614/Makefile.am new file mode 100644 index 0000000..f14874f --- /dev/null +++ b/decoders/mlx90614/Makefile.am @@ -0,0 +1,26 @@ +## +## This file is part of the sigrok project. +## +## Copyright (C) 2012 Uwe Hermann +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +## + +pkgdatadir = $(DECODERS_DIR)/mlx90614 + +dist_pkgdata_DATA = __init__.py mlx90614.py + +CLEANFILES = *.pyc + diff --git a/decoders/mlx90614/__init__.py b/decoders/mlx90614/__init__.py new file mode 100644 index 0000000..fd62251 --- /dev/null +++ b/decoders/mlx90614/__init__.py @@ -0,0 +1,22 @@ +## +## This file is part of the sigrok project. +## +## Copyright (C) 2012 Uwe Hermann +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +## + +from .mlx90614 import * + diff --git a/decoders/mlx90614/mlx90614.py b/decoders/mlx90614/mlx90614.py new file mode 100644 index 0000000..fa1621c --- /dev/null +++ b/decoders/mlx90614/mlx90614.py @@ -0,0 +1,88 @@ +## +## This file is part of the sigrok project. +## +## Copyright (C) 2012 Uwe Hermann +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +## + +# +# Melexis MLX90614 Infrared Thermometer protocol decoder +# + +import sigrokdecode as srd + +class Decoder(srd.Decoder): + api_version = 1 + id = 'mlx90614' + name = 'MLX90614' + longname = 'Melexis MLX90614' + desc = 'TODO.' + longdesc = 'TODO.' + license = 'gplv2+' + inputs = ['i2c'] + outputs = ['mlx90614'] + probes = [] + extra_probes = [] + options = {} + annotations = [ + ['Celsius', 'Temperature in degrees Celsius'], + ['Kelvin', 'Temperature in degrees Kelvin'], + ] + + def __init__(self, **kwargs): + self.state = 'IGNORE START REPEAT' + self.data = [] + + def start(self, metadata): + # self.out_proto = self.add(srd.OUTPUT_PROTO, 'mlx90614') + self.out_ann = self.add(srd.OUTPUT_ANN, 'mlx90614') + + def report(self): + pass + + def putx(self, data): + self.put(self.ss, self.es, self.out_ann, data) + + # Quick hack implementation! This needs to be improved a lot! + def decode(self, ss, es, data): + cmd, databyte, ack = data + + # State machine. + if self.state == 'IGNORE START REPEAT': + if cmd != 'START REPEAT': + return + self.state = 'IGNORE ADDRESS WRITE' + elif self.state == 'IGNORE ADDRESS WRITE': + if cmd != 'ADDRESS WRITE': + return + self.state = 'GET TEMPERATURE' + elif self.state == 'GET TEMPERATURE': + if len(self.data) == 0: + self.data += [databyte] + self.ss = ss + elif len(self.data) == 1: + self.data += [databyte] + self.es = es + else: + kelvin = (self.data[0] | (self.data[1] << 8)) * 0.02 + celsius = kelvin - 273.15 + self.putx([0, ['Temperature: %d °C' % celsius]]) + self.putx([1, ['Temperature: %d °K' % kelvin]]) + self.state = 'IGNORE START REPEAT' + self.data = [] + else: + raise Exception('Invalid state: %d' % self.state) +