Die Host-Seite ist jetzt auf eine gemeinsame software-first API ausgerichtet. In [control.rs](</c:/Users/janni/Documents/RFP/Infinity_Vis _Rust/crates/infinity_host/src/control.rs>) steckt jetzt das stabile gemeinsame Modell für Snapshots, Commands, Pattern-Katalog, Presets, Gruppen, Parameter, Preview und Übergänge. Darauf sitzen die neue Szenen-/Pattern-Schicht in [scene.rs](</c:/Users/janni/Documents/RFP/Infinity_Vis _Rust/crates/infinity_host/src/scene.rs>) und der simulationsbasierte Host-Service in [simulation.rs](</c:/Users/janni/Documents/RFP/Infinity_Vis _Rust/crates/infinity_host/src/simulation.rs>). Der neue Core kann jetzt softwareseitig schon: - Pattern-Katalog mit `solid_color`, `gradient`, `chase`, `pulse`, `noise`, `walking_pixel` - Preset-Recall, Gruppen-Targeting, Parameteränderungen und Übergänge - simulierte Preview-Daten für alle 18 Outputs - denselben API-Zugriff für CLI, Engineering-GUI und später Web-UI / grandMA-Adapter Zusätzlich gibt es im Host-CLI jetzt `snapshot`, also eine direkte JSON-Sicht auf den gemeinsamen Host-State über [main.rs](</c:/Users/janni/Documents/RFP/Infinity_Vis _Rust/crates/infinity_host/src/main.rs>). **Oberflächen** Die technische lokale GUI bleibt bestehen und hängt jetzt auf der neuen gemeinsamen API. In [app.rs](</c:/Users/janni/Documents/RFP/Infinity_Vis _Rust/crates/infinity_host_ui/src/app.rs>) zeigt sie weiter Mapping/Status/Testmuster, ergänzt um Engine-/Szene-/Übergangsstatus. Sie bleibt bewusst Engineering-orientiert und ist nicht zur kreativen Hauptoberfläche aufgeblasen worden. Die Beispielkonfiguration in [project.example.toml](</c:/Users/janni/Documents/RFP/Infinity_Vis _Rust/config/project.example.toml>) ist jetzt auch als Software-Spielwiese brauchbarer: mehr Gruppen, mehr kreative Presets und bessere Basis für Look-Entwicklung ohne echte Node-Aktivierung. Die neue API-Ausrichtung ist in [host_api.md](</c:/Users/janni/Documents/RFP/Infinity_Vis _Rust/docs/host_api.md>) und [architecture.md](</c:/Users/janni/Documents/RFP/Infinity_Vis _Rust/docs/architecture.md>) dokumentiert. **Verifikation** `cargo check` und `cargo test -q` laufen erfolgreich. Zusätzlich läuft `cargo run -p infinity_host -- snapshot --config config/project.example.toml` und liefert den gemeinsamen Host-Snapshot mit Katalog, aktiver Szene, Preview, Node- und Panelstatus. Der nächste sinnvolle Schritt ist jetzt ein echter API-Adapter fuer die kommende Web-UI, also HTTP/WebSocket auf genau diesem Host-Core statt einer frontend-spezifischen Parallelarchitektur.
397 lines
11 KiB
TOML
397 lines
11 KiB
TOML
[metadata]
|
|
project_name = "Infinity Vis"
|
|
schema_version = 1
|
|
default_transport_profile = "scene_default"
|
|
default_safety_profile = "live_safe"
|
|
|
|
[topology]
|
|
expected_node_count = 6
|
|
outputs_per_node = 3
|
|
leds_per_output = 106
|
|
|
|
[[topology.nodes]]
|
|
node_id = "node-01"
|
|
display_name = "ESP32 Node 01"
|
|
[topology.nodes.network]
|
|
reserved_ip = "192.168.40.101"
|
|
telemetry_label = "rig-01"
|
|
|
|
[[topology.nodes.outputs]]
|
|
panel_position = "top"
|
|
physical_output_name = "UART 6"
|
|
driver_channel = { kind = "pending_validation", reference = "UART 6" }
|
|
led_count = 106
|
|
direction = "forward"
|
|
color_order = "grb"
|
|
enabled = true
|
|
validation_state = "pending_hardware_validation"
|
|
logical_panel_name = "node-01-top"
|
|
|
|
[[topology.nodes.outputs]]
|
|
panel_position = "middle"
|
|
physical_output_name = "UART 5"
|
|
driver_channel = { kind = "pending_validation", reference = "UART 5" }
|
|
led_count = 106
|
|
direction = "forward"
|
|
color_order = "grb"
|
|
enabled = true
|
|
validation_state = "pending_hardware_validation"
|
|
logical_panel_name = "node-01-middle"
|
|
|
|
[[topology.nodes.outputs]]
|
|
panel_position = "bottom"
|
|
physical_output_name = "UART 4"
|
|
driver_channel = { kind = "pending_validation", reference = "UART 4" }
|
|
led_count = 106
|
|
direction = "forward"
|
|
color_order = "grb"
|
|
enabled = true
|
|
validation_state = "pending_hardware_validation"
|
|
logical_panel_name = "node-01-bottom"
|
|
|
|
[[topology.nodes]]
|
|
node_id = "node-02"
|
|
display_name = "ESP32 Node 02"
|
|
[topology.nodes.network]
|
|
reserved_ip = "192.168.40.102"
|
|
telemetry_label = "rig-02"
|
|
|
|
[[topology.nodes.outputs]]
|
|
panel_position = "top"
|
|
physical_output_name = "UART 6"
|
|
driver_channel = { kind = "pending_validation", reference = "UART 6" }
|
|
led_count = 106
|
|
direction = "forward"
|
|
color_order = "grb"
|
|
enabled = true
|
|
validation_state = "pending_hardware_validation"
|
|
logical_panel_name = "node-02-top"
|
|
|
|
[[topology.nodes.outputs]]
|
|
panel_position = "middle"
|
|
physical_output_name = "UART 5"
|
|
driver_channel = { kind = "pending_validation", reference = "UART 5" }
|
|
led_count = 106
|
|
direction = "forward"
|
|
color_order = "grb"
|
|
enabled = true
|
|
validation_state = "pending_hardware_validation"
|
|
logical_panel_name = "node-02-middle"
|
|
|
|
[[topology.nodes.outputs]]
|
|
panel_position = "bottom"
|
|
physical_output_name = "UART 4"
|
|
driver_channel = { kind = "pending_validation", reference = "UART 4" }
|
|
led_count = 106
|
|
direction = "forward"
|
|
color_order = "grb"
|
|
enabled = true
|
|
validation_state = "pending_hardware_validation"
|
|
logical_panel_name = "node-02-bottom"
|
|
|
|
[[topology.nodes]]
|
|
node_id = "node-03"
|
|
display_name = "ESP32 Node 03"
|
|
[topology.nodes.network]
|
|
reserved_ip = "192.168.40.103"
|
|
telemetry_label = "rig-03"
|
|
|
|
[[topology.nodes.outputs]]
|
|
panel_position = "top"
|
|
physical_output_name = "UART 6"
|
|
driver_channel = { kind = "pending_validation", reference = "UART 6" }
|
|
led_count = 106
|
|
direction = "forward"
|
|
color_order = "grb"
|
|
enabled = true
|
|
validation_state = "pending_hardware_validation"
|
|
logical_panel_name = "node-03-top"
|
|
|
|
[[topology.nodes.outputs]]
|
|
panel_position = "middle"
|
|
physical_output_name = "UART 5"
|
|
driver_channel = { kind = "pending_validation", reference = "UART 5" }
|
|
led_count = 106
|
|
direction = "forward"
|
|
color_order = "grb"
|
|
enabled = true
|
|
validation_state = "pending_hardware_validation"
|
|
logical_panel_name = "node-03-middle"
|
|
|
|
[[topology.nodes.outputs]]
|
|
panel_position = "bottom"
|
|
physical_output_name = "UART 4"
|
|
driver_channel = { kind = "pending_validation", reference = "UART 4" }
|
|
led_count = 106
|
|
direction = "forward"
|
|
color_order = "grb"
|
|
enabled = true
|
|
validation_state = "pending_hardware_validation"
|
|
logical_panel_name = "node-03-bottom"
|
|
|
|
[[topology.nodes]]
|
|
node_id = "node-04"
|
|
display_name = "ESP32 Node 04"
|
|
[topology.nodes.network]
|
|
reserved_ip = "192.168.40.104"
|
|
telemetry_label = "rig-04"
|
|
|
|
[[topology.nodes.outputs]]
|
|
panel_position = "top"
|
|
physical_output_name = "UART 6"
|
|
driver_channel = { kind = "pending_validation", reference = "UART 6" }
|
|
led_count = 106
|
|
direction = "forward"
|
|
color_order = "grb"
|
|
enabled = true
|
|
validation_state = "pending_hardware_validation"
|
|
logical_panel_name = "node-04-top"
|
|
|
|
[[topology.nodes.outputs]]
|
|
panel_position = "middle"
|
|
physical_output_name = "UART 5"
|
|
driver_channel = { kind = "pending_validation", reference = "UART 5" }
|
|
led_count = 106
|
|
direction = "forward"
|
|
color_order = "grb"
|
|
enabled = true
|
|
validation_state = "pending_hardware_validation"
|
|
logical_panel_name = "node-04-middle"
|
|
|
|
[[topology.nodes.outputs]]
|
|
panel_position = "bottom"
|
|
physical_output_name = "UART 4"
|
|
driver_channel = { kind = "pending_validation", reference = "UART 4" }
|
|
led_count = 106
|
|
direction = "forward"
|
|
color_order = "grb"
|
|
enabled = true
|
|
validation_state = "pending_hardware_validation"
|
|
logical_panel_name = "node-04-bottom"
|
|
|
|
[[topology.nodes]]
|
|
node_id = "node-05"
|
|
display_name = "ESP32 Node 05"
|
|
[topology.nodes.network]
|
|
reserved_ip = "192.168.40.105"
|
|
telemetry_label = "rig-05"
|
|
|
|
[[topology.nodes.outputs]]
|
|
panel_position = "top"
|
|
physical_output_name = "UART 6"
|
|
driver_channel = { kind = "pending_validation", reference = "UART 6" }
|
|
led_count = 106
|
|
direction = "forward"
|
|
color_order = "grb"
|
|
enabled = true
|
|
validation_state = "pending_hardware_validation"
|
|
logical_panel_name = "node-05-top"
|
|
|
|
[[topology.nodes.outputs]]
|
|
panel_position = "middle"
|
|
physical_output_name = "UART 5"
|
|
driver_channel = { kind = "pending_validation", reference = "UART 5" }
|
|
led_count = 106
|
|
direction = "forward"
|
|
color_order = "grb"
|
|
enabled = true
|
|
validation_state = "pending_hardware_validation"
|
|
logical_panel_name = "node-05-middle"
|
|
|
|
[[topology.nodes.outputs]]
|
|
panel_position = "bottom"
|
|
physical_output_name = "UART 4"
|
|
driver_channel = { kind = "pending_validation", reference = "UART 4" }
|
|
led_count = 106
|
|
direction = "forward"
|
|
color_order = "grb"
|
|
enabled = true
|
|
validation_state = "pending_hardware_validation"
|
|
logical_panel_name = "node-05-bottom"
|
|
|
|
[[topology.nodes]]
|
|
node_id = "node-06"
|
|
display_name = "ESP32 Node 06"
|
|
[topology.nodes.network]
|
|
reserved_ip = "192.168.40.106"
|
|
telemetry_label = "rig-06"
|
|
|
|
[[topology.nodes.outputs]]
|
|
panel_position = "top"
|
|
physical_output_name = "UART 6"
|
|
driver_channel = { kind = "pending_validation", reference = "UART 6" }
|
|
led_count = 106
|
|
direction = "forward"
|
|
color_order = "grb"
|
|
enabled = true
|
|
validation_state = "pending_hardware_validation"
|
|
logical_panel_name = "node-06-top"
|
|
|
|
[[topology.nodes.outputs]]
|
|
panel_position = "middle"
|
|
physical_output_name = "UART 5"
|
|
driver_channel = { kind = "pending_validation", reference = "UART 5" }
|
|
led_count = 106
|
|
direction = "forward"
|
|
color_order = "grb"
|
|
enabled = true
|
|
validation_state = "pending_hardware_validation"
|
|
logical_panel_name = "node-06-middle"
|
|
|
|
[[topology.nodes.outputs]]
|
|
panel_position = "bottom"
|
|
physical_output_name = "UART 4"
|
|
driver_channel = { kind = "pending_validation", reference = "UART 4" }
|
|
led_count = 106
|
|
direction = "forward"
|
|
color_order = "grb"
|
|
enabled = true
|
|
validation_state = "pending_hardware_validation"
|
|
logical_panel_name = "node-06-bottom"
|
|
|
|
[[topology.groups]]
|
|
group_id = "all_panels"
|
|
tags = ["global", "default"]
|
|
members = [
|
|
{ node_id = "node-01", panel_position = "top" },
|
|
{ node_id = "node-01", panel_position = "middle" },
|
|
{ node_id = "node-01", panel_position = "bottom" },
|
|
{ node_id = "node-02", panel_position = "top" },
|
|
{ node_id = "node-02", panel_position = "middle" },
|
|
{ node_id = "node-02", panel_position = "bottom" },
|
|
{ node_id = "node-03", panel_position = "top" },
|
|
{ node_id = "node-03", panel_position = "middle" },
|
|
{ node_id = "node-03", panel_position = "bottom" },
|
|
{ node_id = "node-04", panel_position = "top" },
|
|
{ node_id = "node-04", panel_position = "middle" },
|
|
{ node_id = "node-04", panel_position = "bottom" },
|
|
{ node_id = "node-05", panel_position = "top" },
|
|
{ node_id = "node-05", panel_position = "middle" },
|
|
{ node_id = "node-05", panel_position = "bottom" },
|
|
{ node_id = "node-06", panel_position = "top" },
|
|
{ node_id = "node-06", panel_position = "middle" },
|
|
{ node_id = "node-06", panel_position = "bottom" },
|
|
]
|
|
|
|
[[topology.groups]]
|
|
group_id = "top_panels"
|
|
tags = ["row_like", "hardware_safe"]
|
|
members = [
|
|
{ node_id = "node-01", panel_position = "top" },
|
|
{ node_id = "node-02", panel_position = "top" },
|
|
{ node_id = "node-03", panel_position = "top" },
|
|
{ node_id = "node-04", panel_position = "top" },
|
|
{ node_id = "node-05", panel_position = "top" },
|
|
{ node_id = "node-06", panel_position = "top" },
|
|
]
|
|
|
|
[[topology.groups]]
|
|
group_id = "middle_panels"
|
|
tags = ["row_like", "hardware_safe"]
|
|
members = [
|
|
{ node_id = "node-01", panel_position = "middle" },
|
|
{ node_id = "node-02", panel_position = "middle" },
|
|
{ node_id = "node-03", panel_position = "middle" },
|
|
{ node_id = "node-04", panel_position = "middle" },
|
|
{ node_id = "node-05", panel_position = "middle" },
|
|
{ node_id = "node-06", panel_position = "middle" },
|
|
]
|
|
|
|
[[topology.groups]]
|
|
group_id = "bottom_panels"
|
|
tags = ["row_like", "hardware_safe"]
|
|
members = [
|
|
{ node_id = "node-01", panel_position = "bottom" },
|
|
{ node_id = "node-02", panel_position = "bottom" },
|
|
{ node_id = "node-03", panel_position = "bottom" },
|
|
{ node_id = "node-04", panel_position = "bottom" },
|
|
{ node_id = "node-05", panel_position = "bottom" },
|
|
{ node_id = "node-06", panel_position = "bottom" },
|
|
]
|
|
|
|
[[transport_profiles]]
|
|
profile_id = "scene_default"
|
|
mode = "distributed_scene"
|
|
logic_hz = 120
|
|
network_send_hz = 60
|
|
preview_hz = 15
|
|
heartbeat_hz = 5
|
|
ddp_compatibility = false
|
|
|
|
[[transport_profiles]]
|
|
profile_id = "frame_debug"
|
|
mode = "frame_streaming"
|
|
logic_hz = 120
|
|
network_send_hz = 40
|
|
preview_hz = 10
|
|
heartbeat_hz = 5
|
|
ddp_compatibility = true
|
|
|
|
[[safety_profiles]]
|
|
profile_id = "live_safe"
|
|
master_brightness_limit = 0.35
|
|
default_start_brightness = 0.20
|
|
allow_strobe = false
|
|
hold_last_frame_ms = 1500
|
|
fallback_preset_id = "safe_static_blue"
|
|
|
|
[[presets]]
|
|
preset_id = "safe_static_blue"
|
|
target_group = "all_panels"
|
|
transition_ms = 150
|
|
[presets.scene]
|
|
effect = "solid_color"
|
|
seed = 7
|
|
palette = ["#003bff"]
|
|
speed = 0.0
|
|
intensity = 1.0
|
|
blackout = false
|
|
|
|
[[presets]]
|
|
preset_id = "mapping_walk_test"
|
|
target_group = "all_panels"
|
|
transition_ms = 50
|
|
[presets.scene]
|
|
effect = "walking_pixel"
|
|
seed = 42
|
|
palette = ["#ffffff", "#000000"]
|
|
speed = 1.0
|
|
intensity = 1.0
|
|
blackout = false
|
|
|
|
[[presets]]
|
|
preset_id = "ocean_gradient"
|
|
target_group = "all_panels"
|
|
transition_ms = 500
|
|
[presets.scene]
|
|
effect = "gradient"
|
|
seed = 1337
|
|
palette = ["#041F4A", "#0F8AA6", "#7FFFD4"]
|
|
speed = 0.35
|
|
intensity = 0.82
|
|
blackout = false
|
|
|
|
[[presets]]
|
|
preset_id = "amber_chase_top"
|
|
target_group = "top_panels"
|
|
transition_ms = 120
|
|
[presets.scene]
|
|
effect = "chase"
|
|
seed = 2026
|
|
palette = ["#FF7A00", "#FFD166"]
|
|
speed = 1.40
|
|
intensity = 1.0
|
|
blackout = false
|
|
|
|
[[presets]]
|
|
preset_id = "deep_pulse_bottom"
|
|
target_group = "bottom_panels"
|
|
transition_ms = 380
|
|
[presets.scene]
|
|
effect = "pulse"
|
|
seed = 404
|
|
palette = ["#240046", "#5A189A", "#9D4EDD"]
|
|
speed = 0.80
|
|
intensity = 0.88
|
|
blackout = false
|