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; } } }
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; } }
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); } } } }
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 + ")"))); }