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);
        }
    }
Ejemplo n.º 2
0
    public void OnGetElevatorUpdateResponse(UpdateElevatorResponse response)
    {
        // Stop running coroutine
        if (coroutineMovingElevator != null)
        {
            StopCoroutine(coroutineMovingElevator);
        }

        if (elevatorData != null) // If null, it means haven't got elevatorData before
        {
            prevElevatorData = elevatorData;
            elevatorData     = response.updatedElevatorData;

            if (elevatorData.status == ElevatorStatus.Opening)
            {
                doorController.Open(OnDoorOpened);
            }

            if (elevatorData.status == ElevatorStatus.MovingDown || elevatorData.status == ElevatorStatus.MovingUp)
            {
                // Run coroutine
                coroutineMovingElevator = StartCoroutine(RoutineMoving(response.destinationY));
            }

            if (elevatorData.status == ElevatorStatus.Arrived)
            {
                SendUpdateElevatorStatusRequest(ElevatorStatus.Opening);
            }

            if (elevatorData.status == ElevatorStatus.Closing)
            {
                doorController.Close(OnDoorClosed);
            }

            UpdateUI();
        }
        else
        {
            Logger.Log(Logger.kTagError, "Elevator Haven't got elevatorData");
        }
    }
    void HandleGetElevatorStatusUpdateRequest(UpdateElevatorStatusRequest request)
    {
        if (elevatorData.status == ElevatorStatus.Arrived && request.newStatus == ElevatorStatus.Opening)
        {
            elevatorData.status = ElevatorStatus.Opening;
            // Send both update status and update response to GUI
            UpdateElevatorStatusResponse updateStatusRepsonse = new UpdateElevatorStatusResponse(ResultCode.Succeeded, elevatorData.status);
            SendUpdateElevatorStatusResponse(updateStatusRepsonse);

            UpdateElevatorResponse updateElevatorResponse = new UpdateElevatorResponse(elevatorData, 0);
            SendUpdateElevatorResponse(updateElevatorResponse);
        }

        if (elevatorData.status == ElevatorStatus.Opening && request.newStatus == ElevatorStatus.Opened)
        {
            elevatorData.status = ElevatorStatus.Opened;
            UpdateElevatorStatusResponse response = new UpdateElevatorStatusResponse(ResultCode.Succeeded, elevatorData.status);
            SendUpdateElevatorStatusResponse(response);
        }

        if (elevatorData.status == ElevatorStatus.Opened && request.newStatus == ElevatorStatus.Closing)
        {
            elevatorData.status = ElevatorStatus.Closing;
            UpdateElevatorStatusResponse updateStatusResponse = new UpdateElevatorStatusResponse(ResultCode.Succeeded, elevatorData.status);
            SendUpdateElevatorStatusResponse(updateStatusResponse);

            UpdateElevatorResponse updateElevatorResponse = new UpdateElevatorResponse(elevatorData, 0);
            SendUpdateElevatorResponse(updateElevatorResponse);
        }

        if (elevatorData.status == ElevatorStatus.Closing && request.newStatus == ElevatorStatus.Closed)
        {
            elevatorData.status = ElevatorStatus.Closed;
            UpdateElevatorStatusResponse updateStatusResponse = new UpdateElevatorStatusResponse(ResultCode.Succeeded, elevatorData.status);
            SendUpdateElevatorStatusResponse(updateStatusResponse);

            UpdateElevator();
        }
    }
 void SendUpdateElevatorResponse(UpdateElevatorResponse response)
 {
     elevatorController?.OnGetElevatorUpdateResponse(response);
     Logger.Log(logTagRes, "SendElevatorUpdateResponse " + JsonUtility.ToJson(response));
 }
    /// <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);
            }
        }
    }