예제 #1
0
 private void MoveElevator()
 {
     if (targetLevel == null)
     {
         elevatorState = EElevatorState.Finished;
     }
     else
     {
         float vertical_piston_speed  = ((verticalPistons.Count > 0) ? (verticalPistonSpeed / verticalPistons.Count) : 0.0f);
         float target_piston_position = ((verticalPistons.Count > 0) ? (targetLevel.Height / verticalPistons.Count) : 0.0f);
         foreach (IMyPistonBase vertical_piston in verticalPistons)
         {
             if (vertical_piston.CurrentPosition < target_piston_position)
             {
                 vertical_piston.MinLimit = vertical_piston.LowestPosition;
                 vertical_piston.MaxLimit = target_piston_position;
                 vertical_piston.Velocity = vertical_piston_speed;
             }
             else if (vertical_piston.CurrentPosition > target_piston_position)
             {
                 vertical_piston.MaxLimit = vertical_piston.HighestPosition;
                 vertical_piston.MinLimit = target_piston_position;
                 vertical_piston.Velocity = -vertical_piston_speed;
             }
         }
         if (ArePistonsFinished(verticalPistons))
         {
             elevatorState = EElevatorState.Opening;
         }
     }
 }
예제 #2
0
        private void CloseElevator()
        {
            bool all_closed = true;

            foreach (Level level in levels.Values)
            {
                level.Move(false);
                if (!(level.IsFinished(false)))
                {
                    all_closed = false;
                }
            }
            if (all_closed)
            {
                elevatorState = EElevatorState.Moving;
            }
        }
예제 #3
0
 private void RequestElevator(Level level)
 {
     if ((level != null) && (level != targetLevel))
     {
         if ((elevatorState == EElevatorState.Nothing) || (elevatorState == EElevatorState.Finished))
         {
             targetLevel   = level;
             elevatorState = EElevatorState.Checking;
         }
         else
         {
             if (!(elevatorQueue.ContainsKey(level.Height)))
             {
                 elevatorQueue.Add(level.Height, level);
             }
         }
     }
 }
예제 #4
0
        public void Main(string argument, UpdateType updateSource)
        {
            if ((updateSource & updateUpdateType) == 0)
            {
                UpdateLevels();
                RequestElevator(argument);
            }
            switch (elevatorState)
            {
            case EElevatorState.Nothing:
                if (levels.Count > 0)
                {
                    RequestElevator(levels.FirstPair().Value);
                }
                break;

            case EElevatorState.Checking:
                elevatorState = (CheckElevator() ? EElevatorState.Opening : EElevatorState.Closing);
                break;

            case EElevatorState.Closing:
                CloseElevator();
                break;

            case EElevatorState.Moving:
                MoveElevator();
                break;

            case EElevatorState.Opening:
                if (OpenLevel(targetLevel))
                {
                    elapsedElevatorWaitTime = 0.0;
                    elevatorState           = EElevatorState.Waiting;
                }
                break;

            case EElevatorState.Waiting:
                elapsedElevatorWaitTime += Runtime.TimeSinceLastRun.TotalSeconds;
                if (elapsedElevatorWaitTime >= elevatorWaitTime)
                {
                    elapsedElevatorWaitTime = 0.0f;
                    if (elevatorQueue.Count > 0)
                    {
                        float key = float.PositiveInfinity;
                        foreach (float height in elevatorQueue.Keys)
                        {
                            if (key > height)
                            {
                                key = height;
                            }
                        }
                        targetLevel = elevatorQueue[key];
                        elevatorQueue.Remove(key);
                        elevatorState = EElevatorState.Checking;
                    }
                    else
                    {
                        elevatorState = EElevatorState.Finished;
                    }
                }
                break;
            }
            Echo("State: " + elevatorState + ((targetLevel == null) ? string.Empty : (" (" + targetLevel.Name + ")")));
        }