SensorMonitoringConsoleSystem.UI.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. using Content.Server.DeviceNetwork.Components;
  2. using Content.Shared.SensorMonitoring;
  3. using Robust.Shared.Collections;
  4. using ConsoleUIState = Content.Shared.SensorMonitoring.SensorMonitoringConsoleBoundInterfaceState;
  5. using IncrementalUIState = Content.Shared.SensorMonitoring.SensorMonitoringIncrementalUpdate;
  6. namespace Content.Server.SensorMonitoring;
  7. public sealed partial class SensorMonitoringConsoleSystem
  8. {
  9. private void InitUI()
  10. {
  11. Subs.BuiEvents<SensorMonitoringConsoleComponent>(SensorMonitoringConsoleUiKey.Key, subs =>
  12. {
  13. subs.Event<BoundUIClosedEvent>(ConsoleUIClosed);
  14. });
  15. }
  16. private void UpdateConsoleUI(EntityUid uid, SensorMonitoringConsoleComponent comp)
  17. {
  18. if (!_userInterface.IsUiOpen(uid, SensorMonitoringConsoleUiKey.Key))
  19. {
  20. return;
  21. }
  22. ConsoleUIState? fullState = null;
  23. SensorMonitoringIncrementalUpdate? incrementalUpdate = null;
  24. foreach (var actorUid in _userInterface.GetActors(uid, SensorMonitoringConsoleUiKey.Key))
  25. {
  26. if (comp.InitialUIStateSent.Contains(actorUid))
  27. {
  28. incrementalUpdate ??= CalculateIncrementalUpdate();
  29. _userInterface.ServerSendUiMessage(uid, SensorMonitoringConsoleUiKey.Key, incrementalUpdate, actorUid);
  30. }
  31. else
  32. {
  33. fullState ??= CalculateFullState();
  34. _userInterface.SetUiState(uid, SensorMonitoringConsoleUiKey.Key, fullState);
  35. comp.InitialUIStateSent.Add(actorUid);
  36. }
  37. }
  38. comp.LastUIUpdate = _gameTiming.CurTime;
  39. comp.RemovedSensors.Clear();
  40. ConsoleUIState CalculateFullState()
  41. {
  42. var sensors = new ValueList<ConsoleUIState.SensorData>();
  43. var streams = new ValueList<ConsoleUIState.SensorStream>();
  44. foreach (var (ent, data) in comp.Sensors)
  45. {
  46. streams.Clear();
  47. var name = MetaData(ent).EntityName;
  48. var address = Comp<DeviceNetworkComponent>(ent).Address;
  49. foreach (var (streamName, stream) in data.Streams)
  50. {
  51. streams.Add(new ConsoleUIState.SensorStream
  52. {
  53. NetId = stream.NetId,
  54. Name = streamName,
  55. Unit = stream.Unit,
  56. Samples = stream.Samples.ToArray()
  57. });
  58. }
  59. sensors.Add(new ConsoleUIState.SensorData
  60. {
  61. NetId = data.NetId,
  62. Name = name,
  63. Address = address,
  64. DeviceType = data.DeviceType,
  65. Streams = streams.ToArray()
  66. });
  67. }
  68. return new ConsoleUIState
  69. {
  70. RetentionTime = comp.RetentionTime,
  71. Sensors = sensors.ToArray()
  72. };
  73. }
  74. SensorMonitoringIncrementalUpdate CalculateIncrementalUpdate()
  75. {
  76. var sensors = new ValueList<IncrementalUIState.SensorData>();
  77. var streams = new ValueList<IncrementalUIState.SensorStream>();
  78. var samples = new ValueList<SensorSample>();
  79. foreach (var data in comp.Sensors.Values)
  80. {
  81. streams.Clear();
  82. foreach (var stream in data.Streams.Values)
  83. {
  84. samples.Clear();
  85. foreach (var (sampleTime, value) in stream.Samples)
  86. {
  87. if (sampleTime >= comp.LastUIUpdate)
  88. samples.Add(new SensorSample(sampleTime - comp.LastUIUpdate, value));
  89. }
  90. streams.Add(new IncrementalUIState.SensorStream
  91. {
  92. NetId = stream.NetId,
  93. Unit = stream.Unit,
  94. Samples = samples.ToArray()
  95. });
  96. }
  97. sensors.Add(new IncrementalUIState.SensorData { NetId = data.NetId, Streams = streams.ToArray() });
  98. }
  99. return new IncrementalUIState
  100. {
  101. RelTime = comp.LastUIUpdate,
  102. RemovedSensors = comp.RemovedSensors.ToArray(),
  103. Sensors = sensors.ToArray(),
  104. };
  105. }
  106. }
  107. private static void ConsoleUIClosed(
  108. EntityUid uid,
  109. SensorMonitoringConsoleComponent component,
  110. BoundUIClosedEvent args)
  111. {
  112. if (!args.UiKey.Equals(SensorMonitoringConsoleUiKey.Key))
  113. return;
  114. component.InitialUIStateSent.Remove(args.Actor);
  115. }
  116. }