Source code for socs.agents.stimulator_thermometer.drivers

#!/usr/bin/env python3
"""Module to handle thermometers connected to KR260 via SPI bus.
"""

from pathlib import Path


[docs] class StimThermoError(Exception): """Exception raised by stimulator thermometer."""
[docs] class Iio: """Generic IIO driver. Parameters ---------- path : str or pathlib.Path Path to the iio device directory. """ def __init__(self, path): self._path = Path(path)
[docs] def read(self, name): """Read the file in the iio directory. Parameters ---------- name : str File name in IIO directory. Returns ------- data : str Contents of the file. """ with open(self._path.joinpath(name), 'r') as fd: return fd.readline().strip()
@property def name(self): """Read name of the iio device. Returns ------- name : str Name of the device. """ return self.read('name')
[docs] class Max31856(Iio): """Class to read MAX31856 via IIO interface. Parameters ---------- path : str or pathlib.Path Path to the iio device directory. """ @property def thermocouple_type(self): """Get thermocouple type. Returns ------- type : str Thermocouple type in string. """ return self.read('in_temp_thermocouple_type')
[docs] def get_temp_raw(self): """Get raw temperature. Returns ------- temp_raw : int Raw temperature. """ return int(self.read('in_temp_raw'))
[docs] def get_temp(self): """Get temperature in degrees Celsius. Returns ------- temp : float Temperature in degrees Celsius. """ return self.get_temp_raw() / 2**7
[docs] def get_temp_ambient_raw(self): """Get raw ambient temperature. Returns ------- temp_ambient_raw : int Raw ambient temperature. """ return int(self.read('in_temp_ambient_raw'))
[docs] def get_temp_ambient(self): """Get ambient temperature in degrees Celsius. Returns ------- temp_ambient : float Ambient temperature in degrees Celsius. """ return self.get_temp_ambient_raw() / 2**6
[docs] class Max31865(Iio): """Class to read MAX31865 via IIO interface. Parameters ---------- path : str or pathlib.Path Path to the iio device directory. """ R_REF = 4300 R_0 = 1000 ALPHA = 0.0039
[docs] def get_temp_raw(self): """Get raw temperature. Returns ------- temp_raw : int Raw temperature. """ return int(self.read('in_temp_raw'))
[docs] def get_temp(self): """Get temperature in degrees Celsius. Returns ------- temp : float Temperature in degrees Celsius. """ r_rtd = self.R_REF * self.get_temp_raw() / 32768 return (r_rtd / self.R_0 - 1) / self.ALPHA
def from_spi_node_path(path): """Return device class from path to the SPI directory. Paramter -------- path : str or pathlib.Path Path to the SPI node directory like /sys/bus/spi/devices/spi3.0/ Returns ------- dev : Max31865 or Max31856 Device class. """ path_iio = list(Path(path).glob('iio*')) if len(path_iio) != 1: raise StimThermoError(f'IIO definition not found: {path_iio}') dev_iio = Iio(path_iio[0]) name_dev = dev_iio.name if name_dev == 'max31856': return Max31856(path_iio[0]) elif name_dev == 'max31865': return Max31865(path_iio[0]) else: raise StimThermoError('Thermometer type not supported.') def main(): """ Main function """ paths = ['/sys/bus/spi/devices/spi3.0/', '/sys/bus/spi/devices/spi3.1/', '/sys/bus/spi/devices/spi3.3/', '/sys/bus/spi/devices/spi3.4/'] thermometers = [from_spi_node_path(path) for path in paths] for dev in thermometers: print(dev.get_temp()) if isinstance(dev, Max31856): print(dev.get_temp_ambient()) if __name__ == '__main__': main()