Esempio n. 1
0
        /// <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;
            }
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
            }
        }
Esempio n. 4
0
        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);
        }