void HandleUpdateElevatorPositionRequest(UpdateElevatorPositionRequest request)
    {
        uint nextFloor = elevatorData.curFloorLevel;

        if (elevatorData.status == ElevatorStatus.MovingDown)
        {
            nextFloor = elevatorData.curFloorLevel - 1;
            FloorController floorController = GetFloorController(nextFloor);
            if (floorController)
            {
                if (request.positionY <= floorController.GetFittedElevatorAnchoredPositionY())
                {
                    elevatorData.curFloorLevel = nextFloor;
                    // Update elevator status
                    SendElevatorStatusResponseToAllFloor();
                }
            }
        }
        else if (elevatorData.status == ElevatorStatus.MovingUp)
        {
            nextFloor = elevatorData.curFloorLevel + 1;
            FloorController floorController = GetFloorController(nextFloor);
            if (floorController)
            {
                if (request.positionY >= floorController.GetFittedElevatorAnchoredPositionY())
                {
                    elevatorData.curFloorLevel = nextFloor;
                    // Update elevator status
                    SendElevatorStatusResponseToAllFloor();
                }
            }
        }

        // Elevator arrived
        if (elevatorData.curFloorLevel == curDestFloor)
        {
            // Remove cur floor from list requesting
            listFloorsRequesting.Remove(curDestFloor);

            // Update floor status using elevator status
            if (elevatorData.status == ElevatorStatus.MovingDown || elevatorData.status == ElevatorStatus.MovingUp)
            {
                FloorData floorData = GetFloorData(elevatorData.curFloorLevel);
                floorData.OnElevatorArrived(curElevatorDirection);

                ElevatorArrivedResponse elevatorArrivedResponse = new ElevatorArrivedResponse(floorData);
                SendElevatorArrivedResponse(elevatorArrivedResponse);
            }

            elevatorData.status = ElevatorStatus.Arrived;
            UpdateElevatorResponse response = new UpdateElevatorResponse(elevatorData, 0);
            SendUpdateElevatorResponse(response);
        }
        else
        {
            UpdateElevatorPositionResponse response = new UpdateElevatorPositionResponse(ResultCode.Succeeded, elevatorData.curFloorLevel);
            SendUpdateElevatorPositionResponse(response);
        }
    }
    void SendElevatorArrivedResponse(ElevatorArrivedResponse response)
    {
        FloorController floorController = GetFloorController(response.floorData.level);

        floorController?.OnGetElevatorArrivedResponse(response);

        elevatorInterfaceController?.OnGetElevatorArrivedResponse(response);
    }
Ejemplo n.º 3
0
 public void OnGetElevatorArrivedResponse(ElevatorArrivedResponse response)
 {
     GetButtonController(response.floorData.level)?.SetSelected(false);
 }
Ejemplo n.º 4
0
 public void OnGetElevatorArrivedResponse(ElevatorArrivedResponse response)
 {
     floorData = response.floorData;
     UpdateUI();
 }
    /// <summary>
    /// Processes data and send approriate command to elevator
    /// </summary>
    void UpdateElevator()
    {
        // find the closest floor requested at current direction
        if (elevatorData.status == ElevatorStatus.Waiting)
        {
            FloorData floorData = GetFloorData(elevatorData.curFloorLevel);
            if (floorData.status == FloorStatus.Waiting)
            {
                // Current floor doesn't have request, let's find one in both direction
                uint nextFloor = GameConfig.kFloorInvalid;
                nextFloor = FindNextRequestedFloor(Direction.Both, true);
                if (nextFloor >= GameConfig.GetBottomFloor() && nextFloor <= GameConfig.GetTopFloor())
                {
                    curDestFloor = nextFloor;
                    // Update elevator data and send response to GUI
                    elevatorData.status = curDestFloor > elevatorData.curFloorLevel ? ElevatorStatus.MovingUp : ElevatorStatus.MovingDown;
                    float destinationY = GetFloorController(curDestFloor).GetFittedElevatorAnchoredPositionY();
                    UpdateElevatorResponse response = new UpdateElevatorResponse(elevatorData, destinationY);
                    SendUpdateElevatorResponse(response);
                }
            }
            else
            {
                // Cur floor has request, sends response to floor
                curElevatorDirection = floorData.status == FloorStatus.RequestingDown ? Direction.Down : Direction.Up;
                floorData.OnElevatorArrived(curElevatorDirection);
                SendElevatorArrivedResponse(new ElevatorArrivedResponse(floorData));
                // Then sends response to elevator
                elevatorData.status = ElevatorStatus.Opening;
                UpdateElevatorResponse response = new UpdateElevatorResponse(elevatorData, 0);
                SendUpdateElevatorResponse(response);
            }
        }

        if (elevatorData.status == ElevatorStatus.Closed)
        {
            uint nextFloor = GameConfig.kFloorInvalid;
            // Find next floor with current direction
            nextFloor = FindNextRequestedFloor(curElevatorDirection, true);
            if (nextFloor == GameConfig.kFloorInvalid)
            {
                // Cannot find any floor requested at cur direction, find other direction, include current floor as well
                curElevatorDirection = curElevatorDirection == Direction.Down ? Direction.Up : Direction.Down;
                nextFloor            = FindNextRequestedFloor(curElevatorDirection, false);
            }

            if (nextFloor == GameConfig.kFloorInvalid)
            {
                // No Request, waiting
                elevatorData.status = ElevatorStatus.Waiting;
                UpdateElevatorResponse response = new UpdateElevatorResponse(elevatorData, 0);
                SendUpdateElevatorResponse(response);
            }
            else
            {
                // Update elevator data and send response to GUI
                curDestFloor        = nextFloor;
                elevatorData.status = curElevatorDirection == Direction.Up ? ElevatorStatus.MovingUp : ElevatorStatus.MovingDown;
                float destinationY = GetFloorController(curDestFloor).GetFittedElevatorAnchoredPositionY();
                UpdateElevatorResponse response = new UpdateElevatorResponse(elevatorData, destinationY);
                SendUpdateElevatorResponse(response);
                // Update Elevator Status
                SendElevatorStatusResponseToAllFloor();
            }
        }

        if (elevatorData.status == ElevatorStatus.MovingDown)
        {
            uint nextFloor = FindNextRequestedFloor(Direction.Down, true);
            if (nextFloor > curDestFloor) // Found a floor requested on the way, but not current floor!
            {
                curDestFloor = nextFloor;
                float destinationY = GetFloorController(curDestFloor).GetFittedElevatorAnchoredPositionY();
                UpdateElevatorResponse response = new UpdateElevatorResponse(elevatorData, destinationY);
                SendUpdateElevatorResponse(response);
            }
        }

        if (elevatorData.status == ElevatorStatus.MovingUp)
        {
            uint nextFloor = FindNextRequestedFloor(Direction.Up, true);
            if (nextFloor != GameConfig.kFloorInvalid &&
                nextFloor < curDestFloor) // Found a floor requested on the way, but not current floor!
            {
                curDestFloor = nextFloor;
                float destinationY = GetFloorController(curDestFloor).GetFittedElevatorAnchoredPositionY();
                UpdateElevatorResponse response = new UpdateElevatorResponse(elevatorData, destinationY);
                SendUpdateElevatorResponse(response);
            }
        }

        if (elevatorData.status == ElevatorStatus.Closing)
        {
            // Got Requested from current floor while closing
            FloorData floorData = GetFloorData(elevatorData.curFloorLevel);
            if (floorData.HasRequestAtDirection(curElevatorDirection))
            {
                elevatorData.status = ElevatorStatus.Opening;
                UpdateElevatorResponse updateElevatorResponse = new UpdateElevatorResponse(elevatorData, 0);
                SendUpdateElevatorResponse(updateElevatorResponse);

                // Update floor status
                floorData.OnElevatorArrived(curElevatorDirection);
                ElevatorArrivedResponse elevatorArrivedResponse = new ElevatorArrivedResponse(floorData);
                SendElevatorArrivedResponse(elevatorArrivedResponse);
            }
        }

        if (elevatorData.status == ElevatorStatus.Opened || elevatorData.status == ElevatorStatus.Opening)
        {
            // Got Requested from current floor, then tell it we've arrived
            FloorData floorData = GetFloorData(elevatorData.curFloorLevel);
            if (floorData.HasRequestAtDirection(curElevatorDirection))
            {
                // Update floor status
                floorData.OnElevatorArrived(curElevatorDirection);
                ElevatorArrivedResponse elevatorArrivedResponse = new ElevatorArrivedResponse(floorData);
                SendElevatorArrivedResponse(elevatorArrivedResponse);
            }
        }
    }