public Elevator AddRequest(int floorNumber, FloorRequestDirection requestDirection, int destinationFloor, ElevatorCallback elvatorArrivedAtFloorCallback, ElevatorCallback servedRequestCallback) { Elevator elevatorServedRequest = null; AutoResetEvent waitforCompletionSignal = new AutoResetEvent(false); AddFloorRequest(floorNumber, requestDirection, elevatorArrivedAtRequestFloor: (elevatorArrivedAtFloor) => { elevatorArrivedAtFloor.AddRequest(destinationFloor: destinationFloor, servedRequestCallback: (elevator) => { elevatorServedRequest = elevator; Debug.WriteLine("Closing door after serving request"); servedRequestCallback(elevator); waitforCompletionSignal.Set(); }); Debug.WriteLine("Closing door at arrived floor"); elvatorArrivedAtFloorCallback(elevatorArrivedAtFloor); }); waitforCompletionSignal.WaitOne(); return(elevatorServedRequest); }
public void AddFloorRequest(int floorNumber, FloorRequestDirection requestDirection, ElevatorCallback elevatorArrivedAtRequestFloor) { if (requestDirection == FloorRequestDirection.UP) { _floors[floorNumber].SetMovingUpRequest(elevatorArrivedAtRequestFloor); } else { _floors[floorNumber].SetMovingDownRequest(elevatorArrivedAtRequestFloor); } Elevator elevatorInRequestFloor = _elevatorPicker.GetSutableElevator(_minFloor, _maxFloor, floorNumber, requestDirection, _elevators); elevatorInRequestFloor.AddRequest(floorNumber, elevatorArrivedAtRequestFloor); }
private static Elevator GetElevatorInFloor(int actualFloor, int currentSearchingFloor, FloorRequestDirection requestDirection, List <Elevator> elevatorsList) { ElevatorState preferredElevatorState = FloorRequestDirection.Down == requestDirection ? ElevatorState.GoingDown : ElevatorState.GoingUp; Elevator elevatorSelected = null; //Checking if any elevator moving towards requested floor and in requested direction if ((requestDirection == FloorRequestDirection.UP && currentSearchingFloor <= actualFloor) || (requestDirection == FloorRequestDirection.Down && currentSearchingFloor >= actualFloor)) { elevatorSelected = elevatorsList.FirstOrDefault(elevator => (elevator.CurrentFloor == currentSearchingFloor && elevator.State == preferredElevatorState)); } //If no elevator moving in request direction then checking if any elevator in stopped current floor if (null == elevatorSelected) { elevatorSelected = elevatorsList.FirstOrDefault(elevator => (elevator.CurrentFloor == currentSearchingFloor && elevator.State == ElevatorState.Stopped)); } return(elevatorSelected); }
public Elevator GetSutableElevator(int minFloor, int maxfloor, int floorNumber, FloorRequestDirection requestDirection, List <Elevator> elevatorsList) { Elevator elevatorSelected = null; int counter = 0; while (floorNumber + counter <= maxfloor || floorNumber - counter >= minFloor) { if (floorNumber + counter <= maxfloor) { elevatorSelected = GetElevatorInFloor(floorNumber, floorNumber + counter, requestDirection, elevatorsList); } if (elevatorSelected == null) { if (floorNumber - counter >= minFloor) { elevatorSelected = GetElevatorInFloor(floorNumber, floorNumber - counter, requestDirection, elevatorsList); } } if (elevatorSelected != null) { return(elevatorSelected); } counter++; } return(elevatorSelected); }
//TODO: This is blocking request currently this can be changed async public Elevator AddRequest(int floorNumber, FloorRequestDirection requestDirection, int destinationFloor) { return(AddRequest(floorNumber, requestDirection, destinationFloor, elvatorArrivedAtFloorCallback: Elevator.CloseDoorsAction, servedRequestCallback: Elevator.CloseDoorsAction)); }
public void GivenMultipleElevatorsInSameFloor_WhenRequestIsRaised_ThenNearestAndPrefrredStateElevatorIsSelected(int floor, FloorRequestDirection floorRequestDirection, int goingUpElevatorFloor, int goingDownElevatorFloor, int stoppedElevatorFloor, string expectedElevator) { //Arrange var floors = new SortedList <int, Floor>() { { 1, new Floor(1) } }; ElevatorPicker elevatorPicker = new ElevatorPicker(); var elevatorOne = new Mock <Elevator>(floors, ""); elevatorOne.Setup(elevator => elevator.Name).Returns(() => "Elevator 1"); elevatorOne.Setup(elevator => elevator.CurrentFloor).Returns(() => goingUpElevatorFloor); elevatorOne.Setup(elevator => elevator.State).Returns(() => ElevatorState.GoingUp); var elevatorTwo = new Mock <Elevator>(floors, ""); elevatorTwo.Setup(elevator => elevator.Name).Returns(() => "Elevator 2"); elevatorTwo.Setup(elevator => elevator.CurrentFloor).Returns(() => goingDownElevatorFloor); elevatorTwo.Setup(elevator => elevator.State).Returns(() => ElevatorState.GoingDown); var elevatorThree = new Mock <Elevator>(floors, ""); elevatorThree.Setup(elevator => elevator.Name).Returns(() => "Elevator 3"); elevatorThree.Setup(elevator => elevator.CurrentFloor).Returns(() => stoppedElevatorFloor); elevatorThree.Setup(elevator => elevator.State).Returns(() => ElevatorState.Stopped); List <Elevator> elevators = new List <Elevator>(); elevators.Add(elevatorOne.Object); elevators.Add(elevatorTwo.Object); elevators.Add(elevatorThree.Object); //Act Elevator elevatorReturned = elevatorPicker.GetSutableElevator(minFloor: -2, maxfloor: 10, floorNumber: floor, requestDirection: floorRequestDirection, elevatorsList: elevators); //Assert Assert.Equal(expectedElevator, elevatorReturned.Name); }