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(); } } } }
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); }
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); }
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); } }
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)); } } }
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; }
private void _success() { _status = PassengerStatus.Arrived; if (SuccessArriveEvent != null) { SuccessArriveEvent.Invoke(this); } }
public Passenger( Guid flightId, string name, PassengerStatus status) : base(Table) { FlightId = flightId; Name = name; Status = status; }
public void AboardBus(IBus bus) { _status = PassengerStatus.Moving; _stand = null; if (StopWaitingEvent != null) { StopWaitingEvent.Invoke(this); } }
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); }); } }
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); }); } }
private void _fail() { _status = PassengerStatus.Failed; if (StopWaitingEvent != null) { StopWaitingEvent.Invoke(this); } if (AngryExitEvent != null) { AngryExitEvent.Invoke(this); } _view.FailedAnimate(_stand); _stand.ExitStation(this); }
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; }
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); } }
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); }
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); } }
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(); } } } }
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); }
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 "ждет"; } }