public Drill() { string storage = Storage; Runtime.UpdateFrequency = UpdateFrequency.Update1; if (storage != null) { byte[] data = Convert.FromBase64String(storage); if (data.Length == (sizeof(byte) + sizeof(double) + sizeof(byte))) { try { EDrillState drill_state = (EDrillState)(data[0]); double elapsed_time = BitConverter.ToDouble(data, 1); bool is_straight_extending = (data[9] & 0x1) == 0x1; bool is_sideways_extending = (data[9] & 0x2) == 0x2; drillState = drill_state; elapsedTime = elapsed_time; isStraightExtending = is_straight_extending; isSidewaysExtending = is_sideways_extending; } catch (Exception e) { Echo(e.ToString()); } } Storage = string.Empty; } Refresh(); }
public void Main(string argument, UpdateType updateSource) { switch (argument.Trim().ToLower()) { case "refresh": Refresh(); break; case "start": case "restart": drillState = EDrillState.InitializeVertical; break; case "stop": drillState = EDrillState.FinishVertical; break; } switch (drillState) { case EDrillState.InitializeVertical: SetDrillsState(false); if (MovePistonGroup(EPistonGroupType.Vertical, -Math.Abs(guideSpeed))) { drillState = EDrillState.InitializeSideways; } break; case EDrillState.InitializeSideways: SetDrillsState(false); if (MovePistonGroup(EPistonGroupType.Sideways, -Math.Abs(guideSpeed))) { drillState = EDrillState.InitializeStraight; } break; case EDrillState.InitializeStraight: SetDrillsState(false); if (MovePistonGroup(EPistonGroupType.Straight, -Math.Abs(guideSpeed))) { drillState = EDrillState.OperationStraight; } break; case EDrillState.OperationStraight: SetDrillsState(true); if (MovePistonGroup(EPistonGroupType.Straight, isStraightExtending ? Math.Abs(operationalSpeed) : -Math.Abs(operationalSpeed))) { drillState = (IsPistonGroupFinished(EPistonGroupType.Vertical, true) ? EDrillState.FinishVertical : (IsPistonGroupFinished(EPistonGroupType.Sideways, isSidewaysExtending) ? EDrillState.OperationVertical : EDrillState.OperationSideways)); elapsedTime = 0.0; } break; case EDrillState.OperationSideways: elapsedTime += Runtime.TimeSinceLastRun.TotalSeconds; SetDrillsState(true); if (MovePistonGroup(EPistonGroupType.Sideways, isSidewaysExtending ? Math.Abs(operationalSpeed) : -Math.Abs(operationalSpeed)) || (elapsedTime >= adjustmentTime)) { StopPistonGroup(EPistonGroupType.Sideways); drillState = EDrillState.OperationStraight; isStraightExtending = !isStraightExtending; elapsedTime = 0.0; } break; case EDrillState.OperationVertical: elapsedTime += Runtime.TimeSinceLastRun.TotalSeconds; SetDrillsState(true); if (MovePistonGroup(EPistonGroupType.Vertical, Math.Abs(operationalSpeed)) || (elapsedTime >= adjustmentTime)) { StopPistonGroup(EPistonGroupType.Vertical); drillState = EDrillState.OperationStraight; isSidewaysExtending = !isSidewaysExtending; isStraightExtending = !isStraightExtending; elapsedTime = 0.0; } break; case EDrillState.FinishVertical: SetDrillsState(false); if (MovePistonGroup(EPistonGroupType.Vertical, -Math.Abs(guideSpeed))) { drillState = EDrillState.FinishSideways; } break; case EDrillState.FinishSideways: SetDrillsState(false); if (MovePistonGroup(EPistonGroupType.Sideways, -Math.Abs(guideSpeed))) { drillState = EDrillState.FinishStraight; } break; case EDrillState.FinishStraight: SetDrillsState(false); if (MovePistonGroup(EPistonGroupType.Straight, -Math.Abs(guideSpeed))) { drillState = EDrillState.Nothing; isStraightExtending = true; isSidewaysExtending = true; } break; } }