Exemple #1
0
        /// <summary>
        /// Wyszukuje pierwszej wolnej szczeliny.
        /// </summary>
        /// <param name="band">Zajmowane pasmo</param>
        /// <param name="inOrOut">"in" albo "out"</param>
        /// <param name="linkID">ID łącza, które wchodzi lub wychodzi z węzła.</param>
        /// <returns>Wolna częstotliwość. Gdy się nie uda nic zrobić, </returns>
        public short FindFirstFreeFrequencyOut(short band, string inOrOut, int linkID)
        {
            SubNetworkPoint SNP = null;

            if (inOrOut == "in")
            {
                SNP = this.SNPP.snps.Find(x => x.portIN == linkID);
            }
            else if (inOrOut == "out")
            {
                SNP = this.SNPP.snps.Find(x => x.portIN == linkID);
            }

            if (SNP == null)
            {
                return(-1);
            }

            for (short i = 0; i < EONTable.capacity; i++)
            {
                if (SNP.eonTable.CheckAvailability(i, band, inOrOut))
                {
                    return(i);
                }
            }

            return(-1);
        }
        /// <summary>
        /// Nie wpisuje wartosci czestotliwosci i pasma do sciezki!
        /// </summary>
        /// <param name="Skad"></param>
        /// <param name="Dokad"></param>
        /// <param name="tablicaKierowaniaLaczami"></param>
        /// <param name="tablicaKierowaniaWezlami"></param>
        /// <param name="listaWezlow"></param>
        /// <param name="band"></param>
        /// <param name="tablicaKosztow"></param>
        /// <param name="frequency"></param>
        /// <returns></returns>
        public List <Lacze> wyznaczSciezke(Wezel Skad, Wezel Dokad, Lacze[,] tablicaKierowaniaLaczami,
                                           Wezel[,] tablicaKierowaniaWezlami, ref List <Wezel> listaWezlow, short band, float[,] tablicaKosztow, short frequency)
        {
            try
            {
                //Jedno wywolanie wiecej
                wywolaniaWyznaczSciezke += 1;

                //zwracana lista
                List <Lacze> tempList = new List <Lacze>();

                //indeksy wezlow
                int w1, w2;

                //Odnalezienie indeksow
                w1 = listaWezlow.FindIndex(x => x.ip == Skad.ip);
                w2 = listaWezlow.FindIndex(x => x.ip == Dokad.ip);

                //Zabezpieczenie przed nieskonczonym wywolywaniem sie tej samej funkcji. Po 200 wywolaniach tej funkcji wychodzimy.
                if (wywolaniaWyznaczSciezke < 200)
                {
                    if (tablicaKierowaniaWezlami.Length > 0 && tablicaKierowaniaWezlami[w1, w2] != null)
                    {
                        if (tablicaKierowaniaWezlami[w1, w2] == Dokad)
                        {
                            var cost = tablicaKosztow[w1, w2];

                            //Odnalezienie, jakim łączem idzie ścieżka
                            var link = tablicaKierowaniaLaczami[w1, w2];

                            //Odnalezienie SNP wejściowego łącza
                            SubNetworkPoint snpSkad = Skad.SNPP.snps.Find(x => x.portOUT == link.idKrawedzi);

                            //Odnalezienie SNP wyjsciowego łącza
                            SubNetworkPoint snpDokad = Dokad.SNPP.snps.Find(x => x.portIN == link.idKrawedzi);

                            //Gdy pasmo jest wolne na danej czestotliwosci
                            if (cost <= (EONTable.capacity - band) * (EONTable.capacity - band) &&
                                snpSkad.eonTable.CheckAvailability(frequency, band, "out") &&
                                snpDokad.eonTable.CheckAvailability(frequency, band, "in"))
                            {
                                tempList.Add(tablicaKierowaniaLaczami[w1, w2]);
                            }
                            else
                            {
                                return(null);
                            }
                            //TODO
                        }
                        else
                        {
                            //Dodajemy sciezke z Skad do punktu posredniego, wskazanego przez tablice kierowania Wezlami
                            var path = wyznaczSciezke(Skad, tablicaKierowaniaWezlami[w1, w2],
                                                      tablicaKierowaniaLaczami, tablicaKierowaniaWezlami, ref listaWezlow, band,
                                                      tablicaKosztow, frequency);
                            if (path != null)
                            {
                                tempList.AddRange(path);
                            }
                            else
                            {
                                return(null);
                            }
                            //TODO:Tutaj wyskakuje nullpointerexception, ze nie mozna dodac AddRangem nulla.
                            //TODO:A funkcja zwraca null, gdy probuje wyznaczyc sciezke od wezla 6 do 6 zdaje sie.
                            //Potem doklejamy drugi koniec listy, liste krawedzi z posredniego do koncowego
                            path = wyznaczSciezke(tablicaKierowaniaWezlami[w1, w2],
                                                  Dokad, tablicaKierowaniaLaczami, tablicaKierowaniaWezlami, ref listaWezlow, band,
                                                  tablicaKosztow, frequency);
                            if (path != null)
                            {
                                tempList.AddRange(path);
                            }
                            else
                            {
                                return(null);
                            }
                        }
                        //Kopiowanie listy krawedzi sciezki
                        ListaKrawedziSciezki = new List <Lacze>(tempList);

                        if (ListaKrawedziSciezki.Count != 0)
                        {
                            //wyzerowanie wezlow sciezki
                            WezlySciezki = new List <Wezel>();

                            //Wyznaczenie wezlow sciezki
                            wyznaczWezly(ListaKrawedziSciezki[0].Wezel1);
                        }

                        wywolaniaWyznaczSciezke--;
                        return(tempList);
                    }
                }
                else
                {
                    wywolaniaWyznaczSciezke--;
                }
                return(new List <Lacze>());
            }
            catch (Exception E)
            {
                wywolaniaWyznaczSciezke--;
                return(new List <Lacze>());
            }
        }