/// <summary> /// Retrieves all the request from Elevator screen and floor screen. /// Process all the request in a background thread and returns back to UI screen /// </summary> /// <param name="elevatorMessage">The elevator message.</param> private void ElevatorFloorControlSystem(ElevatorMessage elevatorMessage) { //Floor Press direction decision switch (elevatorMessage.RequestType) { //Button Floor press case EnumElevatorRequestType.Floor: _elevatorService.SetUpQueue(elevatorMessage.Direction, elevatorMessage.DestinationFloor); ElevatorProcessExecute(elevatorMessage); break; // //Button Elevator press case EnumElevatorRequestType.Elevator: elevatorMessage.Direction = _elevatorService.GetDirection(elevatorMessage.DestinationFloor); if (elevatorMessage.Direction != EnumElevatorDirection.Invalid) { _elevatorService.SetUpQueue(elevatorMessage.Direction, elevatorMessage.DestinationFloor); ElevatorProcessExecute(elevatorMessage); } break; default: Console.Write("Invalid Request"); break; } }
private void Navigate(string inElevatorPress) { ElevatorMessage elevatorMessage = new ElevatorMessage(); switch (inElevatorPress) { case "0": elevatorMessage.DestinationFloor = 0; break; case "1": elevatorMessage.DestinationFloor = 1; break; case "2": elevatorMessage.DestinationFloor = 2; break; case "3": elevatorMessage.DestinationFloor = 3; break; case "4": elevatorMessage.DestinationFloor = 4; break; case "5": elevatorMessage.DestinationFloor = 5; break; case "6": elevatorMessage.DestinationFloor = 6; break; case "7": elevatorMessage.DestinationFloor = 7; break; case "8": elevatorMessage.DestinationFloor = 8; break; case "9": elevatorMessage.DestinationFloor = 9; break; case "10": elevatorMessage.DestinationFloor = 10; break; case "11": elevatorMessage.DestinationFloor = 11; break; case "12": elevatorMessage.DestinationFloor = 12; break; } elevatorMessage.RequestType = EnumElevatorRequestType.Elevator; this._eventAggregator.GetEvent <ElevatorControlSystemBackgroundEvent>().Publish(elevatorMessage); }
private void ElevatorProcessExecute(ElevatorMessage elevatorMessage) { ElevatorStatus responseMessage = new ElevatorStatus(); try { //check if other thread processed your request if (!_elevatorService.IsRequestOperated(elevatorMessage.Direction, elevatorMessage.DestinationFloor)) { //Wait in the queue to process your request until other thread request releases the lock lock (_object) { //Now this thread got an access, need to check again for the request. if (!_elevatorService.IsRequestOperated(elevatorMessage.Direction, elevatorMessage.DestinationFloor)) { if (elevatorMessage.DestinationFloor >= _elevatorService.CurrentFloor) { while (elevatorMessage.DestinationFloor >= _elevatorService.CurrentFloor && _elevatorService.CurrentFloor <= MAX_FLOOR && _elevatorService.GetUpQueueMax != -1) { _elevatorService.Operate(EnumElevatorDirection.Up); if (_elevatorService.Status == EnumElevatorStatus.Stopped) { responseMessage.Direction = EnumElevatorDirection.Up; responseMessage.Message = EnumElevatorStatus.Stopping; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(3000); responseMessage.Direction = EnumElevatorDirection.Up; responseMessage.Message = EnumElevatorStatus.Hold; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(1000); } else { responseMessage.Direction = EnumElevatorDirection.Up; responseMessage.Message = _elevatorService.Status; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(1000); } if (_elevatorService.GetUpQueueMax != -1) { _elevatorService.MoveUp(); } } while (_elevatorService.GetUpQueueMax > elevatorMessage.DestinationFloor && _elevatorService.CurrentFloor <= MAX_FLOOR && _elevatorService.GetUpQueueMax != -1) { _elevatorService.Operate(EnumElevatorDirection.Up); if (_elevatorService.Status == EnumElevatorStatus.Stopped) { responseMessage.Direction = EnumElevatorDirection.Up; responseMessage.Message = EnumElevatorStatus.Stopping; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(3000); responseMessage.Direction = _elevatorService.Direction; responseMessage.Message = EnumElevatorStatus.Hold; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(1000); } else { responseMessage.Direction = EnumElevatorDirection.Up; responseMessage.Message = _elevatorService.Status; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); } if (_elevatorService.GetUpQueueMax != -1) { _elevatorService.MoveUp(); } } //Change direction if no more request from top floor while (_elevatorService.GetDownQueueMax >= _elevatorService.CurrentFloor && _elevatorService.CurrentFloor >= MIN_FLOOR && _elevatorService.GetDownQueueMax != -1) { _elevatorService.Operate(EnumElevatorDirection.Down); _elevatorService.Operate(EnumElevatorDirection.Up); if (_elevatorService.Status == EnumElevatorStatus.Stopped) { responseMessage.Direction = EnumElevatorDirection.Up; responseMessage.Message = EnumElevatorStatus.Stopping; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(3000); responseMessage.Direction = _elevatorService.Direction; responseMessage.Message = EnumElevatorStatus.Hold; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(1000); } else { responseMessage.Direction = EnumElevatorDirection.Up; responseMessage.Message = _elevatorService.Status; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(1000); } if (_elevatorService.GetDownQueueMax != -1) { _elevatorService.MoveUp(); } } //Change direction if no more request from top floor while (_elevatorService.GetDownQueueMax >= _elevatorService.CurrentFloor && _elevatorService.CurrentFloor <= MAX_FLOOR && _elevatorService.GetDownQueueMax != -1) { _elevatorService.Operate(EnumElevatorDirection.Down); _elevatorService.Operate(EnumElevatorDirection.Up); if (_elevatorService.Status == EnumElevatorStatus.Stopped) { responseMessage.Direction = EnumElevatorDirection.Up; responseMessage.Message = EnumElevatorStatus.Stopping; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(3000); responseMessage.Direction = EnumElevatorDirection.Up; responseMessage.Message = EnumElevatorStatus.Hold; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(1000); } else { responseMessage.Direction = EnumElevatorDirection.Up; responseMessage.Message = _elevatorService.Status; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(1000); } if (_elevatorService.GetDownQueueMax != -1) { _elevatorService.MoveUp(); } } } else if (elevatorMessage.DestinationFloor <= _elevatorService.CurrentFloor) { while (elevatorMessage.DestinationFloor <= _elevatorService.CurrentFloor && _elevatorService.CurrentFloor >= MIN_FLOOR && _elevatorService.GetDownQueueMin != -1) { _elevatorService.Operate(EnumElevatorDirection.Down); if (_elevatorService.Status == EnumElevatorStatus.Stopped) { responseMessage.Direction = EnumElevatorDirection.Down; responseMessage.Message = EnumElevatorStatus.Stopping; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(3000); responseMessage.Direction = EnumElevatorDirection.Down; responseMessage.Message = EnumElevatorStatus.Hold; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(1000); } else { responseMessage.Direction = EnumElevatorDirection.Down; responseMessage.Message = _elevatorService.Status; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(1000); } if (_elevatorService.GetDownQueueMin != -1) { _elevatorService.MoveDown(); } } while (_elevatorService.GetDownQueueMin < elevatorMessage.DestinationFloor && _elevatorService.CurrentFloor >= MIN_FLOOR && _elevatorService.GetDownQueueMin != -1) { _elevatorService.Operate(EnumElevatorDirection.Down); if (_elevatorService.Status == EnumElevatorStatus.Stopped) { responseMessage.Direction = EnumElevatorDirection.Down; responseMessage.Message = EnumElevatorStatus.Stopping; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(3000); responseMessage.Direction = EnumElevatorDirection.Down; responseMessage.Message = EnumElevatorStatus.Hold; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(1000); } else { responseMessage.Direction = EnumElevatorDirection.Down; responseMessage.Message = _elevatorService.Status; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(1000); } if (_elevatorService.GetDownQueueMin != -1) { _elevatorService.MoveDown(); } } //Change direction if no more request from down floors while (_elevatorService.GetUpQueueMax >= _elevatorService.CurrentFloor && _elevatorService.CurrentFloor <= MAX_FLOOR && _elevatorService.GetUpQueueMax != -1) { _elevatorService.Operate(EnumElevatorDirection.Up); _elevatorService.Operate(EnumElevatorDirection.Down); if (_elevatorService.Status == EnumElevatorStatus.Stopped) { responseMessage.Direction = _elevatorService.Direction; responseMessage.Message = EnumElevatorStatus.Stopping; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(3000); responseMessage.Direction = EnumElevatorDirection.Down; responseMessage.Message = EnumElevatorStatus.Hold; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(1000); } else { responseMessage.Direction = EnumElevatorDirection.Down; responseMessage.Message = _elevatorService.Status; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(1000); } if (_elevatorService.GetUpQueueMax != -1) { _elevatorService.MoveDown(); } } //Change direction if no more request from down floors while (_elevatorService.GetUpQueueMax <= _elevatorService.CurrentFloor && _elevatorService.CurrentFloor >= MIN_FLOOR && _elevatorService.GetUpQueueMax != -1) { _elevatorService.Operate(EnumElevatorDirection.Up); _elevatorService.Operate(EnumElevatorDirection.Down); if (_elevatorService.Status == EnumElevatorStatus.Stopped) { responseMessage.Direction = EnumElevatorDirection.Down; responseMessage.Message = EnumElevatorStatus.Stopping; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(3000); responseMessage.Direction = EnumElevatorDirection.Down; responseMessage.Message = EnumElevatorStatus.Hold; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(1000); } else { responseMessage.Direction = EnumElevatorDirection.Down; responseMessage.Message = _elevatorService.Status; responseMessage.FloorNo = _elevatorService.CurrentFloor; PublishElevatorMessage(responseMessage); Thread.Sleep(1000); } if (_elevatorService.GetUpQueueMax != -1) { _elevatorService.MoveDown(); } } } } } } } catch (Exception ex) { _logger.Log("ElevatorFloorControlSystem : " + ex, Category.Exception, Priority.High); } }
private void Navigate(string floorPress) { ElevatorMessage elevatorPress = new ElevatorMessage(); switch (floorPress) { case "0U": elevatorPress.Direction = EnumElevatorDirection.Up; elevatorPress.DestinationFloor = 0; break; case "1U": elevatorPress.Direction = EnumElevatorDirection.Up; elevatorPress.DestinationFloor = 1; break; case "1D": elevatorPress.Direction = EnumElevatorDirection.Down; elevatorPress.DestinationFloor = 1; break; case "2U": elevatorPress.Direction = EnumElevatorDirection.Up; elevatorPress.DestinationFloor = 2; break; case "2D": elevatorPress.Direction = EnumElevatorDirection.Down; elevatorPress.DestinationFloor = 2; break; case "3U": elevatorPress.Direction = EnumElevatorDirection.Up; elevatorPress.DestinationFloor = 3; break; case "3D": elevatorPress.Direction = EnumElevatorDirection.Down; elevatorPress.DestinationFloor = 3;; break; case "4U": elevatorPress.Direction = EnumElevatorDirection.Up; elevatorPress.DestinationFloor = 4; break; case "4D": elevatorPress.Direction = EnumElevatorDirection.Down; elevatorPress.DestinationFloor = 4; break; case "5U": elevatorPress.Direction = EnumElevatorDirection.Up; elevatorPress.DestinationFloor = 5; break; case "5D": elevatorPress.Direction = EnumElevatorDirection.Down; elevatorPress.DestinationFloor = 5; break; case "6U": elevatorPress.Direction = EnumElevatorDirection.Up; elevatorPress.DestinationFloor = 6; break; case "6D": elevatorPress.Direction = EnumElevatorDirection.Down; elevatorPress.DestinationFloor = 6; break; case "7U": elevatorPress.Direction = EnumElevatorDirection.Up; elevatorPress.DestinationFloor = 7; break; case "7D": elevatorPress.Direction = EnumElevatorDirection.Down; elevatorPress.DestinationFloor = 7; break; case "8U": elevatorPress.Direction = EnumElevatorDirection.Up; elevatorPress.DestinationFloor = 8; break; case "8D": elevatorPress.Direction = EnumElevatorDirection.Down; elevatorPress.DestinationFloor = 8; break; case "9U": elevatorPress.Direction = EnumElevatorDirection.Up; elevatorPress.DestinationFloor = 9; break; case "9D": elevatorPress.Direction = EnumElevatorDirection.Down; elevatorPress.DestinationFloor = 9; break; case "10U": elevatorPress.Direction = EnumElevatorDirection.Up; elevatorPress.DestinationFloor = 10; break; case "10D": elevatorPress.Direction = EnumElevatorDirection.Down; elevatorPress.DestinationFloor = 10; break; case "11U": elevatorPress.Direction = EnumElevatorDirection.Up; elevatorPress.DestinationFloor = 11; break; case "11D": elevatorPress.Direction = EnumElevatorDirection.Down; elevatorPress.DestinationFloor = 11; break; case "12D": elevatorPress.Direction = EnumElevatorDirection.Down; elevatorPress.DestinationFloor = 12; break; } //Publishing UI request to Elevator Control system(ref:ElevatorSystemController) elevatorPress.RequestType = EnumElevatorRequestType.Floor; this._eventAggregator.GetEvent <ElevatorControlSystemBackgroundEvent>().Publish(elevatorPress); }