public void Run(ZACommons commons, EventDriver eventDriver) { if (!Active) { return; } TotalPower = 0.0f; var solarGroups = commons.GetBlockGroupsWithPrefix(MAX_POWER_GROUP_PREFIX); foreach (var group in solarGroups) { var rotor = GetRotor(group); if (rotor == null) { commons.Echo(string.Format("Group {0} ignored; needs exactly 1 rotor", group.Name)); continue; } else if (rotor.CubeGrid != commons.Me.CubeGrid) { // Skip if rotor is on a different grid than this programmable block continue; } var solarPanelDetails = new SolarPanelDetails(group); var currentMaxPower = solarPanelDetails.MaxPowerOutput; float maxPower; if (!MaxPowers.TryGetValue(group.Name, out maxPower)) { maxPower = -100.0f; } var minError = solarPanelDetails.DefinedPowerOutput * SOLAR_ROTOR_MIN_ERROR; var delta = currentMaxPower - maxPower; MaxPowers[group.Name] = currentMaxPower; if (delta > minError || currentMaxPower < minError /* failsafe */) { // Keep going rotor.Enabled = true; } else if (delta < -minError) { // Back up rotor.Enabled = true; rotor.ApplyAction("Reverse"); } else { // Hold still for a moment rotor.Enabled = false; } TotalPower += currentMaxPower; } eventDriver.Schedule(RunDelay, Run); }
public void Run(ZACommons commons, EventDriver eventDriver) { if (!Active) return; TotalPower = 0.0f; var solarGroups = commons.GetBlockGroupsWithPrefix(MAX_POWER_GROUP_PREFIX); for (var e = solarGroups.GetEnumerator(); e.MoveNext();) { var group = e.Current; var rotor = GetRotor(group); if (rotor == null) { commons.Echo(string.Format("Group {0} ignored; needs exactly 1 rotor", group.Name)); continue; } else if (rotor.CubeGrid != commons.Me.CubeGrid) { // Skip if rotor is on a different grid than this programmable block continue; } var solarPanelDetails = new SolarPanelDetails(group); var currentMaxPower = solarPanelDetails.MaxPowerOutput; float maxPower; if (!MaxPowers.TryGetValue(group.Name, out maxPower)) maxPower = -100.0f; var minError = solarPanelDetails.DefinedPowerOutput * SOLAR_ROTOR_MIN_ERROR; var delta = currentMaxPower - maxPower; MaxPowers[group.Name] = currentMaxPower; if (delta > minError || currentMaxPower < minError /* failsafe */) { // Keep going rotor.SetValue<bool>("OnOff", true); } else if (delta < -minError) { // Back up rotor.SetValue<bool>("OnOff", true); rotor.ApplyAction("Reverse"); } else { // Hold still for a moment rotor.SetValue<bool>("OnOff", false); } TotalPower += currentMaxPower; } eventDriver.Schedule(RunDelay, Run); }
public void Run(ZACommons commons, EventDriver eventDriver) { if (!Active) { return; } var shipControl = (ShipControlCommons)commons; var gyroControl = shipControl.GyroControl; var currentAxis = AllowedAxes[AxisIndex]; if (MaxPower == null) { MaxPower = -100.0f; // Start with something absurdly low to kick things off gyroControl.Reset(); gyroControl.EnableOverride(true); gyroControl.SetAxisVelocity(currentAxis, LastVelocities[AxisIndex]); TimeOnAxis = eventDriver.TimeSinceStart + AxisTimeout; } var solarPanelDetails = new SolarPanelDetails(commons.Blocks); CurrentMaxPower = solarPanelDetails.MaxPowerOutput; var minError = solarPanelDetails.DefinedPowerOutput * SOLAR_GYRO_MIN_ERROR; var delta = CurrentMaxPower - MaxPower; MaxPower = CurrentMaxPower; if (delta > minError) { // Keep going gyroControl.EnableOverride(true); } else if (delta < -minError) { // Back up gyroControl.EnableOverride(true); LastVelocities[AxisIndex] = -LastVelocities[AxisIndex]; gyroControl.SetAxisVelocity(currentAxis, LastVelocities[AxisIndex]); } else { // Hold still gyroControl.EnableOverride(false); } if (TimeOnAxis <= eventDriver.TimeSinceStart && MaxPower < solarPanelDetails.DefinedPowerOutput * (1.0f - SOLAR_GYRO_MIN_ERROR)) { // Time out, try next axis AxisIndex++; AxisIndex %= AllowedAxes.Length; gyroControl.Reset(); gyroControl.EnableOverride(true); gyroControl.SetAxisVelocity(AllowedAxes[AxisIndex], LastVelocities[AxisIndex]); TimeOnAxis = eventDriver.TimeSinceStart + AxisTimeout; } eventDriver.Schedule(RunDelay, Run); }
public void Run(ZACommons commons, EventDriver eventDriver) { if (!Active) return; var shipControl = (ShipControlCommons)commons; var gyroControl = shipControl.GyroControl; var currentAxis = AllowedAxes[AxisIndex]; if (MaxPower == null) { MaxPower = -100.0f; // Start with something absurdly low to kick things off gyroControl.Reset(); gyroControl.EnableOverride(true); gyroControl.SetAxisVelocity(currentAxis, LastVelocities[AxisIndex]); TimeOnAxis = eventDriver.TimeSinceStart + AxisTimeout; } var solarPanelDetails = new SolarPanelDetails(commons.Blocks); CurrentMaxPower = solarPanelDetails.MaxPowerOutput; var minError = solarPanelDetails.DefinedPowerOutput * SOLAR_GYRO_MIN_ERROR; var delta = CurrentMaxPower - MaxPower; MaxPower = CurrentMaxPower; if (delta > minError) { // Keep going gyroControl.EnableOverride(true); } else if (delta < -minError) { // Back up gyroControl.EnableOverride(true); LastVelocities[AxisIndex] = -LastVelocities[AxisIndex]; gyroControl.SetAxisVelocity(currentAxis, LastVelocities[AxisIndex]); } else { // Hold still gyroControl.EnableOverride(false); } if (TimeOnAxis <= eventDriver.TimeSinceStart && MaxPower < solarPanelDetails.DefinedPowerOutput * (1.0f - SOLAR_GYRO_MIN_ERROR)) { // Time out, try next axis AxisIndex++; AxisIndex %= AllowedAxes.Length; gyroControl.Reset(); gyroControl.EnableOverride(true); gyroControl.SetAxisVelocity(AllowedAxes[AxisIndex], LastVelocities[AxisIndex]); TimeOnAxis = eventDriver.TimeSinceStart + AxisTimeout; } eventDriver.Schedule(RunDelay, Run); }