Source code for pydevmgr_elt.devices.sensor

from pydevmgr_elt.devices.sensor.stat import SensorStat as Stat
from pydevmgr_elt.devices.sensor.cfg  import SensorCfg as Cfg
from pydevmgr_elt.devices.sensor.rpcs import SensorRpcs as Rpcs


from pydevmgr_elt.devices.sensor.aiChannels import AiChannels  
from pydevmgr_elt.devices.sensor.aoChannels import AoChannels  
from pydevmgr_elt.devices.sensor.diChannels import DiChannels  
from pydevmgr_elt.devices.sensor.doChannels import DoChannels  


from pydevmgr_elt.base import EltDevice
from pydevmgr_core import record_class, BaseNodeAlias1
from typing import Optional

Base = EltDevice


class SensorCtrlConfig(Base.Config.CtrlConfig):
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # Data Structure (on top of CtrlConfig)
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    timeout:          int  = 2000 

    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
class SensorConfig(Base.Config):
    CtrlConfig = SensorCtrlConfig
    
    Cfg = Cfg.Config
    Stat = Stat.Config
    Rpcs = Rpcs.Config

    AiChannels = AiChannels.Config
    AoChannels = AoChannels.Config
    DiChannels = DiChannels.Config
    DoChannels = DoChannels.Config
    
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # Data Structure (redefine the ctrl_config)
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    type: str = "Sensor"
    ctrl_config : CtrlConfig= CtrlConfig()
    
    cfg: Cfg = Cfg()
    stat: Stat = Stat()
    rpcs: Rpcs = Rpcs()
    
    aiChannels: AiChannels = AiChannels()
    aoChannels: AoChannels = AoChannels()
    diChannels: DiChannels = DiChannels()
    doChannels: DoChannels = DoChannels()

    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


@record_class
class AiChannel(BaseNodeAlias1):
    """ NodeAlias1 to a analog input node iddentified from a number 

    Config: 
        channel_number (int)

    Example:
    
    ::

        from pydevmgr_elt import Sensor

        
        class MySensor(Sensor):
            class Config(Sensor.Config):
                temperature  = Sensor.AiChannel.Config(channel_number=3)
        
        my_sensor = MySensor()
        assert my_sensor.temperature.get() == my_sensor.aiChannels.ai3.get()
            
    """

    class Config(BaseNodeAlias1.Config):
        type = "AiChannel"
        channel_number: int = 0
    @classmethod
    def _new_source_node(cls, parent, config):
        return getattr(parent.aiChannels, f"ai{config.channel_number}")

@record_class
class AoChannel(BaseNodeAlias1):
    """ NodeAlias1 to a analog output node iddentified from a number 

    Config: 
        channel_number (int)

    Example:
    
    ::

        from pydevmgr_elt import Sensor

        
        class MySensor(Sensor):
            class Config(Sensor.Config):
                intensity  = Sensor.AoChannel.Config(channel_number=3)

        my_sensor = MySensor()
        # then
        my_sensor.intensity.set(45)
        # is iddentical to 
        my_sensor.aoChannels.ao3.set(45)
        
    """

    class Config(BaseNodeAlias1.Config):
        type = "AoChannel"
        channel_number: int = 0
    @classmethod
    def _new_source_node(cls, parent, config):
        return getattr(parent.aoChannels, f"ao{config.channel_number}")


@record_class
class DiChannel(BaseNodeAlias1):
    """ NodeAlias1 to a digital input node iddentified from a number 

    Config: 
        channel_number (int)

    Example:
    
    ::

        from pydevmgr_elt import Sensor

        
        class MySensor(Sensor):
            class Config(Sensor.Config):
                door_interlock = Sensor.DiChannel.Config(channel_number=3)
        
    """
    class Config(BaseNodeAlias1.Config):
        type = "DiChannel"
        channel_number: int = 0
    @classmethod
    def _new_source_node(cls, parent, config):
        return getattr(parent.diChannels, f"di{config.channel_number}")


@record_class
class DoChannel(BaseNodeAlias1):
    """ NodeAlias1 to a analog output node iddentified from a number 

    Config: 
        channel_number (int)

    Example:
    
    ::

        from pydevmgr_elt import Sensor

        
        class MySensor(Sensor):
            class Config(Sensor.Config):
                switch  = Sensor.DoChannel.Config(channel_number=3)

        my_sensor = MySensor()
        # then
        my_sensor.witch.set(True)
        # is iddentical to 
        my_sensor.doChannels.do3.set(True)
        
    """

    class Config(BaseNodeAlias1.Config):
        type = "DoChannel"
        channel_number: int = 0
    @classmethod
    def _new_source_node(cls, parent, config):
        return getattr(parent.doChannels, f"do{config.channel_number}")






[docs]@record_class class Sensor(Base): """ ELt Standard Sensor device """ Config = SensorConfig Cfg = Cfg Stat = Stat Rpcs = Rpcs AiChannels = AiChannels AoChannels = AoChannels DiChannels = DiChannels DoChannels = DoChannels AiChannel = AiChannel AoChannel = AoChannel DiChannel = DiChannel DoChannel = DoChannel class Data(Base.Data): Cfg = Cfg.Data Stat = Stat.Data Rpcs = Rpcs.Data cfg: Cfg = Cfg() stat: Stat = Stat() rpcs: Rpcs = Rpcs()
if __name__ == "__main__": Sensor()