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;
string expected=P.Config.Text("Watchdog","BusinessId","");
if(expected.Length>0 && packet.From!=expected)return;
long 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)
{
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 {get {return 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=i.Get("watchdog","Tripped").ToBoolean();armed=false;}
}
}
}
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;
string expected=P.Config.Text("Watchdog","BusinessId","");
if(expected.Length>0 && packet.From!=expected)return;
long 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)
{
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 {get {return 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=i.Get("watchdog","Tripped").ToBoolean();armed=false;}
}
}
}