/// <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>()); } }