private void EnsureInitialised() { if (state != DrillTowerState.None) { return; } // Initial state after eg. game load. // Infer current operation. if (pistonGroup.IsExtending) { // Probably already drilling. Do start-up checks again. state = DrillTowerState.Starting; } else if (pistonGroup.IsRetracting || pistonGroup.ExtensionPercentage > 0) { // Probably retrieving. Do retrieval checks again. state = DrillTowerState.Retrieving; } else { // Fallback. Do retrieval checks again, although we're probably already clamped. state = DrillTowerState.Retrieving; } }
public void EmergencyStop() { pistonGroup.Stop(); StopRotor(); drillHead.Stop(); TryLockClamps(); state = DrillTowerState.EmergencyStopped; }
private static string DescribeState(DrillTowerState state) { switch (state) { case DrillTowerState.None: return("Initialising"); case DrillTowerState.Stopped: return("Idle"); case DrillTowerState.Starting: return("Starting"); case DrillTowerState.Drilling: return("Drilling"); case DrillTowerState.Retrieving: return("Retrieving"); case DrillTowerState.Stopping: return("Stopping"); case DrillTowerState.EmergencyStopped: return("EMERGENCY STOP"); } return(""); }
/// <summary> /// Returns true if an operation is in progress and should regularly be updated. /// </summary> /// <returns></returns> public bool Run() { EnsureInitialised(); if (!IsDrillViable()) { EmergencyStop(); return(false); } pistonGroup.UpdateState(); drillHead.UpdateState(); clampGroup.UpdateState(); lights.UpdateState(); switch (state) { case DrillTowerState.Starting: if (!clampGroup.IsViable) { EmergencyStop(); return(false); } // If possible, lock the drill head while we spin up. pistonGroup.Stop(); TryLockClamps(); if (IsRotorRunning() && drillHead.IsDrilling) { // Drill is operating. Prepare to extend. state = DrillTowerState.Drilling; } StartRotor(); drillHead.Start(); return(true); case DrillTowerState.Drilling: if (!IsRotorRunning() || !drillHead.IsDrilling) { // Should not be in this state. EmergencyStop(); return(false); } if (!TryUnlockClamps()) { // Unable to release the clamps. EmergencyStop(); return(false); } pistonGroup.Extend(); return(true); case DrillTowerState.Retrieving: if (TryLockClamps()) { pistonGroup.Stop(); state = DrillTowerState.Stopping; return(true); } pistonGroup.Retract(); return(true); case DrillTowerState.Stopping: pistonGroup.Stop(); if (!TryLockClamps()) { return(true); } StopRotor(); drillHead.Stop(); if (!IsRotorRunning()) { state = DrillTowerState.Stopped; return(true); } return(true); case DrillTowerState.Stopped: pistonGroup.Stop(); StopRotor(); drillHead.Stop(); return(false); case DrillTowerState.EmergencyStopped: default: EmergencyStop(); return(false); } }
public void StopDrilling() { state = DrillTowerState.Retrieving; }
public void StartDrilling() { state = DrillTowerState.Starting; }