Beispiel #1
0
        /// <summary>
        /// Asansörün kat arttırma ve azaltma işlemi
        /// </summary>
        /// <param name="elevator">Asansör</param>
        private void FloorChange(Elevator.Concrete.Elevator elevator)
        {
            lock (elevator)
            {
                if (elevator.Direction == true)
                {
                    elevator.Floor++;
                }

                if (elevator.Direction == false)
                {
                    elevator.Floor--;
                }

                if (elevator.Floor < 0)
                {
                    elevator.Floor     = 0;
                    elevator.Direction = false;
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// Asansör içerisindeki müşterileri bulundukları katlara geldiğinde indirme işlemini yapar
        /// </summary>
        /// <param name="elevator">Asansör</param>
        /// <param name="floors">AVM içerisinde bulunan tüm katlar</param>
        /// <param name="settings">Genel ayarlar</param>
        private void PassengerLowering(Elevator.Concrete.Elevator elevator, Floor.Concrete.Floor[] floors, Settings settings)
        {
            if (elevator.GetCount() > 0)
            {
                //İndirme işlemi
                if (elevator.GetFloorCount(elevator.Floor) > 0)
                {
                    if (elevator.Floor > 0)
                    {
                        floors[elevator.Floor].FloorCount = floors[elevator.Floor].FloorCount +
                                                            elevator.GetFloorCount(elevator
                                                                                   .Floor); // Kat Müşteri Arttır.
                    }
                    if (elevator.Floor == 0)
                    {
                        settings.TotalLogoutCount = elevator.GetFloorCount(elevator.Floor);
                    }

                    elevator.SetFloorCount(elevator.Floor,
                                           -1 * elevator.GetFloorCount(elevator.Floor)); // Asansör Azaldı
                }
            }
        }
Beispiel #3
0
        public void ElevatorThread(Elevator.Concrete.Elevator elevator, Floor.Concrete.Floor[] floors, int capacity, Settings settings)
        {
            lock (elevator)
            {
                if (elevator.IsActive)
                {
                    PassengerLowering(elevator, floors, settings);
                    PassengerBoarding(elevator, floors, capacity);
                }
                else if (elevator.IsActive == false && elevator.GetCount() > 0)
                {
                    PassengerLowering(elevator, floors, settings);
                }
            }

            lock (elevator)
            {
                if (elevator.Destination == elevator.Floor)
                {
                    if (elevator.GetFirstDestination() != -1)
                    {
                        elevator.Destination = elevator.GetFirstDestination();
                    }
                    else if (CheckTopFloor(floors, elevator.Floor) > 0 && elevator.Direction == true)
                    {
                        elevator.Destination = CheckTopFloor(floors, elevator.Floor);
                    }
                    else if (CheckButtomFloor(floors, elevator.Floor) > 0 && elevator.Direction == false)
                    {
                        elevator.Destination = CheckButtomFloor(floors, elevator.Floor);
                    }
                    else
                    {
                        elevator.Destination = 0;
                    }


                    if (elevator.Floor < elevator.Destination)
                    {
                        elevator.Direction = true;
                    }
                    else
                    {
                        elevator.Direction = false;
                    }
                }

                if (elevator.IsActive == false && elevator.GetCount() > 0 && elevator.Floor != elevator.Destination)
                {
                    if (elevator.GetFirstDestination() != -1)
                    {
                        elevator.Destination = elevator.GetFirstDestination();
                    }
                    else
                    {
                        elevator.Destination = 0;
                    }


                    if (elevator.Floor < elevator.Destination)
                    {
                        elevator.Direction = true;
                    }
                    else
                    {
                        elevator.Direction = false;
                    }
                }
            }

            lock (elevator)
            {
                if (elevator.GetCount() > 0 || elevator.IsActive == true)
                {
                    FloorChange(elevator);
                }
            }
        }
Beispiel #4
0
        /// <summary>
        ///  Bulunduğu katın kuyruğunda müşteri varsa müşteriyi asansörün kapasitesine uygun olacak şekilde asansöre alır.
        /// </summary>
        /// <param name="elevator">Asansör</param>
        /// <param name="floors">AVM içerisinde bulunan tüm katlar</param>
        /// <param name="capacity">Asansörün maksimum taşıyacağı müşteri sayısı</param>
        private void PassengerBoarding(Elevator.Concrete.Elevator elevator, Floor.Concrete.Floor[] floors, int capacity)
        {
            if (elevator.IsActive)
            {
                // Asansör aktif mi?

ElevetorControl:
                lock (floors[elevator.Floor].GetFloorQueue())
                {
                    if (floors[elevator.Floor].GetFloorQueue().Count > 0)
                    {
                        string[] queueSplit;
                        // Katta kuyruk var mı
                        lock (floors[elevator.Floor].GetFloorQueue())
                        {
                            queueSplit = floors[elevator.Floor].GetFloorQueue().Peek().Split(','); // Kuyruk
                        }
                        var floor = int.Parse(queueSplit[0]);                                      // Hedef kat
                        var count = int.Parse(queueSplit[1]);                                      // Müşteri Sayısı

                        if (elevator.GetCount() + count > capacity)
                        {
                            // Kuyruktaki müşteri sayısı ile asansördeki müşteri sayısının toplamı kapasiteden büyük mü?

                            try
                            {
                                floors[elevator.Floor].GetFloorQueue().Dequeue();       //Müşteriyi kuyruktan sil.

                                var maxCustomer       = capacity - elevator.GetCount(); // Maksimum alacağı kişi sayısı
                                var remainingCustomer = count - maxCustomer;            // Katta kalan müşteri sayısı
                                elevator.SetFloorCount(floor, maxCustomer);             // Müşteriyi asansöre al
                                floors[elevator.Floor]
                                .RemoveQueueFloor(maxCustomer);                         // Kat kuyruğundan müşteri sayısını çıkart.
                                floors[elevator.Floor]
                                .RetryQueue(floor,
                                            remainingCustomer); // Kalan müşteriyi sıranın başına koyacak şekilde kuyruğu güncelle
                            }
                            catch (Exception e)
                            {
                                Console.WriteLine(e);
                            }
                        }
                        else
                        {
                            try
                            {
                                floors[elevator.Floor].GetFloorQueue().Dequeue();
                                elevator.SetFloorCount(floor, count); // Müşteriyi asansöre al
                                floors[elevator.Floor]
                                .RemoveQueueFloor(count);             // Kat kuyruğundan müşteri sayısını çıkart.
                            }
                            catch (Exception e)
                            {
                                Console.WriteLine(e);
                            }
                        }
                    }

                    if (elevator.GetCount() != capacity && floors[elevator.Floor].QueueCount > 0)
                    {
                        // Asansörde yer varsa ve kuyrukta bekleyen müşteri varsa
                        goto ElevetorControl;
                    }
                }
            }
        }