Program.Simulation.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using System.Collections.Generic;
  2. using System.Diagnostics;
  3. using Content.Server.Power.Pow3r;
  4. using Robust.Shared.Threading;
  5. using Robust.UnitTesting;
  6. using static Content.Server.Power.Pow3r.PowerState;
  7. namespace Pow3r
  8. {
  9. internal sealed partial class Program
  10. {
  11. private const int MaxTickData = 180;
  12. private PowerState _state = new();
  13. private Network _linking;
  14. private int _tickDataIdx;
  15. private bool _paused;
  16. private readonly string[] _solverNames =
  17. {
  18. nameof(BatteryRampPegSolver),
  19. nameof(NoOpSolver)
  20. };
  21. private readonly IPowerSolver[] _solvers = {
  22. new BatteryRampPegSolver(),
  23. new NoOpSolver()
  24. };
  25. private int _currentSolver;
  26. private readonly float[] _simTickTimes = new float[MaxTickData];
  27. private readonly Queue<object> _remQueue = new();
  28. private readonly Stopwatch _simStopwatch = new Stopwatch();
  29. private IParallelManager _parallel = new TestingParallelManager();
  30. private void Tick(float frameTime)
  31. {
  32. if (_paused)
  33. return;
  34. RunSingleStep(frameTime);
  35. }
  36. private void RunSingleStep(float frameTime)
  37. {
  38. _simStopwatch.Restart();
  39. _tickDataIdx = (_tickDataIdx + 1) % MaxTickData;
  40. _solvers[_currentSolver].Tick(frameTime, _state, _parallel);
  41. // Update tick history.
  42. foreach (var load in _state.Loads.Values)
  43. {
  44. var displayLoad = _displayLoads[load.Id];
  45. displayLoad.ReceivedPowerData[_tickDataIdx] = load.ReceivingPower;
  46. }
  47. foreach (var supply in _state.Supplies.Values)
  48. {
  49. var displaySupply = _displaySupplies[supply.Id];
  50. displaySupply.SuppliedPowerData[_tickDataIdx] = supply.CurrentSupply;
  51. }
  52. foreach (var battery in _state.Batteries.Values)
  53. {
  54. var displayBattery = _displayBatteries[battery.Id];
  55. displayBattery.StoredPowerData[_tickDataIdx] = battery.CurrentStorage;
  56. displayBattery.ReceivingPowerData[_tickDataIdx] = battery.CurrentReceiving;
  57. displayBattery.SuppliedPowerData[_tickDataIdx] = battery.CurrentSupply;
  58. }
  59. _simTickTimes[_tickDataIdx] = (float) _simStopwatch.Elapsed.TotalMilliseconds;
  60. }
  61. private void RunSingleStep()
  62. {
  63. RunSingleStep(1f/_tps);
  64. }
  65. // Link data is stored authoritatively on networks,
  66. // but for easy access it is replicated into the linked components.
  67. // This is updated here.
  68. private void RefreshLinks()
  69. {
  70. foreach (var battery in _state.Batteries.Values)
  71. {
  72. battery.LinkedNetworkCharging = default;
  73. battery.LinkedNetworkDischarging = default;
  74. }
  75. foreach (var load in _state.Loads.Values)
  76. {
  77. load.LinkedNetwork = default;
  78. }
  79. foreach (var supply in _state.Supplies.Values)
  80. {
  81. supply.LinkedNetwork = default;
  82. }
  83. foreach (var network in _state.Networks.Values)
  84. {
  85. foreach (var loadId in network.Loads)
  86. {
  87. var load = _state.Loads[loadId];
  88. load.LinkedNetwork = network.Id;
  89. }
  90. foreach (var supplyId in network.Supplies)
  91. {
  92. var supply = _state.Supplies[supplyId];
  93. supply.LinkedNetwork = network.Id;
  94. }
  95. foreach (var batteryId in network.BatteryLoads)
  96. {
  97. var battery = _state.Batteries[batteryId];
  98. battery.LinkedNetworkCharging = network.Id;
  99. }
  100. foreach (var batteryId in network.BatterySupplies)
  101. {
  102. var battery = _state.Batteries[batteryId];
  103. battery.LinkedNetworkDischarging = network.Id;
  104. }
  105. }
  106. }
  107. }
  108. }