Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/model/filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,10 @@ class FilterTypeEnumeration(IntFlag):
FILTER_RESPONDING_CONSTANT_16BIT = 72
FILTER_RESPONDING_CONSTANT_FLOAT = 73
FILTER_RESPONDING_CONSTANT_COLOR = 74
FILTER_SWITCH_8BIT = 76
FILTER_SWITCH_16BIT = 77
FILTER_SWITCH_FLOAT = 78
FILTER_SWITCH_COLOR = 79


class Filter:
Expand Down
16 changes: 12 additions & 4 deletions src/view/show_mode/editor/nodes/filter_node_library.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@
FaderMainBrightness,
FaderRawNode,
)
from view.show_mode.editor.nodes.impl.routing import Switch8BitNode, Switch16BitNode, SwitchColorNode, SwitchFloatNode
from view.show_mode.editor.nodes.impl.scripting import LuaFilterNode
from view.show_mode.editor.nodes.impl.time import (
EventCounterFilterNode,
Expand Down Expand Up @@ -109,6 +110,7 @@ def _reload(self) -> None:
self._register_constants_nodes()
self._register_debug_nodes()
self._register_adapters_nodes()
self._register_routing_nodes()
self._register_arithmetic_nodes()
self._register_trigonometric_nodes()
self._register_wave_nodes()
Expand Down Expand Up @@ -218,13 +220,19 @@ def _register_fader_nodes(self) -> None:
def _register_effect_nodes(self) -> None:
self.addNodeType(CueListNode, [("Effects",)])
self.addNodeType(AutoTrackerNode, [("Effects",)])
self.addNodeType(Shift8BitNode, [("Effects",)])
self.addNodeType(Shift16BitNode, [("Effects",)])
self.addNodeType(ShiftFloatNode, [("Effects",)])
self.addNodeType(ShiftColorNode, [("Effects",)])
self.addNodeType(EffectsStackNode, [("Effects",)])
self.addNodeType(SequencerNode, [("Effects",)])

def _register_routing_nodes(self) -> None:
self.addNodeType(Shift8BitNode, [("Routing",)])
self.addNodeType(Shift16BitNode, [("Routing",)])
self.addNodeType(ShiftFloatNode, [("Routing",)])
self.addNodeType(ShiftColorNode, [("Routing",)])
self.addNodeType(Switch8BitNode, [("Routing",)])
self.addNodeType(Switch16BitNode, [("Routing",)])
self.addNodeType(SwitchFloatNode, [("Routing",)])
self.addNodeType(SwitchColorNode, [("Routing",)])

def _register_scripting_nodes(self) -> None:
self.addNodeType(LuaFilterNode, [("Script",)])

Expand Down
101 changes: 101 additions & 0 deletions src/view/show_mode/editor/nodes/impl/routing.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
"""Contains filter nodes for signal routing filters."""

from __future__ import annotations

from logging import getLogger
from typing import override

from model import DataType
from model.filter import Filter, FilterTypeEnumeration
from view.show_mode.editor.nodes.base.filternode import FilterNode

logger = getLogger(__name__)

class SwitchFilterNode(FilterNode):
"""Base class to represent abstract switch filter."""

def __init__(self, model: Filter, name: str, filter_type: int, data_type: DataType) -> None:
"""Initialize filter node."""
super().__init__(
model=model,
filter_type=filter_type,
name=name,
allow_add_output=True,
terminals={
"out": {"io": "out"},
"select": {"io": "in"}
},
)

self._filter.in_data_types["select"] = DataType.DT_16_BIT
self._filter.in_data_types["out"] = data_type
self._filter.default_values["select"] = "0"

if not self._filter.filter_configurations.get("nr_inputs"):
self._filter.filter_configurations["nr_inputs"] = "2"

self._data_type = data_type
self._setup_input_terminals()

def _setup_input_terminals(self) -> None:
existing_inputs = list(self.inputs())
try:
required_input_count = int(self._filter.filter_configurations["nr_inputs"])
except ValueError:
logger.error("Invalid number of inputs: %s. Resetting to 0.", len(self._filter.filter_configurations))
required_input_count = 0
self._filter.filter_configurations["nr_inputs"] = "0"
if required_input_count < 0:
logger.error("Invalid number of inputs: %s. Resetting to 0.", required_input_count)
required_input_count = 0
self._filter.filter_configurations["nr_inputs"] = "0"
for input_key in existing_inputs:
if input_key != "select" and int(input_key) >= required_input_count:
self.removeTerminal(input_key)
existing_inputs = list(self.inputs())
for i in range(required_input_count):
key = str(i)
if key not in existing_inputs:
self.addInput(key)
self._filter.in_data_types[key] = self._data_type
self._filter.default_values[key] = "0,0,0" if self._data_type == DataType.DT_COLOR else "0"

@override
def update_node_after_settings_changed(self) -> None:
self._setup_input_terminals()

class Switch8BitNode(SwitchFilterNode):
"""8 bit switch filter node implementation."""

nodeName = "filter_switch_8bit" # noqa: N815

def __init__(self, model: Filter, name: str) -> None:
"""Initialize filter node."""
super().__init__(model, name, FilterTypeEnumeration.FILTER_SWITCH_8BIT, DataType.DT_8_BIT)

class Switch16BitNode(SwitchFilterNode):
"""16 bit switch filter node implementation."""

nodeName = "filter_switch_16bit" # noqa: N815

def __init__(self, model: Filter, name: str) -> None:
"""Initialize filter node."""
super().__init__(model, name, FilterTypeEnumeration.FILTER_SWITCH_16BIT, DataType.DT_16_BIT)

class SwitchFloatNode(SwitchFilterNode):
"""Float switch filter node implementation."""

nodeName = "filter_switch_float" # noqa: N815

def __init__(self, model: Filter, name: str) -> None:
"""Initialize filter node."""
super().__init__(model, name, FilterTypeEnumeration.FILTER_SWITCH_FLOAT, DataType.DT_DOUBLE)

class SwitchColorNode(SwitchFilterNode):
"""8 bit switch filter node implementation."""

nodeName = "filter_switch_color" # noqa: N815

def __init__(self, model: Filter, name: str) -> None:
"""Initialize filter node."""
super().__init__(model, name, FilterTypeEnumeration.FILTER_SWITCH_COLOR, DataType.DT_COLOR)
5 changes: 5 additions & 0 deletions src/view/show_mode/editor/nodes/type_to_node_dict.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@
FaderMainBrightness,
FaderRawNode,
)
from view.show_mode.editor.nodes.impl.routing import Switch8BitNode, Switch16BitNode, SwitchColorNode, SwitchFloatNode
from view.show_mode.editor.nodes.impl.scripting import LuaFilterNode
from view.show_mode.editor.nodes.impl.time import (
EventCounterFilterNode,
Expand Down Expand Up @@ -182,4 +183,8 @@
FilterTypeEnumeration.FILTER_REMOTE_DEBUG_FLOAT: DebugRemoteFloatNode.nodeName,
FilterTypeEnumeration.FILTER_REMOTE_DEBUG_PIXEL: DebugRemoteColorNode.nodeName,
FilterTypeEnumeration.FILTER_EVENT_COUNTER: EventCounterFilterNode.nodeName,
FilterTypeEnumeration.FILTER_SWITCH_8BIT: Switch8BitNode.nodeName,
FilterTypeEnumeration.FILTER_SWITCH_16BIT: Switch16BitNode.nodeName,
FilterTypeEnumeration.FILTER_SWITCH_FLOAT: SwitchFloatNode.nodeName,
FilterTypeEnumeration.FILTER_SWITCH_COLOR: SwitchColorNode.nodeName,
}
2 changes: 1 addition & 1 deletion submodules/resources
Submodule resources updated from 8567af to e49347
8 changes: 4 additions & 4 deletions test/unittests/utilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,19 +34,19 @@ def _stall_until_stdout_reached_target(process: subprocess.Popen, target: str):

def execute_board_configuration(bc: BoardConfiguration, cycles: int = 25, recorded_gui_updates: list[tuple[int, str, str, str]] | None = None, main_brightness: int = 65565) -> bool:
"""Execute a board configuration.

This method starts a fish instance, connects to it, uploads a board configuration and enables filter execution.
If after the specified amount of iterations, no error occurred, the method stops, returning true. Otherwise, false.

Args:
bc: The board configuration to apply
cycles: The amount of cycles to wait
recorded_gui_updates: If A list is provided, any GUI updates received during execution are stored in there.
main_brightness: The Main brightness value used for the test.

Returns:
True if no error occurred during execution. Otherwise, false.

"""
global _last_error_message
_last_error_message = _GOOD_MESSAGES[0]
Expand Down
Loading