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); }
private void OnSubnetRequest(EntityUid uid, SurveillanceCameraMonitorComponent component, SurveillanceCameraMonitorSubnetRequestMessage args) { if (args.Session.AttachedEntity != null) { SetActiveSubnet(uid, args.Subnet, component); } }
private void OnBoundUiClose(EntityUid uid, SurveillanceCameraMonitorComponent component, BoundUIClosedEvent args) { if (args.Session.AttachedEntity == null) { return; } RemoveViewer(uid, args.Session.AttachedEntity.Value, component); }
private void OnPowerChanged(EntityUid uid, SurveillanceCameraMonitorComponent component, PowerChangedEvent args) { if (!args.Powered) { RemoveActiveCamera(uid, component); component.NextCameraAddress = null; component.ActiveSubnet = string.Empty; } }
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; } } }
/// 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); }
// 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); }
private void OnToggleInterface(EntityUid uid, SurveillanceCameraMonitorComponent component, AfterActivatableUIOpenEvent args) { AfterOpenUserInterface(uid, args.User, component); }
private void OnRefreshSubnetsMessage(EntityUid uid, SurveillanceCameraMonitorComponent component, SurveillanceCameraRefreshSubnetsMessage message) { RefreshSubnets(uid, component); }
private void OnRefreshCamerasMessage(EntityUid uid, SurveillanceCameraMonitorComponent component, SurveillanceCameraRefreshCamerasMessage message) { component.KnownCameras.Clear(); RequestActiveSubnetInfo(uid, component); }
private void OnDisconnectMessage(EntityUid uid, SurveillanceCameraMonitorComponent component, SurveillanceCameraDisconnectMessage message) { DisconnectCamera(uid, true, component); }