sensor

Code listing

"""
A wrapper class, used to provide a common interface to the various sensors and
values to log.
"""
import time
import PID

class Sensor:
    """ 
    An abstract wrapper class for objects with data that can be read from

    Can be subclassed to provide a common interface for different types of
    devices. The :meth:`read` method must therefore be overridden to provide
    a meaningful return value.
    """
    def __init__(self, name):
        self.name = name
        
    def read(self):
        """ Read current data value from :class:`Sensor` object

        :return: The current value measured by the sensor
        :rtype: None
        """
        return None
    
    def reset(self):
        return True
    
class TempSensor(Sensor):
    
    def __init__(self, name, device, precision=1):
        super().__init__(name)
        self.device = device
        self.precision = precision
        
    def read(self):
        return round(self.device.temperature, self.precision)
    
class TimeSensor(Sensor):
    
    def __init__(self, name):
        super().__init__(name)
        self.__startTime = None
        
    @property
    def time_ns(self):
        if self.__startTime:
            return time.monotonic_ns()-self.__startTime
        else:
            return 0.
        
    @property
    def time(self):
        if self.__startTime:
            return round((time.monotonic_ns() - self.__startTime) / 1e9, 3)
        else:
            return 0.
    
    def start(self):
        self.__startTime = time.monotonic_ns()
        return True
        
    def reset(self):
        self.__startTime = None
        return True
        
    def read(self):
        return self.time
    
class PIDSensor(Sensor):
    
    def __init__(self, name, PID):
        super().__init__(name)
        self.PID = PID
        
    def read(self):
        return self.PID.u