예제 #1
0
 private void OnSwitchMessage(EntityUid uid, SurveillanceCameraMonitorComponent component, SurveillanceCameraMonitorSwitchMessage message)
 {
     // there would be a null check here, but honestly
     // whichever one is the "latest" switch message gets to
     // do the switch
     TrySwitchCameraByAddress(uid, message.Address, component);
 }
예제 #2
0
 private void OnSubnetRequest(EntityUid uid, SurveillanceCameraMonitorComponent component,
                              SurveillanceCameraMonitorSubnetRequestMessage args)
 {
     if (args.Session.AttachedEntity != null)
     {
         SetActiveSubnet(uid, args.Subnet, component);
     }
 }
예제 #3
0
    private void OnBoundUiClose(EntityUid uid, SurveillanceCameraMonitorComponent component, BoundUIClosedEvent args)
    {
        if (args.Session.AttachedEntity == null)
        {
            return;
        }

        RemoveViewer(uid, args.Session.AttachedEntity.Value, component);
    }
예제 #4
0
 private void OnPowerChanged(EntityUid uid, SurveillanceCameraMonitorComponent component, PowerChangedEvent args)
 {
     if (!args.Powered)
     {
         RemoveActiveCamera(uid, component);
         component.NextCameraAddress = null;
         component.ActiveSubnet      = string.Empty;
     }
 }
예제 #5
0
    private void OnPacketReceived(EntityUid uid, SurveillanceCameraMonitorComponent component,
                                  DeviceNetworkPacketEvent args)
    {
        if (string.IsNullOrEmpty(args.SenderAddress))
        {
            return;
        }

        if (args.Data.TryGetValue(DeviceNetworkConstants.Command, out string?command))
        {
            switch (command)
            {
            case SurveillanceCameraSystem.CameraConnectMessage:
                if (component.NextCameraAddress == args.SenderAddress)
                {
                    component.ActiveCameraAddress = args.SenderAddress;
                    TrySwitchCameraByUid(uid, args.Sender, component);
                }

                component.NextCameraAddress = null;
                break;

            case SurveillanceCameraSystem.CameraHeartbeatMessage:
                if (args.SenderAddress == component.ActiveCameraAddress)
                {
                    component.LastHeartbeat = 0;
                }

                break;

            case SurveillanceCameraSystem.CameraDataMessage:
                if (!args.Data.TryGetValue(SurveillanceCameraSystem.CameraNameData, out string?name) ||
                    !args.Data.TryGetValue(SurveillanceCameraSystem.CameraSubnetData, out string?subnetData) ||
                    !args.Data.TryGetValue(SurveillanceCameraSystem.CameraAddressData, out string?address))
                {
                    return;
                }

                if (component.ActiveSubnet != subnetData)
                {
                    DisconnectFromSubnet(uid, subnetData);
                }

                if (!component.KnownCameras.ContainsKey(address))
                {
                    component.KnownCameras.Add(address, name);
                }

                UpdateUserInterface(uid, component);
                break;

            case SurveillanceCameraSystem.CameraSubnetData:
                if (args.Data.TryGetValue(SurveillanceCameraSystem.CameraSubnetData, out string?subnet) &&
                    !component.KnownSubnets.ContainsKey(subnet))
                {
                    component.KnownSubnets.Add(subnet, args.SenderAddress);
                }

                UpdateUserInterface(uid, component);
                break;
            }
        }
    }
예제 #6
0
    /// ROUTING:
    ///
    /// Monitor freq: General frequency for cameras, routers, and monitors to speak on.
    ///
    /// Subnet freqs: Frequency for each specific subnet. Routers ping cameras here,
    ///               cameras ping back on monitor frequency. When a monitor
    ///               selects a subnet, it saves that subnet's frequency
    ///               so it can connect to the camera. All outbound cameras
    ///               always speak on the monitor frequency and will not
    ///               do broadcast pings - whatever talks to it, talks to it.
    ///
    /// How a camera is discovered:
    ///
    /// Subnet ping:
    /// Surveillance camera monitor - [ monitor freq ] -> Router
    /// Router -> camera discovery
    /// Router - [ subnet freq ] -> Camera
    /// Camera -> router ping
    /// Camera - [ monitor freq ] -> Router
    /// Router -> monitor data forward
    /// Router - [ monitor freq ] -> Monitor

    #region Event Handling
    private void OnComponentStartup(EntityUid uid, SurveillanceCameraMonitorComponent component, ComponentStartup args)
    {
        RefreshSubnets(uid, component);
    }
예제 #7
0
 // This is to ensure that there's no delay in ensuring that a camera is deactivated.
 private void OnSurveillanceCameraDeactivate(EntityUid uid, SurveillanceCameraMonitorComponent monitor, SurveillanceCameraDeactivateEvent args)
 {
     DisconnectCamera(uid, false, monitor);
 }
예제 #8
0
 private void OnToggleInterface(EntityUid uid, SurveillanceCameraMonitorComponent component,
                                AfterActivatableUIOpenEvent args)
 {
     AfterOpenUserInterface(uid, args.User, component);
 }
예제 #9
0
 private void OnRefreshSubnetsMessage(EntityUid uid, SurveillanceCameraMonitorComponent component,
                                      SurveillanceCameraRefreshSubnetsMessage message)
 {
     RefreshSubnets(uid, component);
 }
예제 #10
0
 private void OnRefreshCamerasMessage(EntityUid uid, SurveillanceCameraMonitorComponent component,
                                      SurveillanceCameraRefreshCamerasMessage message)
 {
     component.KnownCameras.Clear();
     RequestActiveSubnetInfo(uid, component);
 }
예제 #11
0
 private void OnDisconnectMessage(EntityUid uid, SurveillanceCameraMonitorComponent component,
                                  SurveillanceCameraDisconnectMessage message)
 {
     DisconnectCamera(uid, true, component);
 }