public float ProducePower(float requestedPower) { if (this.SolarChargers.Count == 0 && this.SolarChargerMk2.Count == 0) { SolarState = SolarState.None; return(0f); } float solarStatus = GetSolarStatus(Cyclops); float availableSolarEnergy = SolarChargingFactor * solarStatus; solarPercentage = solarStatus * 100; if (availableSolarEnergy > PowerManager.MinimalPowerValue) { SolarState = SolarState.SunAvailable; float mk1Power = this.SolarChargers.Count * availableSolarEnergy; float mk2Power = this.SolarChargerMk2.Count * availableSolarEnergy * PowerManager.Mk2ChargeRateModifier; this.SolarChargerMk2.RechargeBatteries(mk1Power + mk2Power); return(mk1Power + mk2Power); } else if (this.ThermalCharginer.ThermalState != ThermalState.HeatAvailable && this.SolarChargerMk2.BatteryHasCharge) { SolarState = SolarState.BatteryAvailable; return(this.SolarChargerMk2.GetBatteryPower(PowerManager.BatteryDrainRate, requestedPower)); } else { SolarState = SolarState.None; return(0f); } }
public void Tick(SolarState state, float solarRotorPosition, double elapsedTime) { if (elapsedTime < 4000 && _lastState != null) { _timestamp += elapsedTime; Transition transition = GetTransition(state, solarRotorPosition); UpdateHistory(transition); } _lastState = state; }
public SolarState Handle(SolarManager manager) { SolarState next = Next(manager); if (next != null) { Transition(this, next, manager); } else { Act(manager); next = this; } return(next); }
private void Init() { // launch tests // TestSuite.AllTests.TestAll(); // Initialization mainBatteriesManager = new BatteryManager(battery => battery.CubeGrid == Me.CubeGrid); connectedBatteriesManager = new BatteryManager(battery => battery.CubeGrid != Me.CubeGrid); display = new SolarDisplay("Main Base Solar LCD Panel", false); solarManager = new SolarManager("A"); dayTracker = new DayTracker(); Deserializer deserializer = new Deserializer(Me.CustomData); solarManager.Deserialize(deserializer); dayTracker.Deserialize(deserializer); solarState = SolarState.Deserialize(deserializer.Get("solarState")); }
public void Main(string argument, UpdateType updateSource) { ME = Me; GTS = GridTerminalSystem; ECHO = Echo; try { if (solarManager == null) { Init(); } if (String.IsNullOrEmpty(argument)) { Tick(); } else { if (argument == "reset") { solarState = SolarState.Transition(solarState, new SolarStateReseting(), solarManager); } else if (argument == "idle") { solarState = SolarState.Transition(solarState, new SolarStateIdlingDay(), solarManager); } else if (argument.StartsWith("addPylon")) { string[] args = argument.Split(null as char[], StringSplitOptions.RemoveEmptyEntries); for (int i = 1; i < args.Length; ++i) { solarManager.AddPylon(args[i]); } } } } catch (Exception e) { // Dump the exception content to the Echo("An error occurred during script execution."); Echo($"Exception: {e}\n---"); // Rethrow the exception to make the programmable block halt execution properly throw; } }
private TransitionTypeEnum GetTransitionType(SolarState newState) { if (_lastState == null) { return(TransitionTypeEnum.Irrelevant); } else if (_lastState.GetName() == newState.GetName()) { // apparently can't check types directly return(TransitionTypeEnum.None); } else if (_lastState is SolarStateIdlingDay && newState is SolarStateChasing) { return(TransitionTypeEnum.IdlingToChasing); } else if (_lastState is SolarStateChasing && newState is SolarStateIdlingDay) { return(TransitionTypeEnum.ChasingToIdling); } else if (_lastState is SolarStateChasing && newState is SolarStateIdlingDusk) { return(TransitionTypeEnum.DayToDusk); } else if (_lastState is SolarStateIdlingDusk && newState is SolarStateReseting) { return(TransitionTypeEnum.DuskToNight); } else if (_lastState is SolarStateIdlingNight && newState is SolarStateIdlingDawn) { return(TransitionTypeEnum.NightToDawn); } else if (_lastState is SolarStateIdlingDawn && newState is SolarStateChasing) { return(TransitionTypeEnum.DawnToDay); } else { return(TransitionTypeEnum.Irrelevant); } }
private void Tick() { switch (updateCounter % 3) { case 0: mainBatteriesManager.UpdateFromGrid(); break; case 1: connectedBatteriesManager.UpdateFromGrid(); break; case 2: solarManager.UpdateFromGrid(); break; } ++updateCounter; solarManager.Tick(); solarState = solarState.Handle(solarManager); dayTracker.Tick(solarState, solarManager.WitnessPosition, Runtime.TimeSinceLastRun.TotalMilliseconds); UpdateDisplay(); }
public static SolarState Transition(SolarState oldState, SolarState newState, SolarManager manager) { oldState.Stop(manager); newState.Start(manager); return(newState); }
private Transition GetTransition(SolarState newState, float solarRotorPosition) => new Transition { Type = GetTransitionType(newState), Timestamp = _timestamp, EstimatedTime = EstimateTimeFromPosition(solarRotorPosition) };