diff --git a/AirMonitor/AirZone.cs b/AirMonitor/AirZone.cs index 3cd6586..06605e3 100644 --- a/AirMonitor/AirZone.cs +++ b/AirMonitor/AirZone.cs @@ -13,7 +13,7 @@ namespace IngameScript public string Name { get; private set; } public List Vents { get; private set; } - private MyIni _ini; + private IConsoleProgram _program; private List _doors; private List _displays; private PrefixedConsole _console; @@ -24,7 +24,7 @@ namespace IngameScript public AirZone(string zoneName, IConsoleProgram program) { Name = zoneName; - _ini = program.Ini; + _program = program; _console = new PrefixedConsole(program.Console, zoneName); _sequencer = new Sequencer(zoneName, _console); Vents = new List(); @@ -41,7 +41,10 @@ namespace IngameScript else if (block is IMyDoor) { _doors.Add(block as IMyDoor); - SequenceableDoor wrapped = SequenceableFactory.MakeSequenceable(block as IMyDoor, _ini, "airMonitor") as SequenceableDoor; + SequenceableDoor wrapped = SequenceableFactory.MakeSequenceable( + block as IMyDoor, + _program.Ini, + "airMonitor") as SequenceableDoor; wrapped.Step = 0; wrapped.DeployOpen = false; wrapped.LockOpen = false; @@ -71,31 +74,22 @@ namespace IngameScript if (vent.GetOxygenLevel() < TriggerLevel) Triggered = true; } + // TODO: add informational lights per-zone if (Triggered == true) { _console.Print($"Low pressure alarm triggered."); + // close the doors IEnumerator job = _sequencer.RunSequence(true); - while (job.MoveNext()) yield return true; - - while (Triggered) - { - // if any of the doors become re-enabled, reset and unlock all of them; - // think of it as a player manually overriding the safety protocols. - // Note that this means resets propagate across zones that share doors, - // which will likely be all of them. Which is a *little* bit of a - // bug, but it's better than never re-triggering - foreach (IMyDoor door in _doors) - { - if (door.Enabled) - { - Reset(); - break; - } - } + while (job.MoveNext()) { + // It would be nice if the API had UpdateFrequency.Once10, e.g. "re-run in 10 ticks and then clear the flag" + // We'll just monitor every tick instead. + _program.Runtime.UpdateFrequency |= UpdateFrequency.Once; yield return true; } + while (Triggered) yield return true; + // unlock the doors, but we'll leave them closed. foreach (IMyDoor door in _doors) { door.Enabled = true; } } diff --git a/AirMonitor/Program.cs b/AirMonitor/Program.cs index bae82a1..cd6ac9d 100644 --- a/AirMonitor/Program.cs +++ b/AirMonitor/Program.cs @@ -2,6 +2,7 @@ using SpaceEngineers.Game.ModAPI.Ingame; using System.Collections; using System.Collections.Generic; +using System.Linq; using System.Text; using VRage.Game.ModAPI.Ingame.Utilities; @@ -92,7 +93,7 @@ namespace IngameScript Console.Print(kvp.Key); _jobs.Add(zone.Monitor()); } - Runtime.UpdateFrequency |= UpdateFrequency.Update100; + Runtime.UpdateFrequency = UpdateFrequency.Update100; } public void Main(string argument, UpdateType updateSource) @@ -104,13 +105,17 @@ namespace IngameScript _cli.TryParse(argument); if (_cli.Switch("reset")) { - for (int i = 0; i < _cli.ArgumentCount; i++) + List zonesToReset; + if (_cli.ArgumentCount == 0) zonesToReset = _zones.Keys.ToList(); + else zonesToReset = new List(); + for (int i = 0; i < _cli.ArgumentCount; i++) zonesToReset.Add(_cli.Argument(i)); + + foreach (string zone in zonesToReset) { - string zone = _cli.Argument(i); - Console.Print($"Resetting {zone}."); - if (_zones.ContainsKey(zone)) { - _zones[zone].Reset(); + Console.Print($"Resetting {zone}."); + if (_zones.ContainsKey(zone)) _zones[zone].Reset(); + } } } @@ -121,6 +126,7 @@ namespace IngameScript if (job.MoveNext()) continue; Console.Print("WARNING: Monitoring job exited. Zone no longer being monitored."); } + } // write diagnostics to any configured display screens diff --git a/Airlock/Program.cs b/Airlock/Program.cs index 2135af5..fa14fe0 100644 --- a/Airlock/Program.cs +++ b/Airlock/Program.cs @@ -65,7 +65,7 @@ namespace IngameScript if (updateSource == UpdateType.Trigger || updateSource == UpdateType.Terminal) { _cli.TryParse(argument); - if (_cli.ArgumentCount == 0) { Console.Print("You must provide an airlock ID."); } + if (_cli.ArgumentCount == 0) Console.Print("Airlock ID not provided."); else { string airlockName = _cli.Argument(0); @@ -74,7 +74,7 @@ namespace IngameScript else { _jobs.Add(_airlocks[airlockName].CycleAirlock()); - Runtime.UpdateFrequency |= UpdateFrequency.Update1; + Runtime.UpdateFrequency |= UpdateFrequency.Update10; } } } diff --git a/MechanicalDoor/Program.cs b/MechanicalDoor/Program.cs index 158bc9d..19fedef 100644 --- a/MechanicalDoor/Program.cs +++ b/MechanicalDoor/Program.cs @@ -91,7 +91,7 @@ namespace IngameScript { _jobs.Add(door.RunSequence(deploy)); } - Runtime.UpdateFrequency |= UpdateFrequency.Update1; + Runtime.UpdateFrequency |= UpdateFrequency.Update10; } } diff --git a/Mixins/Console/Console.cs b/Mixins/Console/Console.cs index f6a0181..38e4f60 100644 --- a/Mixins/Console/Console.cs +++ b/Mixins/Console/Console.cs @@ -17,6 +17,7 @@ namespace IngameScript { MyIni Ini { get; } Program.IConsole Console { get; } + IMyGridProgramRuntimeInfo Runtime { get; } } partial class Program