private void JumpToNextRequest() { if (currRequests.Count == 0) { if (currOppositeRequests.Count > 0) { currRequests = currOppositeRequests; } else if (currDelayedRequests.Count > 0) { currRequests = currDelayedRequests; } else { SetState(idleState); return; } } currRequest = currRequests.Peek; if (currRequest.FloorNum == currFloorNum) { RequestNoLongerActual(currRequest, this); currRequests.Dequeue(); JumpToNextRequest(); if (currRequests.Count == 0) { SetState(idleState); return; } } SetState(movingState); }
//todo: make it not that scary public void AddRequest(int desiredFloorNum, ElevatorDirection desiredDirection) { if (desiredFloorNum < 1 || !Floors.ContainsKey(desiredFloorNum)) { return; } if (desiredDirection == ElevatorDirection.none) // from cabin btn { if (desiredFloorNum == currFloorNum) { return; } desiredDirection = GetDirectionToRequestedFloor(desiredFloorNum); CabinFloorRequested.Invoke(desiredFloorNum); } var request = new Request(desiredDirection, desiredFloorNum); if (IsIdle) { if (request.Direction == ElevatorDirection.up) { currRequests = upRequests; currOppositeRequests = downRequests; currDelayedRequests = upDelayedRequests; } else { currRequests = downRequests; currOppositeRequests = upRequests; currDelayedRequests = downDelayedRequests; } currRequests.Enqueue(request); currRequest = request; SetState(movingState); PrintElevatorState(); return; } if (request.Equals(currRequest)) { RequestNoLongerActual.Invoke(currRequest, this); } else if (request.Direction != currRequest.Direction) { currOppositeRequests.Enqueue(request); } else if (movingDirection != request.Direction) { currRequests.Enqueue(request); } else if ((movingDirection == ElevatorDirection.up ? 1 : -1) * (request.FloorNum - currFloorNum) > 0) { currRequests.Enqueue(request); } else { currDelayedRequests.Enqueue(request); } if (IsIdle) { return; } if (currentState != doorsCycleState) { currRequest = currRequests.Peek; } PrintElevatorState(); }