#########################################################################################
##
## SWITCH BLOCK
## (blocks/switch.py)
##
## Milan Rother 2025
##
#########################################################################################
# IMPORTS ===============================================================================
from ._block import Block
# BLOCK DEFINITION ======================================================================
[docs]
class Switch(Block):
"""Switch block that selects between its inputs and copies
one of them to the output.
Example
-------
The block is initialized like this:
.. code-block:: python
#default None -> no passthrough
s1 = Switch()
#selecting port 2 as passthrough
s2 = Switch(2)
#change the state of the switch to port 3
s2.select(3)
Sets block output depending on `self.state` like this:
.. code-block::
state == None -> outputs[0] = 0
state == 0 -> outputs[0] = inputs[0]
state == 1 -> outputs[0] = inputs[1]
state == 2 -> outputs[0] = inputs[2]
...
Parameters
----------
state : int, None
state of the switch
"""
def __init__(self, state=None):
super().__init__()
self.state = state
def __len__(self):
"""Algebraic passthrough only possible if state is defined"""
return 0 if self.state is None else 1
[docs]
def select(self, state=0):
"""
This method is unique to the `Switch` block and intended
to be used from outside the simulation level for selecting
the input ports for the switch state.
This can be achieved for example with the event management
system and its callback/action functions.
Parameters
---------
state : int, None
switch state / input port selection
"""
self.state = state
[docs]
def update(self, t):
"""Update switch output depending on inputs
Note
----
MISO block has optimized 'update' method
Parameters
----------
t : float
evaluation time
"""
_out, self.outputs[0] = self.outputs[0], self.inputs.get(self.state, 0.0)
return abs(_out - self.outputs[0])