Skip to content

Commit

Permalink
Fixed #42 (I think);
Browse files Browse the repository at this point in the history
Rewrote AntennaManager;
  • Loading branch information
Sander Hoksbergen committed Aug 15, 2013
1 parent 321444d commit fd60a26
Show file tree
Hide file tree
Showing 11 changed files with 165 additions and 113 deletions.
130 changes: 72 additions & 58 deletions src/AntennaManager.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections;
using System.Collections.Generic;


namespace RemoteTech {
public class AntennaManager : IDisposable {
public class AntennaManager : IDisposable, IEnumerable<IAntenna> {
public delegate void AntennaHandler(IAntenna satellite);

public event AntennaHandler Registered;
public event AntennaHandler Unregistered;

public IEnumerable<IAntenna> this[ISatellite s] { get { return For(s.Guid); } }
public IEnumerable<IAntenna> this[Vessel v] { get { return For(v.id); } }
public IEnumerable<IAntenna> this[Guid g] { get { return For(g); } }

private readonly Dictionary<Guid, List<IAntenna>> mLoadedAntennaCache =
new Dictionary<Guid, List<IAntenna>>();
private readonly Dictionary<Guid, List<IAntenna>> mProtoAntennaCache =
Expand All @@ -20,78 +26,37 @@ public AntennaManager(RTCore core) {
GameEvents.onVesselGoOnRails.Add(OnVesselGoOnRails);
}

public IEnumerable<IAntenna> For(Vessel vessel) {
return For(vessel.id);
public void Dispose() {
GameEvents.onVesselGoOnRails.Remove(OnVesselGoOnRails);
}

public IEnumerable<IAntenna> For(ISatellite satellite) {
return For(satellite.Guid);
}
public void Register(Guid key, IAntenna antenna) {
RTUtil.Log("AntennaManager: Register: {0}, {1}", key, antenna.Name);

public IEnumerable<IAntenna> For(Guid key) {
if (mLoadedAntennaCache.ContainsKey(key)) {
return mLoadedAntennaCache[key];
}
if (mProtoAntennaCache.ContainsKey(key)) {
return mProtoAntennaCache[key];
}
return Enumerable.Empty<IAntenna>();
}

public void RegisterProtoFor(Vessel vessel) {
RTUtil.Log("AntennaManager: RegisterProto: " + vessel);
Guid key = vessel.id;

if (!mProtoAntennaCache.ContainsKey(key)) {
mProtoAntennaCache[key] = new List<IAntenna>();
// Unregister remaining proto-antennas.
UnregisterProtos(key);
}

mProtoAntennaCache[key].Clear();

foreach (ProtoPartSnapshot pps in vessel.protoVessel.protoPartSnapshots) {
foreach (ProtoPartModuleSnapshot ppms in pps.modules.Where(x => x.IsAntenna())) {
IAntenna protoAntenna = new ProtoAntenna(vessel, pps, ppms);
if (protoAntenna != null) {
// Initialisation can fail.
mProtoAntennaCache[key].Add(protoAntenna);
OnRegister(protoAntenna);
}
}
}
}

public void UnregisterProtoFor(Vessel vessel) {
RTUtil.Log("AntennaManager: UnregisterProto: " + vessel);
Guid key = vessel.id;

if (!mProtoAntennaCache.ContainsKey(key)) return;

foreach (IAntenna a in mProtoAntennaCache[key]) {
OnUnregister(a);
}

mProtoAntennaCache.Remove(key);
}

public Guid Register(Guid key, IAntenna antenna) {
RTUtil.Log("AntennaManager: Register: " + key + ", " + antenna.Name);
if (!mLoadedAntennaCache.ContainsKey(key)) {
mLoadedAntennaCache[key] = new List<IAntenna>();
}

// Add the antenna if no duplicate exists for that key; fire event.
IAntenna instance = mLoadedAntennaCache[key].Find(x => x == antenna);
if (instance == null) {
mLoadedAntennaCache[key].Add(antenna);
OnRegister(antenna);
}
return key;
}

public void Unregister(Guid key, IAntenna antenna) {
RTUtil.Log("AntennaManager: Unregister: " + key + ", " + antenna.Name);
RTUtil.Log("AntennaManager: Unregister: {0}, {1}", key, antenna.Name);

// Return if no antennas are loaded at all.
if (!mLoadedAntennaCache.ContainsKey(key)) return;

// Find registered antenna and delete it; fire event; delete list if empty.
int instance_id = mLoadedAntennaCache[key].FindIndex(x => x == antenna);

if (instance_id != -1) {
mLoadedAntennaCache[key].RemoveAt(instance_id);
if (mLoadedAntennaCache[key].Count == 0) {
Expand All @@ -101,9 +66,53 @@ public void Unregister(Guid key, IAntenna antenna) {
}
}

public void RegisterProtos(Vessel v) {
Guid key = v.id;
RTUtil.Log("AntennaManager: RegisterProtos: {0}, {1}", key, v.vesselName);

// Refuse to load ProtoAntennas if physical ones exist.
if (mLoadedAntennaCache.ContainsKey(key)) return;

// Iterate over all parts and try to register ProtoAntennas for them.
foreach (ProtoPartSnapshot pps in v.protoVessel.protoPartSnapshots) {
foreach (ProtoPartModuleSnapshot ppms in pps.modules) {
if (ppms.IsAntenna()) {
if (!mProtoAntennaCache.ContainsKey(key)) {
mProtoAntennaCache[key] = new List<IAntenna>();
}
ProtoAntenna new_pa = new ProtoAntenna(v, pps, ppms);
mProtoAntennaCache[key].Add(new_pa);
OnRegister(new_pa);
}
}
}
}

public void UnregisterProtos(Guid key) {
RTUtil.Log("AntennaManager: UnregisterProtos: {0}", key);
// Return if no ProtoAntennas are loaded at all.
if (!mProtoAntennaCache.ContainsKey(key)) return;

// Unregister ProtoAntennas
foreach (IAntenna a in mProtoAntennaCache[key]) {
OnUnregister(a);
}
mProtoAntennaCache.Remove(key);
}

private IEnumerable<IAntenna> For(Guid key) {
if (mLoadedAntennaCache.ContainsKey(key)) {
return mLoadedAntennaCache[key];
}
if (mProtoAntennaCache.ContainsKey(key)) {
return mProtoAntennaCache[key];
}
return Enumerable.Empty<IAntenna>();
}

private void OnVesselGoOnRails(Vessel v) {
if (v.parts.Count == 0) {
RegisterProtoFor(v);
RegisterProtos(v);
}
}

Expand All @@ -119,8 +128,13 @@ private void OnUnregister(IAntenna antenna) {
}
}

public void Dispose() {
GameEvents.onVesselGoOnRails.Remove(OnVesselGoOnRails);
public IEnumerator<IAntenna> GetEnumerator() {
return mLoadedAntennaCache.Values.SelectMany(l => l).Concat(
mProtoAntennaCache.Values.SelectMany(l => l)).GetEnumerator();
}

IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
}

Expand Down
76 changes: 58 additions & 18 deletions src/DebugUnit.cs
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Reflection;
using System.Text;
Expand Down Expand Up @@ -28,35 +31,72 @@ private void Dump() {
dump.AppendFormat("RemoteTech State @ {0}, ID: {1}",
System.DateTime.Now.ToUniversalTime(),
GitRevisionProvider.GetHash()).AppendLine();
dump.Append('-', 80).AppendLine();

dump.AppendLine("Active VesselSatellites: ").Append('-', 80).AppendLine();
dump.Append('-', 80).AppendLine().AppendLine();

foreach (var satellite in RTCore.Instance.Satellites) {
dump.AppendFormat("Name: {0} ({1})", satellite.Name, satellite.Guid).AppendLine();
dump.AppendFormat("Powered: {0}", satellite.Powered.ToString()).AppendLine();
dump.AppendFormat("Connection: {0}", satellite.Connection.Exists.ToString()).AppendLine();
dump.AppendFormat("OmniRange: {0}", satellite.Omni.ToString()).AppendLine();
foreach(var dish in satellite.Dishes) {
var target = RTCore.Instance.Network[dish.Target];
dump.AppendFormat("AbstractDish(Target = {0} ({1}), Distance = {2}, Factor = {3})",
target == null ? "Unknown Target" : target.Name, dish.Target, dish.Distance, dish.Factor).AppendLine();
dump.AppendLine().AppendLine("VesselSatellite:").Append('-', 80).AppendLine();
var satellite_dict = new OrderedDictionary();
satellite_dict.Add("Name", satellite.Name);
satellite_dict.Add("Guid", satellite.Guid.ToString());
satellite_dict.Add("AbstractOmniRange", satellite.Omni.ToString());

var abstract_dishes = new StringBuilder().AppendLine();
foreach (var dish in satellite.Dishes) {
var dish_dict = new OrderedDictionary();
dish_dict.Add("Target", dish.Target);
dish_dict.Add("Target Name", RTCore.Instance.Network[dish.Target] == null ? "Unknown Target" : RTCore.Instance.Network[dish.Target].Name);
dish_dict.Add("Distance", dish.Distance);
dish_dict.Add("Dish Factor", dish.Factor);
dish_dict.Add("Dish Angle", (Math.Acos(dish.Factor) / Math.PI * 180 * 2).ToString("F2") + " degrees");
foreach (DictionaryEntry kvp in dish_dict) {
abstract_dishes.AppendFormat(" {0}: {1}", kvp.Key.ToString(), kvp.Value.ToString()).AppendLine();
}
abstract_dishes.AppendLine();
}
foreach(var antenna in RTCore.Instance.Antennas.For(satellite.Vessel)) {
dump.AppendFormat("PhysicalAntenna(Name = {0}, Powered = {1}, Omni = {2}, Dish = {3}, Target = {4}, Proto = {5})",
antenna.Name, "N/A", antenna.OmniRange, antenna.DishRange, antenna.DishTarget, antenna is ProtoAntenna).AppendLine();

var physical_antennas = new StringBuilder().AppendLine();
foreach(var antenna in RTCore.Instance.Antennas[satellite]) {
var antenna_dict = new OrderedDictionary();
antenna_dict.Add("Name", antenna.Name);
antenna_dict.Add("Proto?", antenna is ProtoAntenna);
antenna_dict.Add("Powered", "N/A");
antenna_dict.Add("OmniRange", antenna.OmniRange);
antenna_dict.Add("DishRange", antenna.DishRange);
antenna_dict.Add("Target Guid", antenna.DishTarget);
foreach (DictionaryEntry kvp in antenna_dict) {
physical_antennas.AppendFormat(" {0}: {1}", kvp.Key.ToString(), kvp.Value.ToString()).AppendLine();
}
physical_antennas.AppendLine();
}

satellite_dict.Add("AbstractDishes", abstract_dishes);
satellite_dict.Add("PhysicalAntennas", physical_antennas);

foreach (DictionaryEntry kvp in satellite_dict) {
dump.AppendFormat("{0}: {1}", kvp.Key.ToString(), kvp.Value.ToString()).AppendLine();
}
dump.AppendLine();
}
dump.AppendLine();

dump.AppendLine("Active Antennas").Append('-', 80).AppendLine();
dump.AppendLine("All Antennas").Append('-', 80).AppendLine();
foreach (var antenna in RTCore.Instance.Antennas) {
dump.AppendFormat("Antenna(Name = {0}, Powered = {1}, Omni = {2}, Dish = {3}, Target = {4}",
antenna.Name, "N/A", antenna.OmniRange, antenna.DishRange, antenna.DishTarget).AppendLine();
var antenna_dict = new OrderedDictionary();
antenna_dict.Add("Name", antenna.Name);
antenna_dict.Add("Proto?", antenna is ProtoAntenna);
antenna_dict.Add("Powered", "N/A");
antenna_dict.Add("OmniRange", antenna.OmniRange);
antenna_dict.Add("DishRange", antenna.DishRange);
antenna_dict.Add("Target Guid", antenna.DishTarget);
foreach (DictionaryEntry kvp in antenna_dict) {
dump.AppendFormat("{0}: {1}", kvp.Key.ToString(), kvp.Value.ToString()).AppendLine();
}
dump.AppendLine();
}

System.IO.File.WriteAllText(@"./rt_dump.txt", dump.ToString());
}


}

internal static class GitRevisionProvider {
Expand Down
2 changes: 1 addition & 1 deletion src/GUI/SatelliteConfigFragment.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public SatelliteConfigFragment(VesselSatellite vs, OnClick forceClose, OnAntenna
}

public void RebuildAntennaList() {
mFocusAntennas = RTCore.Instance.Antennas.For(mFocus).Where(a => a.CanTarget).ToList();
mFocusAntennas = RTCore.Instance.Antennas[mFocus].Where(a => a.CanTarget).ToList();
}

private void OnSatellite(ISatellite satellite) {
Expand Down
3 changes: 2 additions & 1 deletion src/Hacks/EZGUIPointerDisablePatcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,9 @@ public static void Unregister(EZGUIRequestRectDelegate del) {

private void EZGUIMouseTouchPtrListener(POINTER_INFO ptr) {
if (mDelegate == null || mDelegate.GetInvocationList().Length == 0) {
this.Dispose();
Dispose();
mInstance = null;
return;
}
foreach (EZGUIRequestRectDelegate d in mDelegate.GetInvocationList()) {
if (d().Contains(new Vector2(ptr.devicePos.x, Screen.height - ptr.devicePos.y))) {
Expand Down
2 changes: 1 addition & 1 deletion src/Hacks/TimeQuadrantPatcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ private String DisplayText {
} else if (vs.LocalControl) {
return "Local Control";
} else if (vs.Connection.Exists) {
return "D+" + vs.Connection.Delay + "s";
return "D+" + vs.Connection.Delay.ToString("F3") + "s";
}
return "Not Connected";
}
Expand Down
1 change: 1 addition & 0 deletions src/Interfaces/ProtoAntenna.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ public ProtoAntenna(Vessel v, ProtoPartSnapshot p, ProtoPartModuleSnapshot ppms)
DishRange = 0.0f;
DishFactor = 1.0f;
OmniRange = 0.0f;
RTUtil.Log("ProtoAntenna parsing error. Default values assumed.");
}

mProtoPart = p;
Expand Down
12 changes: 7 additions & 5 deletions src/Modules/ModuleRTAntenna.cs
Original file line number Diff line number Diff line change
Expand Up @@ -175,8 +175,6 @@ public virtual void SetState(bool state) {
state = false;
}
IsRTActive = state;
RTDishRange = DishRange;
RTOmniRange = OmniRange;
Events["EventOpen"].guiActive = !IsRTActive && !IsRTBroken;
Events["EventOpen"].active = Events["EventOpen"].guiActive;
Events["EventClose"].guiActive = IsRTActive && !IsRTBroken;
Expand Down Expand Up @@ -240,7 +238,7 @@ public override void OnLoad(ConfigNode node) {
}
}
if (node.HasValue("DishAngle")) {
RTDishFactor = Math.Cos(DishAngle * Math.PI / 180);
RTDishFactor = Math.Cos(DishAngle / 2 * Math.PI / 180);
}
}

Expand All @@ -266,7 +264,8 @@ public override void OnStart(StartState state) {
if (RTCore.Instance != null) {
GameEvents.onVesselWasModified.Add(OnVesselModified);
GameEvents.onPartUndock.Add(OnPartUndock);
mRegisteredId = RTCore.Instance.Antennas.Register(vessel.id, this);
mRegisteredId = vessel.id;
RTCore.Instance.Antennas.Register(vessel.id, this);
SetState(IsRTActive);
}
}
Expand Down Expand Up @@ -317,6 +316,8 @@ public void FixedUpdate() {
GUI_Status = "Malfunction";
break;
}
RTDishRange = DishRange;
RTOmniRange = OmniRange;
UpdateContext();
}

Expand All @@ -340,7 +341,8 @@ private void OnVesselModified(Vessel v) {
RTCore.Instance.Antennas.Unregister(mRegisteredId, this);
mRegisteredId = Guid.Empty;
if (vessel != null) {
mRegisteredId = RTCore.Instance.Antennas.Register(vessel.id, this);
mRegisteredId = vessel.id;
RTCore.Instance.Antennas.Register(vessel.id, this);
}
}
}
Expand Down
Loading

0 comments on commit fd60a26

Please sign in to comment.