using System; using System.Collections.Generic; using Sandbox.ModAPI.Ingame; using VRage.Game.ModAPI.Ingame.Utilities; namespace AutoMiningScript { public partial class Program { public sealed class WatchdogController : RoleLogic { bool armed,tripped; string businessSession="",businessId=""; long businessAddress; double heartbeat=-100,nextReply; public WatchdogController(Program p):base(p) { } public override void Tick(double dt) { if(armed && P.Now-heartbeat>P.Config.Number("Watchdog","Timeout",3,1,30)) {tripped=true;armed=false;P.SafeClear();P.Log(L.FleetWatchdogTripped);} if(businessId.Length>0 && P.Now>=nextReply) { nextReply=P.Now+0.5;var body=new MyIni();body.Set("watchdog","Grid",P.Me.CubeGrid.EntityId); P.Bus.Send(armed&&!tripped?"WATCH_READY":"WATCH_TRIPPED",businessId,body,false,businessAddress); } } public override void Receive(Packet packet) { if(packet.Kind!="WATCH_HEARTBEAT" || Data.ReadLong(packet.Body,"watchdog","Grid")!=P.Me.CubeGrid.EntityId)return; var expected=P.Config.Text("Watchdog","BusinessId",""); if(expected.Length>0 && packet.From!=expected)return; var address=Data.ReadLong(packet.Body,"watchdog","Business"); var block=P.GridTerminalSystem.GetBlockWithId(address) as IMyProgrammableBlock; if(block==null || block.CubeGrid!=P.Me.CubeGrid || packet.Source!=block.EntityId)return; if(businessId.Length>0 && (businessId!=packet.From || businessAddress!=packet.Source))return; if(armed && businessSession.Length>0 && businessSession!=packet.Session) {P.SafeClear();tripped=true;armed=false;P.Log(L.FleetWatchdogBusinessRestarted);} businessSession=packet.Session;businessId=packet.From;businessAddress=packet.Source;heartbeat=P.Now; } public override void Command(string command) { command=Settings.NormalizeCommand(command); if(command=="arm") { if(P.Now-heartbeat>1) {P.Log(L.FleetWatchdogHeartbeatMissing);return;} tripped=false;armed=true;P.Log(L.FleetWatchdogArmedMessage); } else if(command=="trip" || command=="release") {tripped=true;armed=false;P.SafeClear();P.Log(L.FleetWatchdogManualTrip);} else if(command=="diagnose")P.Log(Diagnostics); else P.Log(L.FleetWatchdogCommands); } public override void Emergency(string reason) {armed=false;tripped=true;P.SafeClear();P.Log(reason);} public override string Diagnostics => L.F(L.FleetWatchdogDiagnostics,armed?L.FleetWatchdogArmed:tripped?L.FleetWatchdogFault:L.FleetWatchdogDisarmed,P.Now-heartbeat); public override void Save(MyIni i) {i.Set("watchdog","Tripped",tripped);} public override void Load(MyIni i) {tripped=Data.Flag(i,"watchdog","Tripped");armed=false;} } } }