public static double GetREALSignal(CommNet.CommPath path) { double signal = 1d; bool first = true; foreach (CommNet.CommLink link in path) { signal *= GetREALSignal(link, !first); first = false; } return(signal); }
public virtual RealAntenna AntennaTowardsHome() { CommNet.CommPath path = new CommNet.CommPath(); if (!(Net.FindHome(this, path))) { return(null); } if (this[path.First.end] is RACommLink link) { return(link.start.Equals(this) ? link.FwdAntennaTx: link.RevAntennaTx); } return(null); }
public static void RAKerbalismLinkHandler(object p1, Vessel v) { if (CommNet.CommNetScenario.CommNetEnabled && v.Connection is RACommNetVessel raCNV && raCNV.Comm is RACommNode node) { bool powered = (bool)p1.GetType().GetField("powered").GetValue(p1); bool transmitting = (bool)p1.GetType().GetField("transmitting").GetValue(p1); double ecIdle = powered ? raCNV.IdlePowerDraw() : 0; double ec = ecIdle, rate = 0, strength = 0, packetInterval = 1.0f; int status = 2; string target_name = "NotConnected"; List <string[]> sList = new List <string[]>(); if (!v.loaded) { raCNV.powered = powered; } if (powered && node.AntennaTowardsHome() is RealAntenna ra) { CommNet.CommPath path = new CommNet.CommPath(); (node.Net as RACommNetwork).FindHome(node, path); status = !raCNV.IsConnectedHome ? 2 : path.Count == 1 ? 0 : 1; rate = (node.Net as RACommNetwork).MaxDataRateToHome(node) / 8e6; // Convert rate from bps to MBps; if (transmitting) { ec += ra.PowerDrawLinear * packetInterval * 1e-6; // 1 EC/sec = 1KW. Draw(mw) * interval(sec) * mW -> kW conversion } if (node[path.First.end] is RACommLink link) { strength = link.start.Equals(node) ? link.FwdMetric : link.RevMetric; } foreach (CommNet.CommLink clink in path) { sList.Add(new string[1] { clink.end.name }); } //sList.Add(new string[1] { path.First.end.name }); target_name = path.First.end.name; } p1.GetType().GetField("linked").SetValue(p1, raCNV.IsConnectedHome); // Link Status p1.GetType().GetField("ec").SetValue(p1, ec); // EC/s p1.GetType().GetField("rate").SetValue(p1, rate); // Rate in MB/s p1.GetType().GetField("status").SetValue(p1, status); // 0=direct, 1=indirect, 2=none p1.GetType().GetField("strength").SetValue(p1, strength); // Signal quality indicator (float 0..1) p1.GetType().GetField("target_name").SetValue(p1, target_name); p1.GetType().GetField("control_path").SetValue(p1, sList); p1.GetType().GetField("ec_idle")?.SetValue(p1, ecIdle); //Debug.LogFormat($"{ModTag}Rate: {RATools.PrettyPrintDataRate(rate * 8 * 1024 * 1024)} EC: {ec:F4} Linked:{raCNV.IsConnectedHome} Strength: {strength:F2} Target: {target_name}"); } }
public static double GetRealSignalForTrackingStation(CommNet.CommPath path) { // return the signal strength between a vessel and the dsn when there are relays between them // Debug.Log ("[AH] getting real signal for " + path[0].a.name); double signal = 1d; foreach (CommNet.CommLink link in path) { // Debug.Log ("[AH] link : " + link.ToString ()); signal *= link.signalStrength; } return(signal); }
public static double GetRealSignal(CommNet.CommPath path, Vessel v = null) { // return the signal strength between a vessel and the dsn when there are relays between them // Debug.Log ("[AH] getting real signal for " + path[0].a.name); if (v == null) { v = FlightGlobals.ActiveVessel; } double signal = 1d; foreach (CommNet.CommLink link in path) { // Debug.Log ("[AH] link : " + link.ToString ()); if (link.a.transform.GetComponent <Vessel> () != v) { signal *= link.signalStrength; } } return(signal); }