Example #1
0
        public void Passenger_ElevatorHasArrivedOrIsNoteFullAnymore(object sender, EventArgs e)
        {
            lock (locker) //Few elevators (on different threads) can rise this event at the same time
            {
                Elevator ElevatorWhichRisedAnEvent = ((ElevatorEventArgs)e).ElevatorWhichRisedAnEvent;

                //For passengers who are getting in to the elevator and may not be able to unsubscribe yet
                if (this.passengerStatus == PassengerStatus.GettingInToTheElevator)
                {
                    return;
                }

                //For passengers, who await for an elevator
                if (this.passengerStatus == PassengerStatus.WaitingForAnElevator && myBuilding.Fire == false)
                {
                    if ((ElevatorsDirectionIsNoneOrOk(ElevatorWhichRisedAnEvent) && (ElevatorWhichRisedAnEvent.AddNewPassengerIfPossible(this, targetFloor))))
                    {
                        //Set passengerStatus
                        passengerStatus = PassengerStatus.GettingInToTheElevator;

                        //Get in to the elevator
                        ThreadPool.QueueUserWorkItem(delegate { GetInToTheElevator(ElevatorWhichRisedAnEvent); });
                    }
                    else
                    {
                        FindAnElevatorOrCallForANewOne();
                    }
                }
            }
        }
Example #2
0
        public Passenger(Building MyBuilding, Floor CurrentFloor, int TargetFloorIndex)
        {
            this.myBuilding = MyBuilding;

            this.currentFloor      = CurrentFloor;
            this.currentFloorIndex = CurrentFloor.FloorIndex;
            this.passengerStatus   = PassengerStatus.WaitingForAnElevator;

            this.targetFloor      = MyBuilding.ArrayOfAllFloors[TargetFloorIndex];
            this.targetFloorIndex = TargetFloorIndex;

            this.PassengerPosition = new Point();

            Random random = new Random();

            this.thisPassengerGraphic = new Bitmap(Passenger.ArrayOfAllPassengerGraphics[random.Next(ArrayOfAllPassengerGraphics.Length)]);

            this.visible = true;
            this.passengerAnimationDelay = 8;

            //Subscribe to events
            this.currentFloor.NewPassengerAppeared += new EventHandler(currentFloor.Floor_NewPassengerAppeared);
            this.currentFloor.NewPassengerAppeared += new EventHandler(this.Passenger_NewPassengerAppeared);
            this.currentFloor.ElevatorHasArrivedOrIsNotFullAnymore += new EventHandler(this.Passenger_ElevatorHasArrivedOrIsNoteFullAnymore);

            this.passengerTimer          = new System.Timers.Timer(1000);
            this.passengerTimer.Elapsed += new ElapsedEventHandler(this.Passenger_TimerElapsed);
            this.passengerTimer.Start();

            logWriter = myBuilding.logWriter;
            this.Id   = System.Threading.Interlocked.Increment(ref objCounter);
        }
Example #3
0
        public Passenger(Building MyBuilding, Floor CurrentFloor, int TargetFloorIndex)
        {
            this.myBuilding = MyBuilding;

            this.currentFloor      = CurrentFloor;
            this.currentFloorIndex = CurrentFloor.FloorIndex;
            this.passengerStatus   = PassengerStatus.WaitingForAnElevator;

            this.targetFloor      = MyBuilding.ArrayOfAllFloors[TargetFloorIndex];
            this.targetFloorIndex = TargetFloorIndex;

            this.PassengerPosition = new Point();

            Random random = new Random();

            this.thisPassengerGraphic = new Bitmap(Passenger.ArrayOfAllPassengerGraphics[random.Next(ArrayOfAllPassengerGraphics.Length)]);

            this.visible = true;
            this.passengerAnimationDelay = 8;

            //Subscribe to events
            this.currentFloor.NewPassengerAppeared += new EventHandler(currentFloor.Floor_NewPassengerAppeared);
            this.currentFloor.NewPassengerAppeared += new EventHandler(this.Passenger_NewPassengerAppeared);
            this.currentFloor.ElevatorHasArrivedOrIsNotFullAnymore += new EventHandler(this.Passenger_ElevatorHasArrivedOrIsNoteFullAnymore);
        }
Example #4
0
        private void FindAnElevatorOrCallForANewOne()
        {
            if (myBuilding.Fire == false)
            {
                UpdatePassengerDirection();

                //Copy the list of elevators available now on current floor
                List <Elevator> ListOfElevatorsWaitingOnMyFloor = currentFloor.GetListOfElevatorsWaitingHere();

                //Search the right elevator on my floor
                foreach (Elevator elevator in ListOfElevatorsWaitingOnMyFloor)
                {
                    if (ElevatorsDirectionIsNoneOrOk(elevator))
                    {
                        if (elevator.AddNewPassengerIfPossible(this, this.targetFloor) && this.passengerStatus == PassengerStatus.WaitingForAnElevator)
                        {
                            //Update insideTheElevator
                            this.passengerStatus = PassengerStatus.GettingInToTheElevator;

                            ThreadPool.QueueUserWorkItem(delegate { GetInToTheElevator(elevator); });
                            return;
                        }
                    }
                }

                //Call for an elevator
                myBuilding.ElevatorManager.PassengerNeedsAnElevator(currentFloor, this.PassengerDirection);
            }
        }
Example #5
0
 public static Color GetPassengerColor(PassengerStatus Status, bool IsHighlight)
 {
     if (IsHighlight)
     {
         if (Status == PassengerStatus.Activity)
         {
             return(Color.FromArgb(255, 6, 96, 122));
         }
         else if (Status == PassengerStatus.PrivateTrip)
         {
             return(Color.FromArgb(255, 255, 0, 78));
         }
         else
         {
             return(Color.FromArgb(255, 229, 217, 61));
         }
     }
     else
     {
         if (Status == PassengerStatus.Activity)
         {
             return(Color.FromArgb(180, 6, 96, 122));
         }
         else if (Status == PassengerStatus.PrivateTrip)
         {
             return(Color.FromArgb(180, 255, 0, 78));
         }
         else
         {
             return(Color.FromArgb(180, 229, 217, 61));
         }
     }
 }
Example #6
0
        public void CalculateLocation(int time)
        {
            // search event by current time
            int previousEventIndex  = -1;
            int followingEventIndex = -1;

            for (int i = 0; i < EventList.Count - 1; i++)
            {
                PassengerEvent e     = EventList[i];
                PassengerEvent nexte = EventList[i + 1];
                if (e.Time <= time && time <= nexte.Time)
                {
                    previousEventIndex  = i;
                    followingEventIndex = i + 1;
                    break;
                }
            }

            if (previousEventIndex == -1 || followingEventIndex == -1)
            {
                PassengerView.Location = new Point(0, 0);
                return;
            }

            PassengerEvent previousEvent  = EventList[previousEventIndex];
            PassengerEvent followingEvent = EventList[followingEventIndex];

            CurrentEvent = previousEvent;

            PassengerStatus status = PassengerStatus.PublicTrip;

            PassengerView.Location = CalculateLocationByEvent(previousEvent, followingEvent, time, ref status);
            PassengerView.Status   = status;
        }
Example #7
0
 private void _success()
 {
     _status = PassengerStatus.Arrived;
     if (SuccessArriveEvent != null)
     {
         SuccessArriveEvent.Invoke(this);
     }
 }
Example #8
0
 public Passenger(
     Guid flightId,
     string name,
     PassengerStatus status) : base(Table)
 {
     FlightId = flightId;
     Name     = name;
     Status   = status;
 }
Example #9
0
    public void AboardBus(IBus bus)
    {
        _status = PassengerStatus.Moving;
        _stand  = null;

        if (StopWaitingEvent != null)
        {
            StopWaitingEvent.Invoke(this);
        }
    }
Example #10
0
        public void ElevatorReachedNextFloor()
        {
            //For passengers, who are already inside an elevator:
            if (this.myElevator.GetCurrentFloor() == this.targetFloor || myBuilding.Fire == true)
            {
                //Set appropriate flag
                this.passengerStatus = PassengerStatus.LeavingTheBuilding;

                //Get out of the elevator
                ThreadPool.QueueUserWorkItem(delegate { GetOutOfTheElevator(this.myElevator); });
            }
        }
Example #11
0
        public void ElevatorReachedNextFloor()
        {
            //For passengers, who are already inside an elevator:
            if (this.myElevator.GetCurrentFloor() == this.targetFloor)
            {
                //Set appropriate flag
                this.passengerStatus = PassengerStatus.LeavingTheBuilding;

                //Get out of the elevator
                ThreadPool.QueueUserWorkItem(delegate { GetOutOfTheElevator(this.myElevator); });
            }
        }
Example #12
0
    private void _fail()
    {
        _status = PassengerStatus.Failed;
        if (StopWaitingEvent != null)
        {
            StopWaitingEvent.Invoke(this);
        }
        if (AngryExitEvent != null)
        {
            AngryExitEvent.Invoke(this);
        }

        _view.FailedAnimate(_stand);
        _stand.ExitStation(this);
    }
Example #13
0
        public Passenger(int NumberOfFloors, int NumberOfTheFloor)
        {
            this.CurrentFloor = NumberOfTheFloor;
            Random rnd = new Random();

            if (this.CurrentFloor != 1)
            {
                this.WantedFloor = 1;
            }
            else
            {
                this.WantedFloor = rnd.Next(2, NumberOfFloors + 1);
            }
            this.Weight = rnd.Next(40, 80);
            this.Status = PassengerStatus.WaitingForElevator;
        }
Example #14
0
    public void WaitingAtStation(IStation station)
    {
        int order = station.NewPassenger(this);

        _status = PassengerStatus.Waiting;
        _stand  = station;

        if (StartWaitingEvent != null)
        {
            StartWaitingEvent.Invoke(this);
        }

        if (_view != null)
        {
            _view.ShowViewPositionAtStation(station.Transform, order);
        }
    }
Example #15
0
        public void EvacuateTheBuilding()
        {
            //Unsubscribe from an event for current floor
            this.currentFloor.ElevatorHasArrivedOrIsNotFullAnymore -= this.Passenger_ElevatorHasArrivedOrIsNoteFullAnymore;

            this.passengerStatus = PassengerStatus.LeavingTheBuilding;

            logWriter.Log($"Passenger ({Id}) is fleeing the building on floor ({currentFloor.FloorIndex})");

            currentFloor.LampDown = false;
            currentFloor.LampUp   = false;

            int PassengerToRemoveIndex = Array.IndexOf <Passenger>(currentFloor.GetArrayOfPeopleWaitingForElevator(), this);

            if (PassengerToRemoveIndex != -1)
            {
                currentFloor.GetArrayOfPeopleWaitingForElevator()[PassengerToRemoveIndex] = null;
            }

            //Flip the control
            this.visible = false;
            this.FlipPassengerGraphicHorizontally();
            this.visible = true;

            ////Make the passenger visible
            //this.visible = true;

            //Move the passenger up to the exit
            this.MovePassengersGraphicHorizontally(myBuilding.ExitLocation);

            //Make the passenger invisible again
            //TO DO: dispose object instead making it invisble
            this.visible = false;

            //No need to animate it
            myBuilding.ListOfAllPeopleWhoNeedAnimation.Remove(this);
        }
Example #16
0
        public Passenger(Building MyBuilding, Floor CurrentFloor, int TargetFloorIndex)
        {
            this.myBuilding = MyBuilding;

            this.currentFloor = CurrentFloor;
            this.currentFloorIndex = CurrentFloor.FloorIndex;
            this.passengerStatus = PassengerStatus.WaitingForAnElevator;

            this.targetFloor = MyBuilding.ArrayOfAllFloors[TargetFloorIndex];
            this.targetFloorIndex = TargetFloorIndex;

            this.PassengerPosition = new Point();

            Random random = new Random();
            this.thisPassengerGraphic = new Bitmap(Passenger.ArrayOfAllPassengerGraphics[random.Next(ArrayOfAllPassengerGraphics.Length)]);

            this.visible = true;
            this.passengerAnimationDelay = 8;

            //Subscribe to events
            this.currentFloor.NewPassengerAppeared += new EventHandler(currentFloor.Floor_NewPassengerAppeared);
            this.currentFloor.NewPassengerAppeared += new EventHandler(this.Passenger_NewPassengerAppeared);
            this.currentFloor.ElevatorHasArrivedOrIsNotFullAnymore += new EventHandler(this.Passenger_ElevatorHasArrivedOrIsNoteFullAnymore);
        }
Example #17
0
        public Point CalculateLocationByEvent(PassengerEvent previousEvent, PassengerEvent followingEvent, int time, ref PassengerStatus status)
        {
            // On public trip
            if (previousEvent is PassengerTripEvent && followingEvent is PassengerTripEvent)
            {
                status = PassengerStatus.PublicTrip;
                return(((PassengerTripEvent)previousEvent).AttachedCarriage.CarriageView.Location);
            }

            // On private trip
            else if (previousEvent is PassengerPrivateTripEvent && followingEvent is PassengerPrivateTripEvent)
            {
                status = PassengerStatus.PrivateTrip;

                if (previousEvent == followingEvent)
                {
                    return(((PassengerPrivateTripEvent)previousEvent).Location);
                }

                double percentage       = Convert.ToDouble(time - previousEvent.Time) / (followingEvent.Time - previousEvent.Time);
                Point  previousLocation = ((PassengerPrivateTripEvent)previousEvent).Location;
                Point  currentLocation  = ((PassengerPrivateTripEvent)followingEvent).Location;

                double x = percentage * (currentLocation.X - previousLocation.X) + previousLocation.X;
                double y = percentage * (currentLocation.Y - previousLocation.Y) + previousLocation.Y;

                return(new Point(x, y));
            }

            // On activity
            else if (previousEvent is PassengerActivityEvent && followingEvent is PassengerActivityEvent)
            {
                status = PassengerStatus.Activity;
                return(((PassengerActivityEvent)previousEvent).Location);
            }

            // switch
            else
            {
                return(PassengerView.Location);
            }
        }
Example #18
0
        public void Passenger_ElevatorHasArrivedOrIsNoteFullAnymore(object sender, EventArgs e)
        {
            lock (locker) //Few elevators (on different threads) can rise this event at the same time
            {
                Elevator ElevatorWhichRisedAnEvent = ((ElevatorEventArgs)e).ElevatorWhichRisedAnEvent;

                //For passengers who are getting in to the elevator and may not be able to unsubscribe yet
                if (this.passengerStatus == PassengerStatus.GettingInToTheElevator)
                {
                    return;
                }

                //For passengers, who await for an elevator
                if (this.passengerStatus == PassengerStatus.WaitingForAnElevator)
                {
                    if ((ElevatorsDirectionIsNoneOrOk(ElevatorWhichRisedAnEvent) && (ElevatorWhichRisedAnEvent.AddNewPassengerIfPossible(this, targetFloor))))
                    {
                        //Set passengerStatus
                        passengerStatus = PassengerStatus.GettingInToTheElevator;

                        //Get in to the elevator
                        ThreadPool.QueueUserWorkItem(delegate { GetInToTheElevator(ElevatorWhichRisedAnEvent); });
                    }
                    else
                    {
                        FindAnElevatorOrCallForANewOne();
                    }
                }
            }
        }
Example #19
0
        private void FindAnElevatorOrCallForANewOne()
        {
            UpdatePassengerDirection();

            //Copy the list of elevators available now on current floor
            List<Elevator> ListOfElevatorsWaitingOnMyFloor = currentFloor.GetListOfElevatorsWaitingHere();

            //Search the right elevator on my floor
            foreach (Elevator elevator in ListOfElevatorsWaitingOnMyFloor)
            {
                if (ElevatorsDirectionIsNoneOrOk(elevator))
                {
                    if (elevator.AddNewPassengerIfPossible(this, this.targetFloor))
                    {
                        //Update insideTheElevator
                        this.passengerStatus = PassengerStatus.GettingInToTheElevator;

                        ThreadPool.QueueUserWorkItem(delegate { GetInToTheElevator(elevator); });
                        return;
                    }
                }
            }

            //Call for an elevator
            myBuilding.ElevatorManager.PassengerNeedsAnElevator(currentFloor, this.PassengerDirection);
        }
Example #20
0
 private string passengerStatusToString(PassengerStatus status)
 {
     switch (status)
     {
         case PassengerStatus.Arrived: return "приехал";
         case PassengerStatus.Idle: return "ждет";
         case PassengerStatus.InCar: return "едет";
         case PassengerStatus.OnStreet: return "ждет";
         default: return "ждет";
     }
 }