/// <summary> /// Initializes transition to new arm mode /// </summary> /// <param name="newMode"></param> public void SetArmMode(ArmMode newMode) { IsTransitioning = true; ArmMode oldMode = new ArmMode( ValueHolder[(int)ArduinoValues.ArmRotator], ValueHolder[(int)ArduinoValues.ArmShoulder], ValueHolder[(int)ArduinoValues.ArmElbow], ValueHolder[(int)ArduinoValues.ArmWrist], ValueHolder[(int)ArduinoValues.ArmGrabber] ); new Thread(() => { TransitionArmMode(oldMode, newMode); IsTransitioning = false; }).Start(); }
/// <summary> /// Transitions to new arm mode using recursion /// </summary> /// <param name="oldMode"></param> /// <param name="newMode"></param> /// <param name="currentTime"></param> private void TransitionArmMode(ArmMode oldMode, ArmMode newMode, double currentTime = 0.0) { double transitionConstant = currentTime / Config.ModeTransitionDuration; bool finalTransition = false; if (transitionConstant > 1) { transitionConstant = 1; finalTransition = true; } ValueHolder[(int)ArduinoValues.ArmRotator] = LinearTransition(transitionConstant, oldMode.RotatorAngle, newMode.RotatorAngle); ValueHolder[(int)ArduinoValues.ArmShoulder] = LinearTransition(transitionConstant, oldMode.ShoulderAngle, newMode.ShoulderAngle); ValueHolder[(int)ArduinoValues.ArmElbow] = LinearTransition(transitionConstant, oldMode.ElbowAngle, newMode.ElbowAngle); ValueHolder[(int)ArduinoValues.ArmWrist] = LinearTransition(transitionConstant, oldMode.WristAngle, newMode.WristAngle); ValueHolder[(int)ArduinoValues.ArmGrabber] = LinearTransition(transitionConstant, oldMode.GrabberAngle, newMode.GrabberAngle); Thread.Sleep(Config.ModeTransitionDelay); if (!finalTransition) { TransitionArmMode(oldMode, newMode, currentTime + Config.ModeTransitionDelay); } }