Пример #1
0
        protected override void CreateNode()
        {
            if (comm == null)
            {
                comm = new RACommNode(nodeTransform)
                {
                    OnNetworkPreUpdate      = new Action(OnNetworkPreUpdate),
                    isHome                  = true,
                    isControlSource         = true,
                    isControlSourceMultiHop = true
                };
            }
            comm.name        = nodeName;
            comm.displayName = displaynodeName;
            comm.antennaRelay.Update(!isPermanent ? GameVariables.Instance.GetDSNRange(ScenarioUpgradeableFacilities.GetFacilityLevel(SpaceCenterFacility.TrackingStation)) : antennaPower, GameVariables.Instance.GetDSNRangeCurve(), false);
//            Vector3d pos = (nodeTransform == null) ? transform.position : nodeTransform.position;
//            body.GetLatLonAlt(pos, out lat, out lon, out alt);

            RACommNode t = comm as RACommNode;

            t.ParentBody = body;
            int   maxTL   = HighLogic.CurrentGame.Parameters.CustomParams <RAParameters>().MaxTechLevel;
            float fTSLvl  = ScenarioUpgradeableFacilities.GetFacilityLevel(SpaceCenterFacility.TrackingStation);
            int   tsLevel = (HighLogic.CurrentGame.Mode == Game.Modes.CAREER) ? Convert.ToInt32(1 + (fTSLvl * maxTL)) : maxTL;

            // Config node contains a list of antennas to build.
            //Debug.LogFormat("Building all antennas for tech level {0} from {1}", tsLevel, config);
            t.RAAntennaList = new List <RealAntenna> {
            };
            foreach (ConfigNode antNode in config.GetNodes("Antenna"))
            {
                //Debug.LogFormat("Building an antenna for {0}", antNode);
                int targetLevel = Int32.Parse(antNode.GetValue("TechLevel"));
                if (tsLevel >= targetLevel)
                {
                    RealAntenna ant = new RealAntennaDigital(name)
                    {
                        ParentNode = comm
                    };
                    ant.LoadFromConfigNode(antNode);
                    ant.ProcessUpgrades(tsLevel, antNode);
                    ant.TechLevelInfo = TechLevelInfo.GetTechLevel(tsLevel);
                    t.RAAntennaList.Add(ant);
                }
                else
                {
                    //Debug.LogFormat("Skipped because current techLevel {0} is less than required {1}", tsLevel, targetLevel);
                }
            }
        }
Пример #2
0
        public void GatherAntennaCones(RACommNode node, ref List <Vector3> targetPoints, ref List <Vector3> cone3Points, ref List <Vector3> cone10Points)
        {
            if (node == null || node.RAAntennaList.Count == 0)
            {
                return;
            }
            foreach (RealAntenna ra in node.RAAntennaList)
            {
                if (ra.CanTarget && ra.Target != null)
                {
                    targetPoints.Add(node.position);
                    targetPoints.Add(ra.Target.GetTransform().position);

                    //Vector3d perpToCamera = new Vector3d(1, 0, 0);
                    Vector3 toTarget     = ra.Target.GetTransform().position - node.position;
                    Vector3 perpToCamera = Vector3.Cross(toTarget, Vector3.up);
                    perpToCamera.Normalize();
                    float   bw10         = Convert.ToSingle(ra.Beamwidth * Math.PI / 180);
                    float   bw3          = bw10 / 2;
                    Vector3 leftbound10  = Vector3.RotateTowards(toTarget, perpToCamera, bw10, 0);
                    Vector3 rightbound10 = Vector3.RotateTowards(toTarget, perpToCamera, -1 * bw10, 0);
                    Vector3 leftbound3   = Vector3.RotateTowards(toTarget, perpToCamera, bw3, 0);
                    Vector3 rightbound3  = Vector3.RotateTowards(toTarget, perpToCamera, -1 * bw3, 0);

                    float coneScale = Convert.ToSingle(1e7);
                    leftbound3.Normalize();
                    leftbound10.Normalize();
                    rightbound3.Normalize();
                    rightbound10.Normalize();
                    leftbound3   *= coneScale;
                    leftbound10  *= coneScale;
                    rightbound3  *= coneScale;
                    rightbound10 *= coneScale;

                    cone3Points.Add(leftbound3 + node.position);
                    cone3Points.Add(node.position);
                    cone3Points.Add(rightbound3 + node.position);
                    cone3Points.Add(node.position);

                    cone10Points.Add(leftbound10 + node.position);
                    cone10Points.Add(node.position);
                    cone10Points.Add(rightbound10 + node.position);
                    cone10Points.Add(node.position);
                }
            }
        }
Пример #3
0
        protected override void CreateNode()
        {
            if (comm == null)
            {
                comm = new RACommNode(nodeTransform)
                {
                    OnNetworkPreUpdate      = new Action(OnNetworkPreUpdate),
                    isHome                  = true,
                    isControlSource         = true,
                    isControlSourceMultiHop = true
                };
            }
            comm.name        = nodeName;
            comm.displayName = displaynodeName;
            comm.antennaRelay.Update(!isPermanent ? GameVariables.Instance.GetDSNRange(ScenarioUpgradeableFacilities.GetFacilityLevel(SpaceCenterFacility.TrackingStation)) : antennaPower, GameVariables.Instance.GetDSNRangeCurve(), false);
//            Vector3d pos = (nodeTransform == null) ? transform.position : nodeTransform.position;
//            body.GetLatLonAlt(pos, out lat, out lon, out alt);

            RACommNode t = comm as RACommNode;

            t.ParentBody = body;
            int tsLevel = RACommNetScenario.GroundStationTechLevel;

            // Config node contains a list of antennas to build.
            t.RAAntennaList = new List <RealAntenna> {
            };
            foreach (ConfigNode antNode in config.GetNodes("Antenna"))
            {
                //Debug.LogFormat("Building an antenna for {0}", antNode);
                int targetLevel = Int32.Parse(antNode.GetValue("TechLevel"));
                if (tsLevel >= targetLevel)
                {
                    RealAntenna ant = new RealAntennaDigital(name)
                    {
                        ParentNode = comm
                    };
                    ant.LoadFromConfigNode(antNode);
                    ant.ProcessUpgrades(tsLevel, antNode);
                    ant.TechLevelInfo = TechLevelInfo.GetTechLevel(tsLevel);
                    t.RAAntennaList.Add(ant);
                }
            }
        }
Пример #4
0
        protected override void UpdateList()
        {
            if (FlightGlobals.ActiveVessel.Connection?.Comm is RACommNode comm &&
                FlightGlobals.ActiveVessel.Connection?.ControlPath is CommPath path)
            {
                if (items.Count != path.Count)
                {
                    ClearList();
                    foreach (CommLink link in path)
                    {
                        Tooltip_SignalStrengthItem x = Instantiate(itemPrefab);
                        x.transform.SetParent(tooltip.listParent, false);
                        items.Add(new KeyValuePair <CommLink, Tooltip_SignalStrengthItem>(link, x));
                    }
                }

                foreach (KeyValuePair <CommLink, Tooltip_SignalStrengthItem> item in items)
                {
                    RACommLink link              = item.Key.start[item.Key.end] as RACommLink;
                    double     linkRate          = link.start.Equals(item.Key.start) ? link.FwdDataRate : link.RevDataRate;
                    RACommNode curNode           = (link.start.Equals(item.Key.start) ? link.start : link.end) as RACommNode;
                    RACommNode oppNode           = (link.start.Equals(item.Key.start) ? link.end : link.start) as RACommNode;
                    Tooltip_SignalStrengthItem x = item.Value;
                    x.Setup(item.Key.signal, $"{oppNode.displayName}: {RATools.PrettyPrintDataRate(linkRate)}");
                    x.transform.SetAsLastSibling();
                }
                if (path.Count > 0 && path.First is CommLink link1)
                {
                    if (link1.start[link1.end] is RACommLink raLink)
                    {
                        double rate     = (comm.Net as RACommNetwork).MaxDataRateToHome(comm);
                        double txMetric = raLink.start.Equals(comm) ? raLink.FwdMetric : raLink.RevMetric;
                        double rxMetric = raLink.start.Equals(comm) ? raLink.RevMetric : raLink.FwdMetric;
                        tooltip.title.SetText($"Signal (Tx/Rx) : {txMetric * 100:F0}%/{rxMetric*100:F0}%  -  {RATools.PrettyPrintDataRate(rate)}");
                    }
                }
            }
        }
Пример #5
0
        public void GatherDebugInfo(RealAntenna debugAntenna, List <CommNet.CommNode> Nodes, ref Network.ConnectionDebugger connectionDebugger, bool log = true)
        {
            var nodePairs = StringBuilderCache.Acquire();
            var antPairs  = StringBuilderCache.Acquire();

            allAntennas.TryGetValue(debugAntenna, out int targetIndex);
            foreach (var pair in allNodePairs)
            {
                if (pair.x <= pair.y)
                {
                    var p2 = new int2(pair.y, pair.x);
                    if (validMap.TryGetValue(pair, out bool valid) &&
                        validMap.TryGetValue(p2, out bool valid2))
                    {
                        RACommNode a = Nodes[pair.x] as RACommNode;
                        RACommNode b = Nodes[pair.y] as RACommNode;
                        if (a == debugAntenna.ParentNode || b == debugAntenna.ParentNode)
                        {
                            nodePairs.AppendLine($"Nodes: {a.name} -> {b.name} Valid: {valid} / {valid2}");
                        }
                    }
                }
            }
            for (int i = 0; i < allValidAntennaPairs.Length; i++)
            {
                var quad = allValidAntennaPairs[i];
                if (targetIndex == quad.z || targetIndex == quad.w)
                {
                    RealAntenna tx           = allAntennasReverse[quad.z];
                    RealAntenna rx           = allAntennasReverse[quad.w];
                    var         otherAntenna = (tx == debugAntenna) ? rx : tx;
                    if (tx == debugAntenna || rx == debugAntenna)
                    {
                        double3 txToRx      = rxPos[i] - txPos[i];
                        double3 rxToTx      = txPos[i] - rxPos[i];
                        double  txToRxAngle = MathUtils.Angle2(txToRx, txDir[i]);
                        double  rxToTxAngle = MathUtils.Angle2(rxToTx, rxDir[i]);
                        var     debugData   = new Network.LinkDetails
                        {
                            txNode          = Nodes[quad.x] as RACommNode,
                            rxNode          = Nodes[quad.y] as RACommNode,
                            tx              = tx,
                            rx              = rx,
                            txPower         = txPower[i],
                            rxPower         = rxPower[i],
                            txPos           = txPos[i],
                            rxPos           = rxPos[i],
                            txToRx          = txToRx,
                            rxToTx          = rxToTx,
                            txDir           = txDir[i],
                            rxDir           = rxDir[i],
                            txBeamwidth     = txBeamwidth[i],
                            rxBeamwidth     = rxBeamwidth[i],
                            txToRxAngle     = txToRxAngle,
                            rxToTxAngle     = rxToTxAngle,
                            txPointLoss     = Physics.PointingLoss(txToRxAngle, txBeamwidth[i]),
                            rxPointLoss     = Physics.PointingLoss(rxToTxAngle, rxBeamwidth[i]),
                            pointingLoss    = pointingLoss[i],
                            pathLoss        = pathLoss[i],
                            atmosphereNoise = atmosphereNoise[i],
                            bodyNoise       = bodyNoise[i],
                            noiseTemp       = noiseTemp[i],
                            noise           = atmosphereNoise[i] + bodyNoise[i] + noiseTemp[i],
                            N0              = n0[i],
                            minEb           = minEb[i],
                            minDataRate     = minDataRate[i],
                            dataRate        = dataRate[i],
                            maxDataRate     = maxDataRate[i],
                            rateSteps       = rateSteps[i],
                        };
                        if (!connectionDebugger.items.ContainsKey(otherAntenna))
                        {
                            connectionDebugger.items.Add(otherAntenna, new List <Network.LinkDetails>());
                        }
                        var    item  = connectionDebugger.items[otherAntenna];
                        string sData = $"{debugData}";
                        item.Add(debugData);
                        antPairs.AppendLine(sData);
                    }
                    else
                    {
                        antPairs.AppendLine($"Thought indices {quad.z} or {quad.w} matched target {targetIndex} but discovered antennas {tx} | {rx} | looking for {debugAntenna}");
                    }
                }
            }
            if (log)
            {
                UnityEngine.Debug.Log($"[RealAntennas.Jobs] {nodePairs}");
                UnityEngine.Debug.Log($"[RealAntennas.Jobs] {antPairs}");
            }
            nodePairs.Release();
            antPairs.Release();
            connectionDebugger = null;
        }
Пример #6
0
        public void Complete(RACommNetwork RACN)
        {
            if (!tempAllocationsActive)
            {
                return;
            }
            Profiler.BeginSample("RealAntennas PreCompute.Complete.Gather");
            precomputeJobHandle.Complete();
            Profiler.EndSample();
            Profiler.BeginSample("RealAntennas PreCompute.Complete.Linkages");

            foreach (var pair in allNodePairs)
            {
                if (pair.x <= pair.y && pair.y < RACN.Nodes.Count)
                {
                    var p2 = new int2(pair.y, pair.x);
                    if (validMap.TryGetValue(pair, out bool valid) && valid &&
                        validMap.TryGetValue(p2, out bool valid2) && valid2 &&
                        bestMap.TryGetValue(pair, out int row) &&
                        bestMap.TryGetValue(p2, out int row2) &&
                        row >= 0 && row2 >= 0 &&
                        dataRate[row] > 0 && dataRate[row2] > 0)
                    {
                        // Connect Successful
                        RACommNode a       = RACN.Nodes[pair.x] as RACommNode;
                        RACommNode b       = RACN.Nodes[pair.y] as RACommNode;
                        int4       fwdQuad = allValidAntennaPairs[row];
                        int4       revQuad = allValidAntennaPairs[row2];

                        /*
                         * RealAntenna fwdTx = allAntennasReverse[fwdQuad.z];
                         * RealAntenna fwdRx = allAntennasReverse[fwdQuad.w];
                         * RealAntenna revTx = allAntennasReverse[revQuad.z];
                         * RealAntenna revRx = allAntennasReverse[revQuad.w];
                         * double fwd = dataRate[row];
                         * double rev = dataRate[row2];
                         * double FwdBestDataRate = maxDataRate[row];
                         * double RevBestDataRate = maxDataRate[row2];
                         */
                        double FwdMetric = 1.0 - ((float)rateSteps[row] / (maxSteps[row] + 1));
                        double RevMetric = 1.0 - ((float)rateSteps[row2] / (maxSteps[row2] + 1));
                        //RACN.MakeLink(fwdTx, fwdRx, revTx, revRx, a, b, (a.position - b.position).magnitude, fwd, rev, FwdBestDataRate, FwdMetric, RevMetric);
                        RACN.MakeLink(allAntennasReverse[fwdQuad.z],
                                      allAntennasReverse[fwdQuad.w],
                                      allAntennasReverse[revQuad.z],
                                      allAntennasReverse[revQuad.w],
                                      a,
                                      b,
                                      (a.position - b.position).magnitude,
                                      dataRate[row],
                                      dataRate[row2],
                                      maxDataRate[row],
                                      FwdMetric,
                                      RevMetric);
                    }
                    else
                    {
                        RACN.DoDisconnect(RACN.Nodes[pair.x], RACN.Nodes[pair.y]);
                    }
                }
            }

            if (RACN.connectionDebugger is Network.ConnectionDebugger)
            {
                GatherDebugInfo(RACN.DebugAntenna, RACN.Nodes, ref RACN.connectionDebugger);
            }
            DisposeJobData();
            Profiler.EndSample();
        }
Пример #7
0
 public GroundStationSiteNode(RACommNode node)
 {
     this.node = node;
 }
Пример #8
0
        public void GatherAntennaCones(RACommNode node)
        {
            if (node == null || node.RAAntennaList.Count == 0)
            {
                return;
            }
            CheckRenderers(node);

            foreach (RealAntenna ra in node.RAAntennaList)
            {
                if (ra.CanTarget && ra.Target != null)
                {
                    CheckRenderer(targetRenderers[node], ra);
                    CheckRenderer(cone3Renderers[node], ra);
                    CheckRenderer(cone10Renderers[node], ra);
                    LineRenderer targetRenderer = targetRenderers[node][ra].GetComponent <LineRenderer>();
                    LineRenderer cone3Renderer  = cone3Renderers[node][ra].GetComponent <LineRenderer>();
                    LineRenderer cone10Renderer = cone10Renderers[node][ra].GetComponent <LineRenderer>();

                    Vector3d axis = ra.ToTargetByTransform;
                    double   len  = Math.Min(1e8f, axis.magnitude);
                    if (ra.Target is CelestialBody body)
                    {
                        len = Math.Min(len, axis.magnitude - body.Radius);
                    }
                    axis.Normalize();
                    axis *= len;
                    Cone cone10 = new Cone(node.position, axis, Vector3.up, ra.Beamwidth);
                    Cone cone3  = new Cone(node.position, axis, Vector3.up, ra.Beamwidth / 2);

                    targetPoints.Clear();
                    cone3Points.Clear();
                    cone10Points.Clear();

                    Camera  cam    = PlanetariumCamera.Camera;
                    Vector3 camPos = cam.transform.position;

                    if (drawTarget)
                    {
                        targetPoints.Add(node.position);
                        targetPoints.Add(node.position + ra.ToTargetByTransform);
                        ScaledSpace.LocalToScaledSpace(targetPoints);
                        float dStart = Vector3.Distance(camPos, targetPoints[0]);
                        float dEnd   = Vector3.Distance(camPos, targetPoints[1]);
                        targetRenderer.startWidth = dStart * lineScaleWidth / 1000;
                        targetRenderer.endWidth   = dEnd * lineScaleWidth / 1000;
                        SetColorGradient(targetRenderer, colorToTarget, colorToTarget, ConeOpacity, ConeOpacity);
                    }

                    if (drawCone3 && drawConesMode != DrawConesMode.None)
                    {
                        cone3Points.Add(cone3.end1);
                        cone3Points.Add(cone3.vertex);
                        if (drawConesMode == DrawConesMode.Cone3D)
                        {
                            MakeCircles(cone3Points, cone3, numCircles);
                        }
                        else
                        {
                            cone3Points.Add(cone3.end2);
                        }

                        ScaledSpace.LocalToScaledSpace(cone3Points);
                        float dStart = Vector3.Distance(camPos, ScaledSpace.LocalToScaledSpace(cone3.vertex));
                        cone3Renderer.startWidth = dStart * lineScaleWidth / 1000;
                        cone3Renderer.endWidth   = dStart * lineScaleWidth / 1000;
                        SetColorGradient(cone3Renderer, color3dB, color3dB, ConeOpacity, ConeOpacity);
                    }

                    if (drawCone10 && drawConesMode != DrawConesMode.None)
                    {
                        cone10Points.Add(cone10.end1);
                        cone10Points.Add(cone10.vertex);
                        if (drawConesMode == DrawConesMode.Cone3D)
                        {
                            MakeCircles(cone10Points, cone10, numCircles);
                        }
                        else
                        {
                            cone10Points.Add(cone10.end2);
                        }

                        ScaledSpace.LocalToScaledSpace(cone10Points);
                        float dStart = Vector3.Distance(camPos, ScaledSpace.LocalToScaledSpace(cone10.vertex));
                        cone10Renderer.startWidth = dStart * lineScaleWidth / 1000;
                        cone10Renderer.endWidth   = dStart * lineScaleWidth / 1000;
                        SetColorGradient(cone10Renderer, color10dB, color10dB, ConeOpacity, ConeOpacity);
                    }

                    targetRenderer.positionCount = targetPoints.Count;
                    targetRenderer.SetPositions(targetPoints.ToArray());
                    targetRenderer.enabled = drawTarget;

                    cone3Renderer.positionCount = cone3Points.Count;
                    cone3Renderer.SetPositions(cone3Points.ToArray());
                    cone3Renderer.enabled = drawCone3 && drawConesMode != DrawConesMode.None;

                    cone10Renderer.positionCount = cone10Points.Count;
                    cone10Renderer.SetPositions(cone10Points.ToArray());
                    cone10Renderer.enabled = drawCone10 && drawConesMode != DrawConesMode.None;
                }
            }
        }
Пример #9
0
        public void GatherAntennaCones(RACommNode node)
        {
            if (node == null || node.RAAntennaList.Count == 0)
            {
                return;
            }
            var settings = RACommNetScenario.MapUISettings;

            CheckRenderers(node);

            foreach (RealAntenna ra in node.RAAntennaList)
            {
                if (ra.CanTarget && ra.Target != null)
                {
                    CheckRenderer(targetRenderers[node], ra);
                    CheckRenderer(cone3Renderers[node], ra);
                    CheckRenderer(cone10Renderers[node], ra);
                    LineRenderer targetRenderer = targetRenderers[node][ra].GetComponent <LineRenderer>();
                    LineRenderer cone3Renderer  = cone3Renderers[node][ra].GetComponent <LineRenderer>();
                    LineRenderer cone10Renderer = cone10Renderers[node][ra].GetComponent <LineRenderer>();

                    Vector3d axis = ra.ToTarget;
                    double   len  = Math.Min(1e8f, axis.magnitude);
                    axis.Normalize();
                    axis *= len;
                    cone10.Init(node.precisePosition, axis, Vector3.up, ra.Beamwidth);
                    cone3.Init(node.precisePosition, axis, Vector3.up, ra.Beamwidth / 2);

                    targetPoints.Clear();
                    cone3Points.Clear();
                    cone10Points.Clear();

                    Camera  cam    = PlanetariumCamera.Camera;
                    Vector3 camPos = cam.transform.position;

                    if (settings.drawTarget)
                    {
                        targetPoints.Add(node.precisePosition);
                        targetPoints.Add(node.precisePosition + ra.ToTarget);
                        LocalToScaledSpace(targetPoints, targetPoints_out);
                        float dStart = Vector3.Distance(camPos, targetPoints_out[0]);
                        float dEnd   = Vector3.Distance(camPos, targetPoints_out[1]);
                        targetRenderer.startWidth = dStart * settings.lineScaleWidth / 1000;
                        targetRenderer.endWidth   = dEnd * settings.lineScaleWidth / 1000;
                        SetColorGradient(targetRenderer, colorToTarget, colorToTarget, settings.coneOpacity, settings.coneOpacity);
                    }

                    if (settings.drawCone3 && settings.drawConesMode != DrawConesMode.None)
                    {
                        cone3Points.Add(cone3.end1);
                        cone3Points.Add(cone3.vertex);
                        if (settings.drawConesMode == DrawConesMode.Cone3D)
                        {
                            MakeCircles(cone3Points, cone3, settings.coneCircles);
                        }
                        else
                        {
                            cone3Points.Add(cone3.end2);
                        }
                        LocalToScaledSpace(cone3Points, cone3Points_out);
                        float dStart = Vector3.Distance(camPos, ScaledSpace.LocalToScaledSpace(cone3.vertex));
                        cone3Renderer.startWidth = dStart * settings.lineScaleWidth / 1000;
                        cone3Renderer.endWidth   = dStart * settings.lineScaleWidth / 1000;
                        SetColorGradient(cone3Renderer, color3dB, color3dB, settings.coneOpacity, settings.coneOpacity);
                    }

                    if (settings.drawCone10 && settings.drawConesMode != DrawConesMode.None)
                    {
                        cone10Points.Add(cone10.end1);
                        cone10Points.Add(cone10.vertex);
                        if (settings.drawConesMode == DrawConesMode.Cone3D)
                        {
                            MakeCircles(cone10Points, cone10, settings.coneCircles);
                        }
                        else
                        {
                            cone10Points.Add(cone10.end2);
                        }

                        LocalToScaledSpace(cone10Points, cone10Points_out);
                        float dStart = Vector3.Distance(camPos, ScaledSpace.LocalToScaledSpace(cone10.vertex));
                        cone10Renderer.startWidth = dStart * settings.lineScaleWidth / 1000;
                        cone10Renderer.endWidth   = dStart * settings.lineScaleWidth / 1000;
                        SetColorGradient(cone10Renderer, color10dB, color10dB, settings.coneOpacity, settings.coneOpacity);
                    }

                    targetRenderer.positionCount = targetPoints.Count;
                    targetRenderer.SetPositions(targetPoints_out.ToArray());
                    targetRenderer.enabled = settings.drawTarget;

                    cone3Renderer.positionCount = cone3Points.Count;
                    cone3Renderer.SetPositions(cone3Points_out.ToArray());
                    cone3Renderer.enabled = settings.drawCone3 && settings.drawConesMode != DrawConesMode.None;

                    cone10Renderer.positionCount = cone10Points.Count;
                    cone10Renderer.SetPositions(cone10Points_out.ToArray());
                    cone10Renderer.enabled = settings.drawCone10 && settings.drawConesMode != DrawConesMode.None;
                }
            }
        }