From bc1385a6d999c0011050b1cbd275879a928f4252 Mon Sep 17 00:00:00 2001 From: Uwe Hermann Date: Thu, 26 Jan 2012 23:48:11 +0100 Subject: srd: Melexis MLX90614 Infrared Thermometer decoder. --- decoders/mlx90614/Makefile.am | 26 +++++++++++++ decoders/mlx90614/__init__.py | 22 +++++++++++ decoders/mlx90614/mlx90614.py | 88 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 136 insertions(+) create mode 100644 decoders/mlx90614/Makefile.am create mode 100644 decoders/mlx90614/__init__.py create mode 100644 decoders/mlx90614/mlx90614.py (limited to 'decoders/mlx90614') 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) + -- cgit v1.2.3-70-g09d2