public bool CanBundle(Element element)
 {
     if ((Bundle.bundleMax - Bundle.bundleSize) >= element.size) //max kanalow - tyle ile jest wykorzystywanych >= ilosc potrzebowanych do obslugi
     {
         return true;
     }
     else
         return false;
 }
 public bool CanQueue(Element element)
 {
     if (Queue.queueSize < Queue.maxSize)
     {
         return true;
     }
     else
         return false;
 }
 public void AddToQueue(Element element)
 {
     Queue.InsertElement(element);
 }
 public void AddToBundle(Element element)
 {
     Bundle.InsertElement(element);
 }
        public static void Simulation(Central central, double total_time)
        {
            double current_time = 0;

            Heap events = new Heap();
            //MList events = new MList();
            double[] czasy_wiazka = new double[10000000]; //time in , time out
            double[] czasy_kolejka = new double[10000000]; // time in, time in2
            double[] czasy_system = new double[10000000];  // time in2, time out || time in, time out
            int w = 0, k = 0, s = 0;
            IList<double> timel = new List<double>();

            //for (int i = 0; i < central.CStream.Count; i++) //iteruje po kazdym strumieniu
            //{
            //    double timeIn = current_time + central.CStream[i].getTime("space time"); //dodajem do czasu aktualnego czas odstepu kazdego strumienia
            //    events.InsertEvent(EventType.arrival, timeIn, i);
            //    central.CStream[i].licznik_pakietow++;
            //}

            while ((current_time < total_time) && (events.HeapSize !=0))
            {

                for (int i = 0; i < central.CStream.Count; i++) //iteruje po kazdym strumieniu
                {
                    double timeIn = current_time + central.CStream[i].getTime("space time"); //dodajem do czasu aktualnego czas odstepu kazdego strumienia
                    events.InsertEvent(EventType.arrival, timeIn, i);
                    central.CStream[i].licznik_pakietow++;
                }

                Event e = events.GetEvent();

                if(e.time>current_time)
                {
                current_time = e.time;
                //timel.Add(current_time);

                    if (central.Queue.IsEmpty() == false) //odpali sie gdy kolejka nie jest pusta
                    {
                        central.CheckQueue(current_time); // sprawdza czy nie ma elementów które czekają za długo, jeśli tak to usuwa je
                    }

                    switch (e.etype)
                    {
                        case EventType.arrival:

                            Element element = new Element(e.stream_number, central.CStream[e.stream_number].getSize(), current_time, current_time + central.CStream[e.stream_number].getTime("duration time"));
                            central.CStream[element.stream_number].licznik_pakietow += 1;

                            bool CanWe1 = central.CanBundle(element); // sprawdzamy czy jest miejsce w wiązce

                            if (CanWe1 == true)
                            {
                                central.AddToBundle(element);
                                events.InsertEvent(EventType.departure, element.timeOut, e.stream_number);
                                czasy_wiazka[w] = element.timeOut - element.timeIn;
                                w++;
                                czasy_system[s] = element.timeOut - element.timeIn;
                                s++;

                            }
                            else
                            {

                                bool CanWe2 = central.CanQueue(element); // sprawdzamy czy jest miejsce w kolejce oczekiwań

                                if (CanWe2 == true)
                                {
                                    element.timeIn2 = element.timeIn;
                                    element.timeIn = current_time + central.CStream[e.stream_number].getTime("waiting time");
                                    central.AddToQueue(element);
                                    events.InsertEvent(EventType.arrival, element.timeIn, e.stream_number);

                                }
                                else
                                {
                                    central.CStream[e.stream_number].licznik_odrzuconych_pakietow++;
                                }
                            }

                            break;

                        case EventType.departure:

                            central.EndElement(current_time);

                            if (central.Queue.IsEmpty() == false)
                            {
                                Element el = central.Queue.GetElement();
                                el.timeIn = current_time;
                                el.timeOut = current_time + el.timeOut;

                                if (central.CanBundle(el))
                                {
                                    central.AddToBundle(el);
                                    events.InsertEvent(EventType.departure, el.timeOut, el.stream_number);
                                    czasy_kolejka[k] = el.timeIn - el.timeIn2;
                                    k++;
                                    czasy_system[s] = el.timeOut - el.timeIn2;
                                    s++;
                                }

                            }
                            break;

                    }

                }
            }

            string pstwo_odrzucenia = "";
            string czas_sredni_kolejka = "";
            string czas_sredni_wiazka = "";
            string czas_sredni_system = "";
            string tekst = "";
            double suma_system = 0, suma_kolejka = 0, suma_wiazka = 0;

            for (int i = 0; i < s; i++) suma_system = czasy_system[i] + suma_system;
            for (int i = 0; i < k; i++) suma_kolejka = czasy_kolejka[i] + suma_kolejka;
            for (int i = 0; i < w; i++) suma_wiazka = czasy_wiazka[i] + suma_wiazka;

            double srednia_kolejka = 0;
            double srednia_wiazka = 0;
            double srednia_system=0;

            if (k == 0) srednia_kolejka = 0;
            else srednia_kolejka = suma_kolejka / k;
            if (w == 0) srednia_wiazka = 0;
            else srednia_wiazka = suma_wiazka / w;
            if (s == 0) srednia_system = 0;
            else srednia_system = suma_system / s;

            //for (int i = 0; i < timel.Count; i++)
            //{
            //    Console.WriteLine(timel[i]);
            //}

            for (int i = 0; i < central.CStream.Count; i++)
            {
                pstwo_odrzucenia += "Prawdopodobienstwo odrzucenia dla strumienia " + i + "\r\n" + ((double)central.CStream[i].licznik_odrzuconych_pakietow / (double)central.CStream[i].licznik_pakietow) * 100 + "%\r\n";
            }
            czas_sredni_kolejka = "Czas średni oczekiwania w KOLEJCE \r\n" + srednia_kolejka + "ms\r\n";
            czas_sredni_wiazka = "Czas średni oczekiwania w WIAZCE \r\n" + srednia_wiazka  + "ms\r\n";
            czas_sredni_system = "Czas średni oczekiwania w SYSTEMIE \r\n" + srednia_system  + "ms\r\n";

            tekst = pstwo_odrzucenia + czas_sredni_kolejka + czas_sredni_wiazka + czas_sredni_system;

            System.IO.File.WriteAllText(@"E:\Centrala-wynik.txt", tekst);
        }
 public void InsertElement(Element e)
 {
     queue.Add(e);
     queueSize++;
 }
 public void InsertElement(Element e)
 {
     bundle.Add(e);
     bundleSize += e.size;
     numberOfElements++;
 }