]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Blast door/shutter, timer and or gate device linking fixes (#16347)
authorJulian Giebel <juliangiebel@live.de>
Thu, 11 May 2023 22:16:02 +0000 (00:16 +0200)
committerGitHub <noreply@github.com>
Thu, 11 May 2023 22:16:02 +0000 (18:16 -0400)
16 files changed:
Content.Server/DeviceLinking/Components/ActiveSignalTimerComponent.cs [moved from Content.Server/MachineLinking/Components/ActiveSignalTimerComponent.cs with 88% similarity]
Content.Server/DeviceLinking/Components/OrGateComponent.cs [moved from Content.Server/MachineLinking/Components/OrGateComponent.cs with 76% similarity]
Content.Server/DeviceLinking/Components/SignalTimerComponent.cs [moved from Content.Server/MachineLinking/Components/SignalTimerComponent.cs with 96% similarity]
Content.Server/DeviceLinking/Systems/DoorSignalControlSystem.cs
Content.Server/DeviceLinking/Systems/OrGateSystem.cs [new file with mode: 0644]
Content.Server/DeviceLinking/Systems/SignalTimerSystem.cs [moved from Content.Server/MachineLinking/System/SignalTimerSystem.cs with 97% similarity]
Content.Server/DeviceNetwork/DeviceNetworkConstants.cs
Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs
Content.Server/MachineLinking/Components/SignalTransmitterComponent.cs
Content.Server/MachineLinking/Events/SignalReceivedEvent.cs
Content.Server/MachineLinking/System/OrGateSystem.cs [deleted file]
Content.Server/MachineLinking/System/SignalLinkerSystem.cs
Resources/Prototypes/DeviceLinking/sink_ports.yml
Resources/Prototypes/DeviceLinking/source_ports.yml
Resources/Prototypes/Entities/Structures/Wallmounts/timer.yml
Resources/Prototypes/Entities/Structures/gates.yml

similarity index 88%
rename from Content.Server/MachineLinking/Components/ActiveSignalTimerComponent.cs
rename to Content.Server/DeviceLinking/Components/ActiveSignalTimerComponent.cs
index 823dc469e4d8fdab5942366ef89fee2a0c0443ba..9cd1a5ff21bc4167ec2f0e4d5c463e3a79ecbcc1 100644 (file)
@@ -1,7 +1,7 @@
 
 using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
 
-namespace Content.Server.MachineLinking.Components
+namespace Content.Server.DeviceLinking.Components
 {
     [RegisterComponent]
     public sealed class ActiveSignalTimerComponent : Component
similarity index 76%
rename from Content.Server/MachineLinking/Components/OrGateComponent.cs
rename to Content.Server/DeviceLinking/Components/OrGateComponent.cs
index 2e088b7e71d3fa4c245d528748293dbe4de880db..f3e2f18379475b799e0a83bcba984b61efe84023 100644 (file)
@@ -1,8 +1,6 @@
 using Content.Server.MachineLinking.Events;
-using Content.Shared.MachineLinking;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
 
-namespace Content.Server.MachineLinking.Components;
+namespace Content.Server.DeviceLinking.Components;
 
 [RegisterComponent]
 public sealed class OrGateComponent : Component
@@ -26,3 +24,11 @@ public sealed class OrGateComponent : Component
     [ViewVariables]
     public SignalState LastO2 = SignalState.Low;
 }
+
+public enum SignalState
+{
+    Momentary, // Instantaneous pulse high, compatibility behavior
+    Low,
+    High
+}
+
similarity index 96%
rename from Content.Server/MachineLinking/Components/SignalTimerComponent.cs
rename to Content.Server/DeviceLinking/Components/SignalTimerComponent.cs
index 99eeb768800bb648a6e70ae33d1d57cc12e87131..592060a4cb1283dc3361c1b33b790aae79a1cbfb 100644 (file)
@@ -2,7 +2,7 @@ using Content.Shared.MachineLinking;
 using Robust.Shared.Audio;
 using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
 
-namespace Content.Server.MachineLinking.Components;
+namespace Content.Server.DeviceLinking.Components;
 
 [RegisterComponent]
 public sealed class SignalTimerComponent : Component
index 969161c1661dbace1f3b83284c7595f4b3f6197b..90328ddf31d222a5a57a823c38e69126cee18c4c 100644 (file)
@@ -1,8 +1,6 @@
 using Content.Server.DeviceLinking.Components;
 using Content.Server.DeviceNetwork;
 using Content.Server.Doors.Systems;
-using Content.Server.MachineLinking.Events;
-using Content.Server.MachineLinking.System;
 using Content.Shared.Doors.Components;
 using Content.Shared.Doors;
 using JetBrains.Annotations;
@@ -17,8 +15,6 @@ namespace Content.Server.DeviceLinking.Systems
         [Dependency] private readonly DoorSystem _doorSystem = default!;
         [Dependency] private readonly DeviceLinkSystem _signalSystem = default!;
 
-        private const string DoorSignalState = "DoorState";
-
         public override void Initialize()
         {
             base.Initialize();
@@ -40,7 +36,7 @@ namespace Content.Server.DeviceLinking.Systems
                 return;
 
             var state = SignalState.Momentary;
-            args.Data?.TryGetValue(DoorSignalState, out state);
+            args.Data?.TryGetValue(DeviceNetworkConstants.LogicState, out state);
 
 
             if (args.Port == component.OpenPort)
@@ -85,12 +81,12 @@ namespace Content.Server.DeviceLinking.Systems
         {
             var data = new NetworkPayload()
             {
-                { DoorSignalState, SignalState.Momentary }
+                { DeviceNetworkConstants.LogicState, SignalState.Momentary }
             };
 
             if (args.State == DoorState.Closed)
             {
-                data[DoorSignalState] = SignalState.Low;
+                data[DeviceNetworkConstants.LogicState] = SignalState.Low;
                 _signalSystem.InvokePort(uid, door.OutOpen, data);
             }
             else if (args.State == DoorState.Open
@@ -98,7 +94,7 @@ namespace Content.Server.DeviceLinking.Systems
                   || args.State == DoorState.Closing
                   || args.State == DoorState.Emagging)
             {
-                data[DoorSignalState] = SignalState.High;
+                data[DeviceNetworkConstants.LogicState] = SignalState.High;
                 _signalSystem.InvokePort(uid, door.OutOpen, data);
             }
         }
diff --git a/Content.Server/DeviceLinking/Systems/OrGateSystem.cs b/Content.Server/DeviceLinking/Systems/OrGateSystem.cs
new file mode 100644 (file)
index 0000000..d47c281
--- /dev/null
@@ -0,0 +1,84 @@
+using Content.Server.DeviceLinking.Components;
+using Content.Server.DeviceNetwork;
+using Content.Server.MachineLinking.Events;
+using JetBrains.Annotations;
+using Robust.Shared.Utility;
+using SignalReceivedEvent = Content.Server.DeviceLinking.Events.SignalReceivedEvent;
+
+namespace Content.Server.DeviceLinking.Systems
+{
+    [UsedImplicitly]
+    public sealed class OrGateSystem : EntitySystem
+    {
+
+        [Dependency] private readonly DeviceLinkSystem _signalSystem = default!;
+
+        public override void Initialize()
+        {
+            base.Initialize();
+            SubscribeLocalEvent<OrGateComponent, ComponentInit>(OnInit);
+            SubscribeLocalEvent<OrGateComponent, SignalReceivedEvent>(OnSignalReceived);
+        }
+
+        private void OnInit(EntityUid uid, OrGateComponent component, ComponentInit args)
+        {
+            _signalSystem.EnsureSinkPorts(uid, "A1", "B1", "A2", "B2");
+            _signalSystem.EnsureSourcePorts(uid, "O1", "O2");
+        }
+
+        private void OnSignalReceived(EntityUid uid, OrGateComponent component, ref SignalReceivedEvent args)
+        {
+            var state = SignalState.Momentary;
+            args.Data?.TryGetValue(DeviceNetworkConstants.LogicState, out state);
+
+            switch (args.Port)
+            {
+                case "A1":
+                    component.StateA1 = state;
+                    break;
+                case "B1":
+                    component.StateB1 = state;
+                    break;
+                case "A2":
+                    component.StateA2 = state;
+                    break;
+                case "B2":
+                    component.StateB2 = state;
+                    break;
+            }
+
+            // O1 = A1 || B1
+            var v1 = SignalState.Low;
+            if (component.StateA1 == SignalState.High || component.StateB1 == SignalState.High)
+                v1 = SignalState.High;
+
+            if (v1 != component.LastO1)
+            {
+                var data = new NetworkPayload
+                {
+                    [DeviceNetworkConstants.LogicState] = v1
+                };
+
+                _signalSystem.InvokePort(uid, "O1", data);
+            }
+
+            component.LastO1 = v1;
+
+            // O2 = A2 || B2
+            var v2 = SignalState.Low;
+            if (component.StateA2 == SignalState.High || component.StateB2 == SignalState.High)
+                v2 = SignalState.High;
+
+            if (v2 != component.LastO2)
+            {
+                var data = new NetworkPayload
+                {
+                    [DeviceNetworkConstants.LogicState] = v2
+                };
+
+                _signalSystem.InvokePort(uid, "O2", data);
+            }
+            component.LastO2 = v2;
+        }
+    }
+}
similarity index 97%
rename from Content.Server/MachineLinking/System/SignalTimerSystem.cs
rename to Content.Server/DeviceLinking/Systems/SignalTimerSystem.cs
index 0230a72b2bbccc787836fcdcd69c56f496a1f85c..56705274dba61dbdd60ccb76e0340b039d64e0b2 100644 (file)
@@ -1,19 +1,19 @@
-using Robust.Shared.Timing;
-using Content.Server.MachineLinking.Components;
-using Content.Shared.TextScreen;
-using Robust.Server.GameObjects;
-using Content.Shared.MachineLinking;
+using Content.Server.DeviceLinking.Components;
+using Content.Server.Interaction;
 using Content.Server.UserInterface;
 using Content.Shared.Access.Systems;
-using Content.Server.Interaction;
+using Content.Shared.MachineLinking;
+using Content.Shared.TextScreen;
+using Robust.Server.GameObjects;
+using Robust.Shared.Timing;
 
-namespace Content.Server.MachineLinking.System;
+namespace Content.Server.DeviceLinking.Systems;
 
 public sealed class SignalTimerSystem : EntitySystem
 {
     [Dependency] private readonly SharedAudioSystem _audio = default!;
     [Dependency] private readonly IGameTiming _gameTiming = default!;
-    [Dependency] private readonly SignalLinkerSystem _signalSystem = default!;
+    [Dependency] private readonly DeviceLinkSystem _signalSystem = default!;
     [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!;
     [Dependency] private readonly UserInterfaceSystem _ui = default!;
     [Dependency] private readonly AccessReaderSystem _accessReader = default!;
index fbf0898f7223863ae4abeda9100bea5d46a374e6..6cbad603b416557f0d0be9bcf9e88124d9f28b85 100644 (file)
@@ -8,6 +8,11 @@ namespace Content.Server.DeviceNetwork
     /// </summary>
     public static class DeviceNetworkConstants
     {
+        /// <summary>
+        /// Used by logic gates to transmit the state of their ports
+        /// </summary>
+        public const string LogicState = "logic_state";
+
         #region Commands
 
         /// <summary>
index a661fbd70b348f9c69461c9516a30365e37a5a29..4c5bd236b536a58463f554f290f3b7982fb09564 100644 (file)
@@ -500,15 +500,31 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
         if (!configurator.ActiveDeviceLink.HasValue || !configurator.DeviceLinkTarget.HasValue)
             return;
 
-        if (HasComp<DeviceLinkSourceComponent>(configurator.ActiveDeviceLink))
+        if (HasComp<DeviceLinkSourceComponent>(configurator.ActiveDeviceLink) && HasComp<DeviceLinkSinkComponent>(configurator.DeviceLinkTarget))
         {
-            _deviceLinkSystem.RemoveSinkFromSource(configurator.ActiveDeviceLink.Value, configurator.DeviceLinkTarget.Value);
-            UpdateLinkUiState(uid, configurator.ActiveDeviceLink.Value, configurator.DeviceLinkTarget.Value);
+            _deviceLinkSystem.RemoveSinkFromSource(
+                configurator.ActiveDeviceLink.Value,
+                configurator.DeviceLinkTarget.Value
+                );
+
+            UpdateLinkUiState(
+                uid,
+                configurator.ActiveDeviceLink.Value,
+                configurator.DeviceLinkTarget.Value
+                );
         }
-        else if (HasComp<DeviceLinkSourceComponent>(configurator.DeviceLinkTarget))
+        else if (HasComp<DeviceLinkSourceComponent>(configurator.DeviceLinkTarget) && HasComp<DeviceLinkSinkComponent>(configurator.ActiveDeviceLink))
         {
-            _deviceLinkSystem.RemoveSinkFromSource(configurator.DeviceLinkTarget.Value, configurator.ActiveDeviceLink.Value);
-            UpdateLinkUiState(uid, configurator.DeviceLinkTarget.Value, configurator.ActiveDeviceLink.Value);
+            _deviceLinkSystem.RemoveSinkFromSource(
+                configurator.DeviceLinkTarget.Value,
+                configurator.ActiveDeviceLink.Value
+                );
+
+            UpdateLinkUiState(
+                uid,
+                configurator.DeviceLinkTarget.Value,
+                configurator.ActiveDeviceLink.Value
+                );
         }
     }
 
@@ -517,15 +533,33 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
         if (!configurator.ActiveDeviceLink.HasValue || !configurator.DeviceLinkTarget.HasValue)
             return;
 
-        if (TryComp(configurator.ActiveDeviceLink, out DeviceLinkSourceComponent? activeSource))
+        if (TryComp(configurator.ActiveDeviceLink, out DeviceLinkSourceComponent? activeSource) && TryComp(configurator.DeviceLinkTarget, out DeviceLinkSinkComponent? targetSink))
         {
-            _deviceLinkSystem.ToggleLink(args.Session.AttachedEntity, configurator.ActiveDeviceLink.Value, configurator.DeviceLinkTarget.Value, args.Source, args.Sink, activeSource);
+            _deviceLinkSystem.ToggleLink(
+                args.Session.AttachedEntity,
+                configurator.ActiveDeviceLink.Value,
+                configurator.DeviceLinkTarget.Value,
+                args.Source, args.Sink,
+                activeSource, targetSink);
+
             UpdateLinkUiState(uid, configurator.ActiveDeviceLink.Value, configurator.DeviceLinkTarget.Value, activeSource);
         }
-        else if (TryComp(configurator.DeviceLinkTarget, out DeviceLinkSourceComponent? targetSource))
+        else if (TryComp(configurator.DeviceLinkTarget, out DeviceLinkSourceComponent? targetSource) && TryComp(configurator.ActiveDeviceLink, out DeviceLinkSinkComponent? activeSink))
         {
-            _deviceLinkSystem.ToggleLink(args.Session.AttachedEntity, configurator.DeviceLinkTarget.Value, configurator.ActiveDeviceLink.Value, args.Source, args.Sink, targetSource);
-            UpdateLinkUiState(uid, configurator.DeviceLinkTarget.Value, configurator.ActiveDeviceLink.Value, targetSource);
+            _deviceLinkSystem.ToggleLink(
+                args.Session.AttachedEntity,
+                configurator.DeviceLinkTarget.Value,
+                configurator.ActiveDeviceLink.Value,
+                args.Source, args.Sink,
+                targetSource, activeSink
+                );
+
+            UpdateLinkUiState(
+                uid,
+                configurator.DeviceLinkTarget.Value,
+                configurator.ActiveDeviceLink.Value,
+                targetSource
+                );
         }
     }
 
@@ -537,15 +571,41 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
         if (!configurator.ActiveDeviceLink.HasValue || !configurator.DeviceLinkTarget.HasValue)
             return;
 
-        if (TryComp(configurator.ActiveDeviceLink, out DeviceLinkSourceComponent? activeSource))
+        if (TryComp(configurator.ActiveDeviceLink, out DeviceLinkSourceComponent? activeSource) && TryComp(configurator.DeviceLinkTarget, out DeviceLinkSinkComponent? targetSink))
         {
-            _deviceLinkSystem.SaveLinks(args.Session.AttachedEntity, configurator.ActiveDeviceLink.Value, configurator.DeviceLinkTarget.Value, args.Links, activeSource);
-            UpdateLinkUiState(uid, configurator.ActiveDeviceLink.Value, configurator.DeviceLinkTarget.Value, activeSource);
+            _deviceLinkSystem.SaveLinks(
+                args.Session.AttachedEntity,
+                configurator.ActiveDeviceLink.Value,
+                configurator.DeviceLinkTarget.Value,
+                args.Links,
+                activeSource,
+                targetSink
+                );
+
+            UpdateLinkUiState(
+                uid,
+                configurator.ActiveDeviceLink.Value,
+                configurator.DeviceLinkTarget.Value,
+                activeSource
+                );
         }
-        else if (TryComp(configurator.DeviceLinkTarget, out DeviceLinkSourceComponent? targetSource))
+        else if (TryComp(configurator.DeviceLinkTarget, out DeviceLinkSourceComponent? targetSource) && TryComp(configurator.ActiveDeviceLink, out DeviceLinkSinkComponent? activeSink))
         {
-            _deviceLinkSystem.SaveLinks(args.Session.AttachedEntity, configurator.DeviceLinkTarget.Value, configurator.ActiveDeviceLink.Value, args.Links, targetSource);
-            UpdateLinkUiState(uid, configurator.DeviceLinkTarget.Value, configurator.ActiveDeviceLink.Value, targetSource);
+            _deviceLinkSystem.SaveLinks(
+                args.Session.AttachedEntity,
+                configurator.DeviceLinkTarget.Value,
+                configurator.ActiveDeviceLink.Value,
+                args.Links,
+                targetSource,
+                activeSink
+                );
+
+            UpdateLinkUiState(
+                uid,
+                configurator.DeviceLinkTarget.Value,
+                configurator.ActiveDeviceLink.Value,
+                targetSource
+                );
         }
     }
 
@@ -587,7 +647,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
 
         _popupSystem.PopupCursor(Loc.GetString(resultText), args.Session, PopupType.Medium);
         _uiSystem.TrySetUiState(
-            component.Owner,
+            uid,
             NetworkConfiguratorUiKey.Configure,
             new DeviceListUserInterfaceState(
                 _deviceListSystem.GetDeviceList(component.ActiveDeviceList.Value)
index b3b48691a0548e579a3c759c34313c513119308a..15675fbe4bd6e6dfd1ca2b10cb77cebe9f5e492c 100644 (file)
@@ -1,3 +1,4 @@
+using Content.Server.DeviceLinking.Components;
 using Content.Server.MachineLinking.Events;
 using Content.Server.MachineLinking.System;
 
index 40d8e07c97425bc0436e7120ba08b7e846b057ba..20e3614df09d1593835d1adb4d78922cc5cb1881 100644 (file)
@@ -1,12 +1,7 @@
+using Content.Server.DeviceLinking.Components;
+
 namespace Content.Server.MachineLinking.Events
 {
-    public enum SignalState
-    {
-        Momentary, // Instantaneous pulse high, compatibility behavior
-        Low,
-        High
-    }
-
     public sealed class SignalReceivedEvent : EntityEventArgs
     {
         public readonly string Port;
diff --git a/Content.Server/MachineLinking/System/OrGateSystem.cs b/Content.Server/MachineLinking/System/OrGateSystem.cs
deleted file mode 100644 (file)
index af5d9fb..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-using Content.Server.MachineLinking.Components;
-using Content.Server.MachineLinking.Events;
-using JetBrains.Annotations;
-
-namespace Content.Server.MachineLinking.System
-{
-    [UsedImplicitly]
-    public sealed class OrGateSystem : EntitySystem
-    {
-        [Dependency] private readonly SignalLinkerSystem _signalSystem = default!;
-
-        public override void Initialize()
-        {
-            base.Initialize();
-            SubscribeLocalEvent<OrGateComponent, ComponentInit>(OnInit);
-            SubscribeLocalEvent<OrGateComponent, SignalReceivedEvent>(OnSignalReceived);
-        }
-        
-        private void OnInit(EntityUid uid, OrGateComponent component, ComponentInit args)
-        {
-            _signalSystem.EnsureReceiverPorts(uid, "A1", "B1", "A2", "B2");
-            _signalSystem.EnsureTransmitterPorts(uid, "O1", "O2");
-        }
-
-        private void OnSignalReceived(EntityUid uid, OrGateComponent component, SignalReceivedEvent args)
-        {
-            if (args.Port == "A1")
-            {
-                component.StateA1 = args.State;
-            }
-            else if (args.Port == "B1")
-            {
-                component.StateB1 = args.State;
-            }
-            else if (args.Port == "A2")
-            {
-                component.StateA2 = args.State;
-            }
-            else if (args.Port == "B2")
-            {
-                component.StateB2 = args.State;
-            }
-
-            // O1 = A1 || B1
-            var v1 = SignalState.Low;
-            if (component.StateA1 == SignalState.High || component.StateB1 == SignalState.High)
-                v1 = SignalState.High;
-
-            if (v1 != component.LastO1)
-                _signalSystem.InvokePort(uid, "O1", v1);
-            component.LastO1 = v1;
-
-            // O2 = A2 || B2
-            var v2 = SignalState.Low;
-            if (component.StateA2 == SignalState.High || component.StateB2 == SignalState.High)
-                v2 = SignalState.High;
-
-            if (v2 != component.LastO2)
-                _signalSystem.InvokePort(uid, "O2", v2);
-            component.LastO2 = v2;
-        }
-    }
-}
index 67439190773ec67c2b5844c7aaf43ed606f07804..008e878891805d62bd6bbcf52cecfd3b6f5ef1e1 100644 (file)
@@ -1,5 +1,6 @@
 using System.Linq;
 using System.Diagnostics.CodeAnalysis;
+using Content.Server.DeviceLinking.Components;
 using Content.Server.MachineLinking.Components;
 using Content.Server.MachineLinking.Events;
 using Content.Server.Power.Components;
index fbe809c6c334167ea1f9ea51e9c60dfea14e93df..b5cd96404e5ec4c22289faae7dc9536b2deabf52 100644 (file)
   id: ArtifactAnalyzerReceiver
   name: signal-port-name-artifact-analyzer-receiver
   description: signal-port-description-artifact-analyzer-receiver
+
+- type: sinkPort
+  id: A1
+  name: "Input A1"
+  description: "Input A1"
+
+- type: sinkPort
+  id: B1
+  name: "Input B1"
+  description: "Input B1"
+
+- type: sinkPort
+  id: A2
+  name: "Input A2"
+  description: "Input A2"
+
+- type: sinkPort
+  id: B2
+  name: "Input B2"
+  description: "Input B2"
index 02f55f17989507750c49e4542ad0543af305c72b..823e4a164a60469e945c9682f6d23006233ab7b7 100644 (file)
   name: signal-port-name-artifact-analyzer-sender
   description: signal-port-description-artifact-analyzer-sender
   defaultLinks: [ ArtifactAnalyzerReceiver ]
+
+- type: sourcePort
+  id: Timer
+  name: signal-port-name-timer-trigger
+  description: signal-port-description-timer-trigger
+  defaultLinks: [ AutoClose, On, Open, Forward, Trigger ]
+
+- type: sourcePort
+  id: Start
+  name: signal-port-name-timer-start
+  description: signal-port-description-timer-start
+  defaultLinks: [ Close, Off ]
+
+- type: sourcePort
+  id: O1
+  name: "Output 1"
+  description: "Output 1"
+
+- type: sourcePort
+  id: O2
+  name: "Output 2"
+  description: "Output 2"
index 7f27dfd51dd2ef42dd5efb95b4ec883e43e3899a..1a46d6b07a745601422ffcf25dde2d25daa89648 100644 (file)
   - type: Rotatable
   - type: SignalTimer
     canEditLabel: false
-  - type: SignalTransmitter
-    outputs:
-      Start: []
-      Timer: []
+  - type: DeviceLinkSource
+    ports:
+      - Start
+      - Timer
   - type: ActivatableUI
     key: enum.SignalTimerUiKey.Key
   - type: UserInterface
index 94f0cb46ce1839daf186a111b7640ae0d75c24c2..6d487c338a88b97eb26b6e3b8d8210a7aaca8d40 100644 (file)
     state: or
   - type: Rotatable
   - type: OrGate
-  - type: SignalReceiver
-    inputs:
-      A1: []
-      B1: []
-      A2: []
-      B2: []
-  - type: SignalTransmitter
-    outputs:
-      O1: []
-      O2: []
+  - type: DeviceNetwork
+    deviceNetId: Wireless
+    receiveFrequencyId: BasicDevice
+  - type: WirelessNetworkConnection
+    range: 200
+  - type: DeviceLinkSink
+    ports:
+      - A1
+      - B1
+      - A2
+      - B2
+  - type: DeviceLinkSource
+    ports:
+      - O1
+      - O2